使用AVAssetWriter创建白噪声音轨

时间:2011-10-31 21:59:37

标签: ios video quicktime avassetwriter mp4a

我目前正在使用AVAssetWriter来生成Quicktime mov。视频轨道正确生成。现在我想添加一个“垃圾”mp4a音轨。音频可能只是白噪声。我主要关注的是包含两个视频和音轨的mov文件。

如何设置仅包含mp4a格式的白噪声的CMSampleBufferRef?这是我到目前为止所尝试的内容:

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];

当为audioFormatDescrip传递NULL时,mov文件成功生成但仅包含视频轨道(并且没有音频轨道)。当我实际传递audioFormatDescrip时,mov文件似乎已损坏。我可能不得不实际传递一些样本,但我不确定如何。

注意:我已经确认appendSampleBuffer返回YES(为简洁起见,我省略了该代码)。

1 个答案:

答案 0 :(得分:3)

您的代码中存在许多问题:

  1. 白噪声具有统计定义,您正在创建未定义的噪音。
  2. 您没有将audioFormatDescription传递给CMSampleBufferCreate
  3. 使用CMSampleBufferCreate而不是CMAudioSampleBufferCreateWithPacketDescriptions(你没有数据包描述,所以只是过零和0),你的生活变得复杂。
  4. 当您的音频缓冲区带有演示时间戳
  5. 时,您需要说
  6. 您的音频缓冲区长度为0帧。那太短了。
  7. 最后,你需要不断添加音频缓冲区,足以影响整部电影
  8. CoreMedia代码可能很棘手,因为有数百个参数需要恰到好处。为了你的目的,它可能有点过于笼统,那么为什么不得到一个可循环的白噪声片段并使用AVMutableComposition组装它?这将给你一个电影&和一个音频文件,然后您可以使用另一个AVMutableComposition和AVAssetExportSession压缩在一起。