Синхронизация звука и изображения между двумя игроками - PullRequest
0 голосов
/ 09 октября 2018

Я создаю приложение для караоке с возможностью пения с видео, поэтому вот моя проблема: я записываю пользовательское видео (видео только с фронтальной камеры) вместе с применением голосовых фильтров с аудиокитами к отдельной аудиозаписи.Теперь в моем воспроизведении я хочу воспроизвести видео и аудио в режиме синхронизации, но это не удалось, потому что есть синхронизация видео и аудио.Я использую akplayer для аудио, поэтому я могу применять голосовой мод и vlckit для воспроизведения видео пользователя.

         do {

        //MARK: VLC kit part of the video setup
        Vlc_VideoPlayer = VLCMediaPlayer()

        Vlc_VideoPlayer.media = VLCMedia(url: recordVideoURL)
        Vlc_VideoPlayer.addObserver(self, forKeyPath: "time", options: [], context: nil)
        Vlc_VideoPlayer.addObserver(self, forKeyPath: "remainingTime", options: [], context: nil)

        Vlc_VideoPlayer.drawable = self.CameraView

        //MARK: Audiokit with AKPlayer Setup

        file = try AKAudioFile(forReading: recordVoiceURL)
        player =  AKPlayer(audioFile: file)
        self.player.preroll()
        delay = AKVariableDelay(player)
        delay.rampTime = 0.5
        delayMixer = AKDryWetMixer(player, delay)

        reverb = AKCostelloReverb(delayMixer)
        reverbMixer = AKDryWetMixer(delayMixer, reverb)
        booster = AKBooster(reverbMixer)
        tracker = AKAmplitudeTracker(booster)
        AudioKit.output = tracker
        try AudioKit.start()
        }catch{
        print (error)
              }
        self.startPlayers()

теперь функция startPlayers:

func startPlayers(){
    DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
        if AudioKit.engine.isRunning {


                self.Vlc_VideoPlayer.audio.isMuted = true
                self.Vlc_VideoPlayer.play()



            self.player.isLooping = false
            self.player.play()




        }else{
            self.startPlayers()
        }
    }

    }

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Я ничего не знаю о проигрывателе VLC, но с помощью встроенного AVPlayer есть возможность синхронизации с часами:

var time: TimeInterval = 1 // 1 second in the future

videoPlayer.masterClock = CMClockGetHostTimeClock()

let hostTime = mach_absolute_time()

let cmHostTime = CMClockMakeHostTimeFromSystemUnits(hostTime)
let cmVTime = CMTimeMakeWithSeconds(time, preferredTimescale: videoPlayer.currentTime().timescale)
let futureTime = CMTimeAdd(cmHostTime, cmVTime)
videoPlayer.setRate(1, time: CMTime.invalid, atHostTime: futureTime)

Затем AKPlayer поддерживает синхронизацию с mach_absolute_time () hostTime, используяего функции планирования.Как вы уже сказали выше, они начнут сближаться, но никакой синхронизации не гарантируется.

0 голосов
/ 10 октября 2018

Попытка запустить два плеера сработает из чистого вида, и если у вас нет средств для синхронизации воспроизведения после его запуска, оно не будет идеальным.В идеале, вы должны воспроизводить звук также с помощью VLC, чтобы использовать его инструменты внутренней синхронизации.

Чтобы повторить то, что у вас есть сейчас, я бы предложил начать воспроизведение с VLC, пока он не декодирует первый кадр,пауза, начать аудио и продолжить воспроизведение с VLC, как только вы декодируете первый аудио образец.Это все еще не будет идеально, но, вероятно, лучше.

...