gpt4 book ai didi

ios - 使用AudioConverter将PCM转换为AAC并使用AVAssetWriter写入.mp4文件时,音频失真

转载 作者:行者123 更新时间:2023-12-02 23:27:51 25 4
gpt4 key购买 nike

我正在尝试压缩AVCaptureSession的输入并将其保存到.mp4文件。我设法转换并保存了视频,但音频遇到了麻烦。

我已经达到了使用https://github.com/nevyn/LBMediaToolkit转换音频的地步。我可以将转换后的CMSampleBuffer保存为.mp4,但是当我在iPhone上播放它时,音频声音会失真。

奇怪的是,在QuickTime中播放时,音频听起来也会失真,但是在通过Web浏览器播放时,声音听起来不错。单击here以下载示例文件。

我认为我正在将正确的格式传递给转换器:

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中的说明重现问题)

有什么明显的我做错的事情导致音频听起来失真吗?

最佳答案

原来,罪魁祸首是以下代码:

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创建格式描述时,我应该仅将magicCookie添加到第一个示例缓冲区 中,或者甚至应该将其发送到根本没有数据的示例缓冲区中。

如果我这样做,则音频不会失真,mp4文件容器中只有一个esds原子。

关于ios - 使用AudioConverter将PCM转换为AAC并使用AVAssetWriter写入.mp4文件时,音频失真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59810752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com