4

我目前正在使用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为 audioFormatDescript 传递时,mov 文件已成功生成,但仅包含一个视频轨道(并且没有音轨)。当我实际传递 audioFormatDescript 时,mov 文件似乎已损坏。我可能实际上必须通过一些样本,但我不确定如何。

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

4

1 回答 1

3

您的代码中有很多问题:

  1. 白噪声具有统计定义,您正在创建未定义的噪声。
  2. 您没有将 audioFormatDescription 传递给 CMSampleBufferCreate
  3. 您使用 CMSampleBufferCreate 而不是 CMAudioSampleBufferCreateWithPacketDescriptions 使您的生活复杂化(您没有数据包描述,所以只是过去 null & 0)
  4. 您需要说明您的音频缓冲区何时带有演示时间戳
  5. 您的音频缓冲区长度为 0 帧。那太短了。
  6. 最后,您需要继续添加音频缓冲区,足以满足您电影的整个持续时间

CoreMedia 代码可能很棘手,因为有数百个参数需要恰到好处。出于您的目的,它可能有点过于笼统,那么为什么不获取一个可循环的白噪声片段并使用 AVMutableComposition 进行组装呢?这将为您提供电影和音频文件,然后您可以使用另一个 AVMutableComposition 和 AVAssetExportSession 将它们压缩在一起。

于 2011-11-01T13:30:14.903 回答