AVFrame的原始音频是否与LPCM相同?相关解码编码疑问
FFmpeg AVFrame音频数据相关问题解答
1. AVFrame中的音频采样格式
解码后得到的AVFrame里的音频采样是原始PCM格式,具体格式由解码器输出的sample_fmt字段定义(比如AV_SAMPLE_FMT_S16、AV_SAMPLE_FMT_FLT这类),不是固定的某一种LPCM,但本质都属于PCM范畴——LPCM(线性脉冲编码调制)是PCM的一个子类,FFmpeg解码输出的PCM基本都是线性的,和标准LPCM的采样逻辑完全一致,只是位深、浮点/整数类型可能有区别。
2. 解码后的AVFrame音频是否与原编码格式无关
没错,只要解码后AVFrame的采样率、采样格式、声道数等参数一致,不管原编码是MP3、AAC、FLAC还是其他格式,最终得到的AVFrame音频数据都是标准化的原始PCM,和原编码的压缩算法彻底无关。
3. 为何要用pcm_f32le等PCM编码器把AVFrame转成AVPacket
核心原因有两个:
- 适配文件写入API:
av_interleaved_write_frame()这类写入函数只认封装后的AVPacket,没法直接写入AVFrame。PCM编码器的作用就是把原始PCM帧打包成符合AVPacket格式的结构,让数据能被写入到WAV这类媒体文件里。 - 补充封装元数据:AVFrame里只有纯原始采样数据,没有封装需要的元数据(比如时间戳、流索引);而AVPacket包含这些必要信息,PCM编码器会给原始PCM加上这些元数据,生成符合规范的AVPacket,才能完成文件写入流程。另外,编码后的AVPacket内部的原始采样数据和AVFrame里的是完全一致的,只是多了封装层的信息。
内容的提问来源于stack exchange,提问作者CheekyChips
相关产品推荐
相关产品推荐

