Я ищу, чтобы адаптировать 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 сделать тяжелую работу по перемещению всего для меня.
Вы когда-нибудь это понимали? – user3344977