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

Медиаэффекты и обработка в реальном времени WWDC2012 во время сеанса воспроизведения объясняет, как синхронизировать AVPlayer с пользовательским звуком.Перефразируя, вы

  1. одновременно начинаете воспроизведение AVPlayer и пользовательского аудио
  2. , воспроизводите оба с одинаковой скоростью

Первая частьдостигается путем заливки AVPlayer с prerollAtRate:completionHandler:, поэтому воспроизведение может быть начато с «минимальной задержкой», а вторая часть - с помощью AVPlayer для использования iOS Audio Clock.

Фрагмент кода предполагает, что вы вычислили будущее время хоста, которое вы ожидаете, когда звук ударяет по громкоговорителю (буквально эта последняя фраза, кажется, подразумевает высшее всеведение, поэтому давайте просто прочитаем ее как ваше [желательно] аудио начало хоста).

CMClockRef audioClock = NULL;
OSStatus err = CMAudioClockCreate(kCFAllocatorDefault, &audioClock);
if (err == noErr) {
    [myPlayer setMasterClock:audioClock];
    [myPlayer prerollAtRate:1.0 completionHandler:^(BOOL finished){
        if (finished) {
            // Calculate future host time here
            [myPlayer setRate:1.0 time:newItemTime atHostTime:hostTime];
        } else {
            // Preroll interrupted or cancelled
        }
    }];
}

Это небольшой объем кода, но он вызывает так много вопросов.Что произойдет, если преролл currentTime и newItemTime не согласятся?Разве видео и аудио не воспроизводятся с одинаковой скоростью в одну секунду в секунду?Так не должны ли их часы быть одинаковыми?Разве 48 кГц не делят 60 кадров в секунду?Каким образом код должен знать только желаемое время начала и никаких других подробностей моего аудиокода?Это из-за одного iOS Audio Clock?Является ли этот API гениальным или ужасной неортогональной мешаниной, которая плохо сочетается с другими функциями AVFoundation?

Несмотря на мои сомнения, код работает, но я хочу бесшовно зацикливаться видео и аудио на заказ.Вопрос в том, как?

Я не могу предварительно воспроизвести игру AVPlayer, потому что это происходит с currentTime (и игрок не хотел бы менять буферы во время игры).Может быть, чередующаяся пара предварительно свернутых AVPlayer с?AVPlayerLooper звучит многообещающе.На самом деле это не AVPlayer, но он включает AVQueuePlayer (что есть).Предполагая, что предварительная обработка работает на AVQueuePlayer, и я уделяю особое внимание зацикливанию пользовательского звука, тогда это может сработать.В противном случае, я думаю, что единственная оставшаяся опция - это сбросить предварительную прокрутку и вставить видео и пользовательский звук в аудио-сигнал в пределах AVComposition, который будет зациклен с помощью AVPlayerLooper.

...