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 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章