AV_SAMPLE_FMT_S16P 和 AV_SAMPLE_FMT_S16 有啥区别?

Posted

技术标签:

【中文标题】AV_SAMPLE_FMT_S16P 和 AV_SAMPLE_FMT_S16 有啥区别?【英文标题】:What is the difference between AV_SAMPLE_FMT_S16P and AV_SAMPLE_FMT_S16?AV_SAMPLE_FMT_S16P 和 AV_SAMPLE_FMT_S16 有什么区别? 【发布时间】:2013-09-24 04:50:36 【问题描述】:

当您从 AV_SAMPLE_FMT_S16P 转换为 AV_SAMPLE_FMT_S16 时会发生什么? AVFrame 结构如何包含平面和非平面数据?

【问题讨论】:

【参考方案1】:

AV_SAMPLE_FMT_S16P 是平面有符号的 16 位音频,即每个样本 2 个字节,AV_SAMPLE_FMT_S16 相同。

唯一的区别在于AV_SAMPLE_FMT_S16 每个通道的样本是交错的,即如果您有两个通道音频,那么样本缓冲区将如下所示

c1 c2 c1 c2 c1 c2 c1 c2...

其中c1 是通道1 的样本,c2 是通道2 的样本。

而对于一帧平面音频,您将拥有类似

c1 c1 c1 c1 .... c2 c2 c2 c2 ..


现在它是如何存储在 AVFrame 中的:

对于平面音频:

data[i] 将包含通道 i 的数据(假设通道 0 是第一个通道)。

但是,如果您的频道多于 8 个,则其余频道的数据可以在 AVFrame 的扩展数据属性中找到。

用于非平面音频

data[0] 将以交错的方式包含所有通道的数据。

【讨论】:

如果音频数据以非平面格式存储在 data[0] 中,这是否意味着我们必须一次读取 16/24 位的数组索引,直到 NULL?就像,每个样本都没有自己的数组索引,每个索引都与一个通道相关联,而不是?所以这只是一个长长的样本列表...... 我假设c1 c1 c2 c2 必须引用缓冲区中的字节,而不是样本。应该将其更改为 c1 c2 c1 c2 以获取示例,或者将文本更新为字节。 感谢您的回答。几天来,我一直在努力通过 CMBlockBufferCreation 创建 FFmpegs 音频数据和 CMSampleBuffer。你的回答是我需要的突破。是否可以多次投票给答案,我会投票给 Inf+。【参考方案2】:

AV_SAMPLE_FMT_S16P 中的数据位于 decoded_frame->extended_data 中,而 AV_SAMPLE_FMT_S16 中的数据位于 decoded_frame->data 中

AV_SAMPLE_FMT_S16P 中的数据是平面的

AV_SAMPLE_FMT_S16 中的数据是交错的,我想你知道是什么意思。

示例代码可在基于 Sourceforge Libav 的软件中获得

【讨论】:

以上是关于AV_SAMPLE_FMT_S16P 和 AV_SAMPLE_FMT_S16 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

音频的基础知识参数分析

FFMPEG 音频解码和绘制波形

AAC 音频解码类

基于FFmpeg的视频播放器之七:音频解码

从 AAC 转换后 FFmpeg 播放音频缓慢

swift 密码由6-16数字和字母组合组成