Создание звуковой дорожки с белым шумом с использованием AVAssetWriter - PullRequest
4 голосов
/ 01 ноября 2011

В настоящее время я использую AVAssetWriter для создания QuickTime Mov.Видеодорожка генерируется правильно.Теперь я хотел бы добавить «мусорную» звуковую дорожку mp4a.Звук может быть просто белым шумом.В основном меня интересует файл mov, содержащий и видео и аудио дорожки.

Как мне настроить CMSampleBufferRef, который просто содержит белый шум в формате mp4a?Вот что я пробовал до сих пор:

CMSampleBufferRef garbageAudioSampleBuffer = NULL;

AudioStreamBasicDescription audioFormat;
audioFormat.mSampleRate = 44100;
audioFormat.mFormatID   = kAudioFormatLinearPCM;
audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
audioFormat.mFramesPerPacket = 1;
audioFormat.mChannelsPerFrame = 2;
audioFormat.mBitsPerChannel = 16;
audioFormat.mBytesPerPacket = 4;            
audioFormat.mBytesPerFrame = 4;

CMAudioFormatDescriptionRef audioFormatDescrip = NULL;
CMAudioFormatDescriptionCreate(kCFAllocatorDefault, 
                               &audioFormat, 
                               0, 
                               NULL,
                               0, 
                               NULL, 
                               NULL, 
                               &audioFormatDescrip
                               );

CMSampleBufferCreate(kCFAllocatorDefault, 
                     NULL,
                     YES, 
                     NULL, 
                     NULL, 
                     NULL, // audioFormatDescrip,
                     0,
                     0, 
                     NULL, 
                     0, 
                     NULL, 
                     &garbageAudioSampleBuffer
                     );

if(myAVAssetAudioWriterInput isReadyForMoreMediaData)
    [myAVAssetAudioWriterInput appendSampleBuffer:garbageAudioSampleBuffer];

Когда передается NULL для audioFormatDescrip, файл mov генерируется успешно, но содержит только видео дорожку (и без звуковой дорожки).Когда я фактически передаю audioFormatDescrip, файл mov кажется поврежденным.Я, вероятно, должен на самом деле передать некоторые образцы, но я не уверен, как.

Примечание: я проверил, что appendSampleBuffer возвращает YES (для краткости я пропустил этот код).

1 Ответ

3 голосов
/ 01 ноября 2011

В вашем коде куча проблем:

  1. Белый шум имеет статистическое определение, вы создаете неопределенный шум.
  2. Вы не передаете описание AudioFormat для CMSampleBufferCreate
  3. Вы усложняете свою жизнь, используя CMSampleBufferCreate вместо CMAudioSampleBufferCreateWithPacketDescription (у вас нет описаний пакетов, поэтому просто введите ноль & 0)
  4. Вы должны сказать , когда ваш аудиобуфер с отметкой времени презентации
  5. Ваш аудио буфер имеет длину 0 кадров. Это слишком коротко.
  6. и, наконец, вам нужно продолжать добавлять звуковые буферы, которых хватит на весь фильм

Код CoreMedia может быть сложным, потому что есть сотни аргументов, которые должны быть правильными. Для ваших целей это может быть немного слишком общим, так почему бы не получить зацикленный фрагмент белого шума и собрать его с помощью AVMutableComposition? Это даст вам фильм и аудиофайл, которые вы можете затем сжать вместе, используя другую AVMutableComposition и AVAssetExportSession.

...