0

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

Мне нужно захватить видео с передней камеры и объединить это со звуком, который я получаю от 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 сделать тяжелую работу по перемещению всего для меня.

+0

Вы когда-нибудь это понимали? – user3344977

ответ

0

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

+0

Можете ли вы дать мне несколько советов о том, как это сделать? Когда вы говорите обратный вызов, вы имеете в виду инициализацию с помощью «requestMediaDataWhenReadyOnQueue: usingBlock:» или просто с помощью «appendSampleBuffer:»? – patcoll

 Смежные вопросы

  • Нет связанных вопросов^_^