利用ffmpeg来进行视频解码的完整示例代码(H.26

系统 1545 0
  1. Decode() 
  2. FILE  * inpf; 
  3.  
  4. int  nWrite; 
  5. int  i,p; 
  6. int  nalLen; 
  7. unsigned  char * Buf; 
  8. int  got_picture, consumed_bytes; 
  9. unsigned  char  *DisplayBuf; 
  10. DisplayBuf=(unsigned  char  *)malloc(60000); 
  11.  
  12. char  outfile[] =  "test.pgm"
  13.  
  14. //1.打开输入文件  
  15. inpf = fopen( "test.264" "rb" ); 
  16.  
  17. //outf = fopen("out.yuv", "wb");  
  18.  
  19. if (!inpf) 
  20. goto  Decodereturn; 
  21.  
  22. nalLen = 0; 
  23. Buf = (unsigned  char *)calloc ( 1000000,  sizeof ( char ));  //准备解码文件缓冲  
  24.  
  25. //2.注册解码器,并且找到H264解码器  
  26. avcodec_init(); 
  27. avcodec_register_all(); 
  28. codec = avcodec_find_decoder(CODEC_ID_H264); 
  29.  
  30. if  (!codec) { 
  31. return  0; 
  32. //allocate codec context  
  33. //分配解码器内存  
  34. c = avcodec_alloc_context(); 
  35.  
  36. if (!c){ 
  37. return  0; 
  38. //open codec  
  39. //3.打开解码器  
  40. if  (avcodec_open(c, codec) < 0) { 
  41. return  0; 
  42.  
  43. //allocate frame buffer  
  44. //分配解码器用的帧缓冲  
  45. picture = avcodec_alloc_frame(); 
  46. if (!picture){ 
  47. return  0; 
  48.  
  49. rgbdatanew = (unsigned  char  *)malloc( sizeof (unsigned  char )*(3 * width * height)); 
  50.  
  51. while (!feof(inpf)) 
  52.  
  53. //4.获取下一个NAL的长度,并且将NAL放入Buf  
  54. nalLen = getNextNal(inpf, Buf); 
  55.  
  56. //5.对改NAL解码,解码的YUV数据存在picture中  
  57. consumed_bytes= avcodec_decode_video(c, picture, &got_picture, Buf, nalLen); 
  58.  
  59. if (consumed_bytes > 0) 
  60.  
  61. //6.将picture中的YUV数据显示或者保存到文件  
  62. p=0; 
  63. for (i=0; i<c->height; i++) 
  64. memcpy(DisplayBuf+p,picture->data[0] + i * picture->linesize[0], c->width); 
  65. p+=c->width; 
  66. for (i=0; i<c->height/2; i++) 
  67. memcpy(DisplayBuf+p,picture->data[1] + i * picture->linesize[1], c->width/2); 
  68. p+=c->width/2; 
  69. for (i=0; i<c->height/2; i++) 
  70. memcpy(DisplayBuf+p,picture->data[2] + i * picture->linesize[2], c->width/2); 
  71. p+=c->width/2; 
  72. //显示画面  
  73. DisplayVideo(DisplayBuf); 
  74.  
  75. //7.关闭输入文件  
  76. if (inpf) 
  77. fclose(inpf); 
  78.  
  79. Decodereturn: 
  80.  
  81. //8.关闭解码器,释放解码器内存  
  82. if (c) { 
  83. avcodec_close(c); 
  84. av_free(c); 
  85. c = NULL; 
  86. //9.释放解码画面内存  
  87. if (picture) { 
  88. av_free(picture); 
  89. picture = NULL; 
  90.  
  91. //10.释放解码文件缓冲  
  92. if (Buf) 
  93. free(Buf); 
  94. Buf = NULL; 
  95.  
  96. free(DisplayBuf); 

利用ffmpeg来进行视频解码的完整示例代码(H.264)


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论