javaee论坛

普通会员

225648

帖子

344

回复

358

积分

楼主
发表于 2017-06-08 10:59:27 | 查看: 1083 | 回复: 1

FFmpeg关于nb_smples,frame_size以及profile的解释


原来一直记得固定编码格式需要固定的sample,例如下面:

1) AAC:
nb_samples和frame_size = 1024
一帧数据量:1024*2*av_get_bytes_per_sample(s16) = 4096个字节。
会编码:88200/(1024*2*av_get_bytes_per_sample(s16)) = 21.5帧数据
2) MP3:
nb_samples和frame_size = 1152
一帧数据量:1152*2*av_get_bytes_per_sample(s16) = 4608个字节。
MP3:则会编码:88200/(1152*2*av_get_bytes_per_sample(s16)) = 19.1帧数据


但最近发现AAC编码的音频nb_sampes和frame_size,nb_samplse是avframe中的,frame_szie是AVCodecContext中的,有可能出现2048的情况,一直以为是样本是分片planner例如AV_SAMPLE_FMT_FLT,AV_SAMPLE_FMT_FLTP这些导致,但后来发现无关。aac编码中感谢网友摘录了一些注释,如下:

< code_snippet_id="2008025" snippet_file_name="blog_20161125_1_4322463" code_snippet_id="2008025" snippet_file_name="blog_20161125_1_4322463" name="code" class="cpp">/*A HE-AAC v1 or v2 audio frame contains 2048 PCM samples per channel (there isalso one mode with 1920 samples per channel but this is only for special purposessuch as DAB+ digital radio).These bits/frame figures are average figures where each AAC frame generally has a differentsize in bytes. To calculate the same for AAC-LC just use 1024 instead of 2048 PCM samples perframe and channel.For AAC-LD/ELD it is either 480 or 512 PCM samples per frame and channel.*/从中会发现 当aac编码级别是LC时frame_size 和nb_samples是1024,如果是HE的时候是2048。

其种标记在ffmpeg中是AVCodecContext中的profile:

< code_snippet_id="2008025" snippet_file_name="blog_20161125_2_4955318" code_snippet_id="2008025" snippet_file_name="blog_20161125_2_4955318" name="code" class="cpp"> /** * profile * - encoding: Set by user. * - decoding: Set by libavcodec. */ int profile;#define FF_PROFILE_UNKNOWN -99#define FF_PROFILE_RESERVED -100#define FF_PROFILE_AAC_MAIN 0#define FF_PROFILE_AAC_LOW 1#define FF_PROFILE_AAC_SSR 2#define FF_PROFILE_AAC_LTP 3#define FF_PROFILE_AAC_HE 4#define FF_PROFILE_AAC_HE_V2 28#define FF_PROFILE_AAC_LD 22#define FF_PROFILE_AAC_ELD 38#define FF_PROFILE_MPEG2_AAC_LOW 128#define FF_PROFILE_MPEG2_AAC_HE 131#define FF_PROFILE_DTS 20#define FF_PROFILE_DTS_ES 30#define FF_PROFILE_DTS_96_24 40#define FF_PROFILE_DTS_HD_HRA 50#define FF_PROFILE_DTS_HD_MA 60#define FF_PROFILE_MPEG2_422 0#define FF_PROFILE_MPEG2_HIGH 1#define FF_PROFILE_MPEG2_SS 2#define FF_PROFILE_MPEG2_SNR_SCALABLE 3#define FF_PROFILE_MPEG2_MAIN 4#define FF_PROFILE_MPEG2_SIMPLE 5#define FF_PROFILE_H264_CONSTRAINED (1<<9) // 8+1; constraint_set1_flag#define FF_PROFILE_H264_INTRA (1<<11) // 8+3; constraint_set3_flag#define FF_PROFILE_H264_BASELINE 66#define FF_PROFILE_H264_CONSTRAINED_BASELINE (66|FF_PROFILE_H264_CONSTRAINED)#define FF_PROFILE_H264_MAIN 77#define FF_PROFILE_H264_EXTENDED 88#define FF_PROFILE_H264_HIGH 100#define FF_PROFILE_H264_HIGH_10 110#define FF_PROFILE_H264_HIGH_10_INTRA (110|FF_PROFILE_H264_INTRA)#define FF_PROFILE_H264_HIGH_422 122#define FF_PROFILE_H264_HIGH_422_INTRA (122|FF_PROFILE_H264_INTRA)#define FF_PROFILE_H264_HIGH_444 144#define FF_PROFILE_H264_HIGH_444_PREDICTIVE 244#define FF_PROFILE_H264_HIGH_444_INTRA (244|FF_PROFILE_H264_INTRA)#define FF_PROFILE_H264_CAVLC_444 44#define FF_PROFILE_VC1_SIMPLE 0#define FF_PROFILE_VC1_MAIN 1#define FF_PROFILE_VC1_COMPLEX 2#define FF_PROFILE_VC1_ADVANCED 3#define FF_PROFILE_MPEG4_SIMPLE 0#define FF_PROFILE_MPEG4_SIMPLE_SCALABLE 1#define FF_PROFILE_MPEG4_CORE 2#define FF_PROFILE_MPEG4_MAIN 3#define FF_PROFILE_MPEG4_N_BIT 4#define FF_PROFILE_MPEG4_SCALABLE_TEXTURE 5#define FF_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION 6#define FF_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE 7#define FF_PROFILE_MPEG4_HYBRID 8#define FF_PROFILE_MPEG4_ADVANCED_REAL_TIME 9#define FF_PROFILE_MPEG4_CORE_SCALABLE 10#define FF_PROFILE_MPEG4_ADVANCED_CODING 11#define FF_PROFILE_MPEG4_ADVANCED_CORE 12#define FF_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE 13#define FF_PROFILE_MPEG4_SIMPLE_STUDIO 14#define FF_PROFILE_MPEG4_ADVANCED_SIMPLE 15#define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_0 0#define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_1 1#define FF_PROFILE_JPEG2000_CSTREAM_NO_RESTRICTION 2#define FF_PROFILE_JPEG2000_DCINEMA_2K 3#define FF_PROFILE_JPEG2000_DCINEMA_4K 4 


< code_snippet_id="2008025" snippet_file_name="blog_20161125_3_4545572" name="code" class="cpp">//这里的最后一个参数一定要注意用pInputFrame->nb_samples* per_sample_in,以AAC举例子,AVCodecContext中的profile会有LC,HE等不同,//nb_samples在LC的时候是1024,在HE的时候是2048。如果不填写对会影响音频数据,nb_samples和AVCodecContext中的frame_size相同。ret = avcodec_fill_audio_frame(pInputFrame,Channel_in,SampleFormat_in,buf_in,buf_size_in,pInputFrame->nb_samples* per_sample_in);

自此,frame_size,nb_samples,profile之间的关系可以理清楚了,关于mp3的只发现过1152的,如果有其他再记录。


如有错误请指正:

交流请加QQ群:62054820
QQ:379969650.




普通会员

0

帖子

310

回复

334

积分
沙发
发表于 2022-12-16 11:53:41

我最喜欢回复人少的贴子了,如果贴子沉了,我就会觉得是自己弄沉的,非常有成就感!如果贴子火了,那我有占了前排,这简直是稳赚不赔的生意嘛

您需要登录后才可以回帖 登录 | 立即注册

触屏版| 电脑版

技术支持 历史网 V2.0 © 2016-2017