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

来源:互联网 发布:白金数据 电影百度云 编辑:程序博客网 时间:2024/05/01 15:55

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
 在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:18px;">/* 
  2. A HE-AAC v1 or v2 audio frame contains 2048 PCM samples per channel (there is 
  3. also one mode with 1920 samples per channel but this is only for special purposes 
  4. such as DAB+ digital radio). 
  5. These bits/frame figures are average figures where each AAC frame generally has a different 
  6. size in bytes. To calculate the same for AAC-LC just use 1024 instead of 2048 PCM samples per 
  7. frame and channel. 
  8. For AAC-LD/ELD it is either 480 or 512 PCM samples per frame and channel. 
  9. */</span>  
从中会发现 当aac编码级别是LC时frame_size 和nb_samples是1024,如果是HE的时候是2048。

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

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1.     /** 
  2.      * profile 
  3.      * - encoding: Set by user. 
  4.      * - decoding: Set by libavcodec. 
  5.      */  
  6.      int profile;  
  7. #define FF_PROFILE_UNKNOWN -99  
  8. #define FF_PROFILE_RESERVED -100  
  9.   
  10. #define FF_PROFILE_AAC_MAIN 0  
  11. #define FF_PROFILE_AAC_LOW  1  
  12. #define FF_PROFILE_AAC_SSR  2  
  13. #define FF_PROFILE_AAC_LTP  3  
  14. #define FF_PROFILE_AAC_HE   4  
  15. #define FF_PROFILE_AAC_HE_V2 28  
  16. #define FF_PROFILE_AAC_LD   22  
  17. #define FF_PROFILE_AAC_ELD  38  
  18. #define FF_PROFILE_MPEG2_AAC_LOW 128  
  19. #define FF_PROFILE_MPEG2_AAC_HE  131  
  20.   
  21. #define FF_PROFILE_DTS         20  
  22. #define FF_PROFILE_DTS_ES      30  
  23. #define FF_PROFILE_DTS_96_24   40  
  24. #define FF_PROFILE_DTS_HD_HRA  50  
  25. #define FF_PROFILE_DTS_HD_MA   60  
  26.   
  27. #define FF_PROFILE_MPEG2_422    0  
  28. #define FF_PROFILE_MPEG2_HIGH   1  
  29. #define FF_PROFILE_MPEG2_SS     2  
  30. #define FF_PROFILE_MPEG2_SNR_SCALABLE  3  
  31. #define FF_PROFILE_MPEG2_MAIN   4  
  32. #define FF_PROFILE_MPEG2_SIMPLE 5  
  33.   
  34. #define FF_PROFILE_H264_CONSTRAINED  (1<<9)  // 8+1; constraint_set1_flag  
  35. #define FF_PROFILE_H264_INTRA        (1<<11) // 8+3; constraint_set3_flag  
  36.   
  37. #define FF_PROFILE_H264_BASELINE             66  
  38. #define FF_PROFILE_H264_CONSTRAINED_BASELINE (66|FF_PROFILE_H264_CONSTRAINED)  
  39. #define FF_PROFILE_H264_MAIN                 77  
  40. #define FF_PROFILE_H264_EXTENDED             88  
  41. #define FF_PROFILE_H264_HIGH                 100  
  42. #define FF_PROFILE_H264_HIGH_10              110  
  43. #define FF_PROFILE_H264_HIGH_10_INTRA        (110|FF_PROFILE_H264_INTRA)  
  44. #define FF_PROFILE_H264_HIGH_422             122  
  45. #define FF_PROFILE_H264_HIGH_422_INTRA       (122|FF_PROFILE_H264_INTRA)  
  46. #define FF_PROFILE_H264_HIGH_444             144  
  47. #define FF_PROFILE_H264_HIGH_444_PREDICTIVE  244  
  48. #define FF_PROFILE_H264_HIGH_444_INTRA       (244|FF_PROFILE_H264_INTRA)  
  49. #define FF_PROFILE_H264_CAVLC_444            44  
  50.   
  51. #define FF_PROFILE_VC1_SIMPLE   0  
  52. #define FF_PROFILE_VC1_MAIN     1  
  53. #define FF_PROFILE_VC1_COMPLEX  2  
  54. #define FF_PROFILE_VC1_ADVANCED 3  
  55.   
  56. #define FF_PROFILE_MPEG4_SIMPLE                     0  
  57. #define FF_PROFILE_MPEG4_SIMPLE_SCALABLE            1  
  58. #define FF_PROFILE_MPEG4_CORE                       2  
  59. #define FF_PROFILE_MPEG4_MAIN                       3  
  60. #define FF_PROFILE_MPEG4_N_BIT                      4  
  61. #define FF_PROFILE_MPEG4_SCALABLE_TEXTURE           5  
  62. #define FF_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION      6  
  63. #define FF_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE     7  
  64. #define FF_PROFILE_MPEG4_HYBRID                     8  
  65. #define FF_PROFILE_MPEG4_ADVANCED_REAL_TIME         9  
  66. #define FF_PROFILE_MPEG4_CORE_SCALABLE             10  
  67. #define FF_PROFILE_MPEG4_ADVANCED_CODING           11  
  68. #define FF_PROFILE_MPEG4_ADVANCED_CORE             12  
  69. #define FF_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE 13  
  70. #define FF_PROFILE_MPEG4_SIMPLE_STUDIO             14  
  71. #define FF_PROFILE_MPEG4_ADVANCED_SIMPLE           15  
  72.   
  73. #define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_0   0  
  74. #define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_1   1  
  75. #define FF_PROFILE_JPEG2000_CSTREAM_NO_RESTRICTION  2  
  76. #define FF_PROFILE_JPEG2000_DCINEMA_2K              3  
  77. #define FF_PROFILE_JPEG2000_DCINEMA_4K              4   


[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  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);   
0 0
原创粉丝点击