天天看點

FFmpeg關于nb_smples,frame_size以及profile的解釋

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  

FFmpeg關于nb_smples,frame_size以及profile的解釋
FFmpeg關于nb_smples,frame_size以及profile的解釋
  1. <span style="font-size:18px;"></span>  

從中會發現 當aac編碼級别是LC時frame_size 和nb_samples是1024,如果是HE的時候是2048。

其種标記在ffmpeg中是AVCodecContext中的profile:

[cpp]  view plain  copy  

FFmpeg關于nb_smples,frame_size以及profile的解釋
FFmpeg關于nb_smples,frame_size以及profile的解釋
  1.      int profile;  
  2. #define FF_PROFILE_UNKNOWN -99  
  3. #define FF_PROFILE_RESERVED -100  
  4. #define FF_PROFILE_AAC_MAIN 0  
  5. #define FF_PROFILE_AAC_LOW  1  
  6. #define FF_PROFILE_AAC_SSR  2  
  7. #define FF_PROFILE_AAC_LTP  3  
  8. #define FF_PROFILE_AAC_HE   4  
  9. #define FF_PROFILE_AAC_HE_V2 28  
  10. #define FF_PROFILE_AAC_LD   22  
  11. #define FF_PROFILE_AAC_ELD  38  
  12. #define FF_PROFILE_MPEG2_AAC_LOW 128  
  13. #define FF_PROFILE_MPEG2_AAC_HE  131  
  14. #define FF_PROFILE_DTS         20  
  15. #define FF_PROFILE_DTS_ES      30  
  16. #define FF_PROFILE_DTS_96_24   40  
  17. #define FF_PROFILE_DTS_HD_HRA  50  
  18. #define FF_PROFILE_DTS_HD_MA   60  
  19. #define FF_PROFILE_MPEG2_422    0  
  20. #define FF_PROFILE_MPEG2_HIGH   1  
  21. #define FF_PROFILE_MPEG2_SS     2  
  22. #define FF_PROFILE_MPEG2_SNR_SCALABLE  3  
  23. #define FF_PROFILE_MPEG2_MAIN   4  
  24. #define FF_PROFILE_MPEG2_SIMPLE 5  
  25. #define FF_PROFILE_H264_CONSTRAINED  (1<<9)  // 8+1; constraint_set1_flag  
  26. #define FF_PROFILE_H264_INTRA        (1<<11) // 8+3; constraint_set3_flag  
  27. #define FF_PROFILE_H264_BASELINE             66  
  28. #define FF_PROFILE_H264_CONSTRAINED_BASELINE (66|FF_PROFILE_H264_CONSTRAINED)  
  29. #define FF_PROFILE_H264_MAIN                 77  
  30. #define FF_PROFILE_H264_EXTENDED             88  
  31. #define FF_PROFILE_H264_HIGH                 100  
  32. #define FF_PROFILE_H264_HIGH_10              110  
  33. #define FF_PROFILE_H264_HIGH_10_INTRA        (110|FF_PROFILE_H264_INTRA)  
  34. #define FF_PROFILE_H264_HIGH_422             122  
  35. #define FF_PROFILE_H264_HIGH_422_INTRA       (122|FF_PROFILE_H264_INTRA)  
  36. #define FF_PROFILE_H264_HIGH_444             144  
  37. #define FF_PROFILE_H264_HIGH_444_PREDICTIVE  244  
  38. #define FF_PROFILE_H264_HIGH_444_INTRA       (244|FF_PROFILE_H264_INTRA)  
  39. #define FF_PROFILE_H264_CAVLC_444            44  
  40. #define FF_PROFILE_VC1_SIMPLE   0  
  41. #define FF_PROFILE_VC1_MAIN     1  
  42. #define FF_PROFILE_VC1_COMPLEX  2  
  43. #define FF_PROFILE_VC1_ADVANCED 3  
  44. #define FF_PROFILE_MPEG4_SIMPLE                     0  
  45. #define FF_PROFILE_MPEG4_SIMPLE_SCALABLE            1  
  46. #define FF_PROFILE_MPEG4_CORE                       2  
  47. #define FF_PROFILE_MPEG4_MAIN                       3  
  48. #define FF_PROFILE_MPEG4_N_BIT                      4  
  49. #define FF_PROFILE_MPEG4_SCALABLE_TEXTURE           5  
  50. #define FF_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION      6  
  51. #define FF_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE     7  
  52. #define FF_PROFILE_MPEG4_HYBRID                     8  
  53. #define FF_PROFILE_MPEG4_ADVANCED_REAL_TIME         9  
  54. #define FF_PROFILE_MPEG4_CORE_SCALABLE             10  
  55. #define FF_PROFILE_MPEG4_ADVANCED_CODING           11  
  56. #define FF_PROFILE_MPEG4_ADVANCED_CORE             12  
  57. #define FF_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE 13  
  58. #define FF_PROFILE_MPEG4_SIMPLE_STUDIO             14  
  59. #define FF_PROFILE_MPEG4_ADVANCED_SIMPLE           15  
  60. #define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_0   0  
  61. #define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_1   1  
  62. #define FF_PROFILE_JPEG2000_CSTREAM_NO_RESTRICTION  2  
  63. #define FF_PROFILE_JPEG2000_DCINEMA_2K              3  
  64. #define FF_PROFILE_JPEG2000_DCINEMA_4K              4   

[cpp]  view plain  copy  

FFmpeg關于nb_smples,frame_size以及profile的解釋
FFmpeg關于nb_smples,frame_size以及profile的解釋
  1. //這裡的最後一個參數一定要注意用pInputFrame->nb_samples* per_sample_in,以AAC舉例子,AVCodecContext中的profile會有LC,HE等不同,  
  2. //nb_samples在LC的時候是1024,在HE的時候是2048。如果不填寫對會影響音頻資料,nb_samples和AVCodecContext中的frame_size相同。  
  3. ret = avcodec_fill_audio_frame(pInputFrame,Channel_in,SampleFormat_in,buf_in,buf_size_in,pInputFrame->nb_samples* per_sample_in);