AVAssetWriterInput возможно для живого аудио через Core Audio? - PullRequest
0 голосов
/ 16 февраля 2012

Я пытаюсь адаптировать AVFoundation к тому, что кажется возможным, но я не могу найти поддержки или примеров для моего сценария.

Мне нужно взять видео с фронтальной камеры и объединить его со звуком, полученным из Core Audio.

У меня есть работающий код, который решает обычный случай захвата видео с камеры и объединения его со звуком с микрофона, и это прекрасно работает. Это в основном адаптировано из примера кода RosyWriter Apple.

Однако я не могу найти какой-либо способ использовать живой поток аудио, исходящий из Core Audio, создать из него AVAssetWriterInput и добавить его в качестве входных данных в мой AVCaptureSession. Все ресурсы, которые я нахожу связанными с настройкой AVCaptureInput и AVAssetWriterInput, вращаются вокруг их инициализации с помощью устройств и захвата мультимедиа с устройств в режиме реального времени - однако я не пытаюсь получить звук с устройства.

Есть ли способ создать AVCaptureInput, сказать ему ожидать данные в определенном формате ASBD, а затем передать ему эти данные из моих обратных вызовов Core Audio? Я не хочу записывать данные на диск, а затем читать их с диска - я подозреваю, что это будет очень медленно. Кажется, должно быть решение, но я не могу его найти.

Достаточно сказать, что у меня есть код, который создает CMSampleBuffers из объектов AudioBufferList, которые я использую для содержания аудио. Я проверил CMSampleBuffers, и они, кажется, содержат действительные кадры данных, но когда я отправляю эти данные обратно в мой измененный RosyWriterViewProcessor «writeSampleBuffer: ofType:», кажется, что он пишет правильно (я не получаю ошибок), но когда я открываю видео файл, когда он готов, я вижу только видео и не слышу звука.

У кого-нибудь есть советы о том, как выполнить то, что я пытаюсь сделать?

Вот стандартный ASBD, который я использовал повсюду:

AudioStreamBasicDescription audioDescription;
memset(&audioDescription, 0, sizeof(audioDescription));
audioDescription.mFormatID          = kAudioFormatLinearPCM;
audioDescription.mFormatFlags       = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked | kAudioFormatFlagsNativeEndian;
audioDescription.mChannelsPerFrame  = 2;
audioDescription.mBytesPerPacket    = sizeof(SInt16)*audioDescription.mChannelsPerFrame;
audioDescription.mFramesPerPacket   = 1;
audioDescription.mBytesPerFrame     = sizeof(SInt16)*audioDescription.mChannelsPerFrame;
audioDescription.mBitsPerChannel    = 8 * sizeof(SInt16);
audioDescription.mSampleRate        = 44100.0;

За исключением решения, у меня есть отдельные видео- и аудиофайлы, которые, я думаю, я мог бы соединить вместе с помощью AVComposition, но я бы не стал идти по этому пути, поскольку мои видео- и аудиофайлы регулярно имеют разную длину, и я не хочу битва, растягивающая ту или иную дорожку только для того, чтобы соединить их вместе - это может даже не оказаться синхронизированным! Я предпочел бы настроить все в AVCaptureSession и сделать AVFoundation тяжелой работой по чередованию всего для меня.

1 Ответ

0 голосов
/ 16 февраля 2012

Попробуйте создать действительный ввод средства записи ресурсов, используя необработанный формат PCM, но в режиме обратного вызова, отбрасывая данные с этого входа и подставляя равную длину данных из буферов, сохраненных из выходных данных, созданных вашим аудиоустройством.

...