Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "lib.h"
- #include <unordered_map>
- #include <set>
- using namespace std;
- using namespace Mlt;
- /// Gets multiple, previously linked and synced assets
- /// Joins all audio together, but focuses only the video tracks whose audio track is more active
- Mlt::Consumer *podcast_mix(std::vector<Mlt::Tractor> tractors, PodcastConfiguration config) {
- auto profile = Mlt::Profile();
- auto playlist = Mlt::Playlist();
- // {
- // sample number 0: [
- // (track1, average 1dB),
- // (track2, average 0dB)
- // ],
- // sample number 1: [...]
- // }
- std::unordered_map<int, std::vector<std::set<Mlt::Track, int>>> tracksSamplesAverages();
- auto i = 0;
- for (auto& tractor : tractors) {
- // Incorrect code. Just for reference. This should be get_track()
- // But how am I supposed to get the audio and video specifically and not just get_track(someInteger)?
- auto audio = tractor.get_audio_track();
- auto video = tractor.get_video_track();
- // This code would divide audio in provided-second length (default: 0.5sec)
- // And writes video accordingly
- auto audio_samples = audio.divide(config.sampleRate);
- auto video_samples = audio.divide(config.sampleRate);
- auto j = 0;
- for (auto& audio_sample : audio_samples) {
- tracksSamplesAverages[i].add(
- (audio_sample, calculate_average_db(&audio_sample))
- );
- j++;
- }
- i++;
- }
- // Write video
- // Sort hashmap
- for (auto& sample : tracksSamplesAverages) {
- // Sort tracks by average db
- auto track = std::sort(std::map(sample, [_, db] db));
- // Get biggest dB value
- auto video_track = tractors[track[0]].get_video_track();
- playlist.add(video_track);
- }
- // Finally, "join" all audio tracks together
- playlist.add(std::map(tractors, |tractor| tractor.get_audio_track()));
- // Connect to Consumer and return
- auto consumer = Mlt::Factory::consumer(profile, nullptr, nullptr);
- consumer.connect(playlist);
- return consumer;
- };
Advertisement
Add Comment
Please, Sign In to add comment