Я пытаюсь адаптировать 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 тяжелой работой по чередованию всего для меня.