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


    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); 
  • 相关阅读:
    Android开发常见问题及解决方法
    Jquery chosen动态设置值实例介绍 select Ajax动态加载数据 设置chosen和获取他们选中的值
    Unity3d 基于物理渲染Physically-Based Rendering之实现
    Unity3d 基于物理渲染Physically-Based Rendering之specular BRDF
    Unity3d HDR和Bloom效果(高动态范围图像和泛光)
    unity3d 制造自己的水体water effect(一)
    unity3d shader之Roberts,Sobel,Canny 三种边缘检测方法
    Unity3d shader之卡通着色Toon Shading
    NVIDIA CG语言 函数之所有数学类函数(Mathematical Functions)
    Unity3d 使用DX11的曲面细分
  • 原文地址:https://www.cnblogs.com/seacode/p/1767627.html
Copyright © 2020-2023  润新知