FFmpeg关于nb_smples,frame_size以及profile的解释
/*
音频帧率计算方法(为防止以后忘了)
采样率 sampling = 44100
格式(编码字节数、采样一位所占的字节数) format = s16(格式)=16(bit)
声道数 channels = 2
一次采样(一秒中所占的位数)TotalBit = sampling * channels * format = 1411200
一次采样(一秒中所占的字节数)TotalByte = TotalBit/8 = 176400
1) AAC:
nb_samples和frame_size = 1024
一帧数据量:1024*2*s16/8 = 4096个字节。
ACC帧率 (一秒播放帧数)= TotalByte/4096 = 43.06640625帧
2) MP3:
nb_samples和frame_size = 1152
一帧数据量:1152*2*s16/8 = 4608个字节。
MP3帧率 (一秒播放帧数)= TotalByte/4608 = 38.28125帧
*/
原来一直记得固定编码格式需要固定的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编码中感谢网友摘录了一些注释,如下:
- <span style="font-size:18px;">
-
-
-
-
-
-
-
- </span>
从中会发现 当aac编码级别是LC时frame_size 和nb_samples是1024,如果是HE的时候是2048。
其种标记在ffmpeg中是AVCodecContext中的profile:
-
-
-
-
-
- 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
-
-
- 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的,如果有其他再记录。