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編碼中感謝網友摘錄了一些注釋,如下:
[cpp] view plain copy
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5Gcu82Yp9VRE90Qvw1c0V2czF2LcRXZu5ibkN3YuUGZvN2Lc9CX6MHc0RHaiojIsJye.png)
- <span style="font-size:18px;"></span>
從中會發現 當aac編碼級别是LC時frame_size 和nb_samples是1024,如果是HE的時候是2048。
其種标記在ffmpeg中是AVCodecContext中的profile:
[cpp] view plain copy
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5Gcu82Yp9VRE90Qvw1c0V2czF2LcRXZu5ibkN3YuUGZvN2Lc9CX6MHc0RHaiojIsJye.png)
- 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
[cpp] view plain copy
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5Gcu82Yp9VRE90Qvw1c0V2czF2LcRXZu5ibkN3YuUGZvN2Lc9CX6MHc0RHaiojIsJye.png)
- //這裡的最後一個參數一定要注意用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);