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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/news/255053.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓观看免费视频

http://www.imooc.com/search/course?wordsAndroid%E6%94%BB%E5%9F%8E%E7%8B%AE%E7%AC%AC%E4%B8%80%E8%AF%BE&page3 http://www.imooc.com/course/list?candroid&src360onebox http://www.bilibili.com/video/av2788563/index_4.html http://www.imooc.com/course/pr…

EtherCAT 网站链接

http://www.ethercat.org.cn/cn.htm EtherCAT技术介绍 EtherCAT系统组成和工作原理 EtherCAT采用主从式结构&#xff0c;主站PC机采用标准的100Base-TX以太网卡&#xff0c;从站采用专用芯片。系统控制周期由主站发起&#xff0c;主站发出下行电报&#xff0c;电报的最大有效数…

IEC 6-1131/3的5种标准编程语言

用于开发控制系统和商业管理系统的TRACE MODE6编程工具面向不同领域的软件工程师. TRACE MODE6包含的五种编程语言为&#xff1a;Techno SFC、Techno LD、Techno FBD、Techno ST和Techno IL. 这些语言是下列IEC 6-1131/3标准语言的扩展&#xff1a; SFC&#xff08;顺序功能图…

ngRx 官方示例分析 - 4.pages

Page 中通过构造函数注入 Store&#xff0c;基于 Store 进行数据操作。 注意 Component 使用了 changeDetection: ChangeDetectionStrategy.OnPush. OnPush means that the change detectors mode will be set to CheckOnce during hydration. /app/containers/collection-page…

用ffmpeg把yuv格式转化为mpeg格式

http://blog.sina.com.cn/s/blog_5f5ad6a90100cs5k.html

方法:查询MongoDB数据库中最新一条数据(JAVA)

使用JAVA语言查询MongoDB中某个数据库某个集合的最新一条数据&#xff1a; MongoCollection<Document> cpu MongoClient.getDatabase("sysmgr").getCollection("cpu"); //获取所需集合 Document dbo cpu.find().sort(descending("time"…

NoPause/NoEmgAbort的任务 与后台任务的区别

NoPause/NoEmgAbort的任务示例 下面的例子显示了一个程序&#xff0c;可以监视控制器的错误并根据错误编号在发生错误时切换I/O On/Off。 Function main Xqt ErrorMonitor, NoEmgAbort : FendFunction ErrorMonitor Wait ErrorOnIf 4000 < SysErr And Syserr < 5999 T…

30分钟搞定后台登录界面(103个后台PSD源文件、素材网站)(转)

出处&#xff1a;http://www.cnblogs.com/best/p/6582294.html 目录 一、界面预览二、PSD源文件预览三、工具分享四、资源说明五、素材下载网站六、下载去年八月时要做一个OA系统为了后台界面而烦恼&#xff0c;后来写了一篇博客&#xff08;《后台管理UI的选择》&#xff09;介…

Linux 查看服务器开放的端口号

在讨论这个问题前&#xff0c;我们先来了解一下物理端口、逻辑端口、端口号等计算机概念。 端口相关的概念&#xff1a; 在网络技术中&#xff0c;端口&#xff08;Port&#xff09;包括逻辑端口和物理端口两种类型。物理端口指的是物理存在的端口&#xff0c;如ADSL Modem、集…

VC的文件路径为什么要用双斜杠

在编程时&#xff0c;打开文件的路径在用单斜杠时&#xff0c;会出现问题&#xff0c;例如&#xff1a; image cvLoadImage("C:\Users\lyb\Documents\Visual Studio 2013\Projects\smooth\Debug\pic.png", 0);这样的写法在编译时&#xff0c;不会出现编译错误&#…

FFMpeg中apiexample.c例子分析——解码分析

FFMpeg中apiexample.c例子分析——解码分析 收藏 我们直接从 video_decode_example() 函数开始讲&#xff0c;该函数实现了如何去解码一个视频文件&#xff0c;以 .mpeg 文 件为例。 &#xff08; 1 &#xff09;将缓存的末尾清 0 &#xff0c;从而确保读操作不会越界导致破…

[转]整理一些好的开源项目

首先说明&#xff0c;要想找开源项目&#xff0c;当然是Github&#xff01; 另外oschina上面也可能有你要的&#xff0c;这个是分类的链接&#xff1a;http://www.oschina.net/project/tags&#xff0c;比如这个是一个Python的相关开源资源&#xff1a;http://www.oschina.net/…

android是32-bit系统还是64-bit系统

转自&#xff1a;http://www.cnblogs.com/pengwang/archive/2013/03/11/2954496.html 电脑CPU分32位和64位&#xff0c;这个我们都知道。用了这么长时间的android手机&#xff0c;突然有个疑问&#xff1a;android OS运行在多少位的CPU上呢&#xff1f; android应用程序是基于D…

海尔系列报道之一:海尔“小微”怎么玩

海尔去年裁了1.6万人&#xff0c;今年上半年裁了5000人&#xff0c;这2.1万人去了哪&#xff1f;除了被淘汰的部分&#xff0c;他们中的大多数去了169家小微公司. 从今年年初开始&#xff0c;海尔集团品牌总监范建斌就带着海尔品牌部的两个姑娘开始筹划做一个文化小微公司&…

FFMpeg中apiexample.c例子分析——编码分析

FFMpeg中apiexample.c例子分析——编码分析apiexample.c例子教我们如何去利用ffmpeg库中的api函数来自己编写编解码程序。 &#xff08;1&#xff09;首先&#xff0c;main函数中一开始会去调用avcodec_init()函数&#xff0c;该函数的作用是初始化libavcodec&#xff0c;而我们…

.net 常见异常及其翻译

System.Exception//所有异常的基类型System.ApplicationException//发生非致命应用程序错误时引发的异常System.SystemException//为System命名空间中的预定义异常定义基类System.SystemException//异常根类System.AccessViolationException//在试图读写受保护内存时引发的异常…

Access2010打开系统表MSysObjects的控制权限

一、显示系统表 第一步&#xff1a;单击左上角【文件】页签&#xff0c;点击【选项】打开选项对话框&#xff0c;如图所示 第二步&#xff1a;在【Access选项】对话框中&#xff0c;选择【当前数据库】&#xff0c;在【导航】栏下&#xff0c;点击【导航选项】打开【导航选项】…

抓屏的各种方法(http://www.codeproject.com/KB/dialog/screencap.aspx)

文章翻译自 P.GopalaKrishna 的 Various methods for capturing the screen 一文&#xff0c;原版地址见下面。本文章版权归原作者所有。 如果转载该译文 , 请保证文章的完整性&#xff0c;并注明来自 www.farproc.com 袁晓辉 2005/6/12 原版地址&…

与 OpenCV 1 同时使用

与 OpenCV 1 同时使用 目的 对于OpenCV的开发团队来说&#xff0c;持续稳定地提高代码库非常重要。我们一直在思考如何在使其易用的同时保持灵活性。新的C接口即为此而来。尽管如此&#xff0c;向下兼容仍然十分重要。我们并不想打断你基于早期OpenCV库的开发。因此&am…