Искаженный звук при преобразовании PCM в AA C с использованием AudioConverter и записи в файл .mp4 с помощью AVAssetWriter - PullRequest
1 голос
/ 19 января 2020

Я пытаюсь сжать ввод из AVCaptureSession и сохранить его в файл .mp4. Мне удалось преобразовать и сохранить видео, но у меня возникли проблемы со звуком.

Я достиг точки, в которой я использую https://github.com/nevyn/LBMediaToolkit для преобразования звука. Я могу сохранить преобразованный CMSampleBuffer в .mp4, но при воспроизведении его на iPhone звук искажается.

Странно то, что при воспроизведении в QuickTime звук также искажается, но при воспроизведении через веб-браузер звучит нормально. Нажмите здесь , чтобы загрузить образец файла.

Я думаю, что передаю конвертеру правильный формат:

let asbd = AudioStreamBasicDescription(
    mSampleRate: 44_100,
    mFormatID: kAudioFormatMPEG4AAC,
    mFormatFlags: UInt32(MPEG4ObjectID.AAC_LC.rawValue),
    mBytesPerPacket: 0,
    mFramesPerPacket: 1024,
    mBytesPerFrame: 0,
    mChannelsPerFrame: 2,
    mBitsPerChannel: 0,
    mReserved: 0)

return LBAudioConverter(convertingTo: asbd)

Я не уверен, что это проблема с преобразованием звука или записью файла. Вот ссылка на пример проекта только с аудио: https://github.com/gaperlinski/AudioConversion (следуйте инструкциям в README.MD, чтобы воспроизвести проблему)

Есть ли что-то очевидное, что я делаю неправильно? звук искажается?

1 Ответ

0 голосов
/ 30 января 2020

Оказывается, виновником был следующий код:

UInt32 cookieSize = 0;
char cookie[cookieSize];

AudioConverterGetPropertyInfo(_converter, kAudioConverterCompressionMagicCookie, &cookieSize, NULL);
AudioConverterGetProperty(_converter, kAudioConverterCompressionMagicCookie, &cookieSize, cookie);

CMAudioFormatDescriptionRef audioFormat;
const OSStatus formatCreationError = CMAudioFormatDescriptionCreate(
    kCFAllocatorDefault,
    &_toFormat,
    0, NULL, // layout
    cookieSize, cookie, // cookie
    NULL, // extensions
    &audioFormat);
if(formatCreationError != noErr) {
    NSLog(@"Failed to convert a buffer because format creation failed: %d", (int)formatCreationError);
    continue;
}

Я заметил, что когда я создаю описание формата для CMSampleBuffer, я должен добавить magicCook ie только к первый буфер выборок , или, возможно, его следует отправлять даже в буфер выборок без данных вообще.

Если я делаю это таким образом, в аудио нет искажений, и в контейнере файла mp4 есть только один атом esds.

...