AV_SAMPLE_FMT_S16P和AV_SAMPLE_FMT_S16有什么区别?

时间:2013-09-19 07:48:16

标签: audio ffmpeg transcoding libav

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

2 个答案:

答案 0 :(得分:36)

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

唯一的区别是每个通道的AV_SAMPLE_FMT_S16个样本都是交错的,即如果你有两个通道音频,则样本缓冲区看起来像

  

c1 c1 c2 c2 c1 c1 c2 c2 ...

其中c1是channel1的示例,c2是channel2的示例。

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

的内容
  

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


现在如何将其存储在AVFrame中:

  • 用于平面音频:

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

但是如果你有多于8的频道,那么可以在AVFrame的extended_data属性中找到其余频道的数据。

  • 用于非平面音频

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

答案 1 :(得分:0)

  • AV_SAMPLE_FMT_S16P中,数据来自解码帧-> extended_data,而在AV_SAMPLE_FMT_S16中,数据来自解码帧->数据

  • AV_SAMPLE_FMT_S16P中,数据是平面的

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

基于Sourceforge Libav的软件中提供了示例代码