【问题标题】:Creating a white noise audio track using AVAssetWriter使用 AVAssetWriter 创建白噪声音轨
【发布时间】:2011-10-31 21:59:36
【问题描述】:

我目前正在使用AVAssetWriter 来生成 Quicktime mov。视频轨道生成正确。现在我想添加一个“垃圾”mp4a 音轨。音频可能只是白噪声。我主要关心的是包含 both 视频和音频轨道的 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];

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

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

【问题讨论】:

    标签: ios video quicktime avassetwriter mp4a


    【解决方案1】:

    你的代码有一堆问题:

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

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

    【讨论】:

    • 好点!我会修好那些。 CMAudioSampleBufferCreateWithPacketDescriptions 听起来很有希望。
    • 您是否设法通过使用音频写入多个缓冲区来使其工作?我对此有一些问题:stackoverflow.com/questions/12187124/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    相关资源
    最近更新 更多