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

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