Chinaunix首页 | 论坛 | 博客
  • 博客访问: 173252
  • 博文数量: 19
  • 博客积分: 1980
  • 博客等级: 上尉
  • 技术积分: 567
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-01 13:01
文章分类

全部博文(19)

文章存档

2011年(5)

2010年(4)

2009年(9)

2008年(1)

我的朋友

分类: LINUX

2011-01-08 18:44:26

 

我们直接从 video_decode_example() 函数开始讲,该函数实现了如何去解码一个视频文件,以 .mpeg 文件为例。

  ( 1 )将缓存的末尾清 0 ,从而确保读操作不会越界导致破坏 mpeg 流。

     uint8_t inbuf[INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE];

     memset(inbuf + INBUF_SIZE, 0, FF_INPUT_BUFFER_PADDING_SIZE);

    可见,我们所分配的缓存,除了存放数据外,最后部分还预留了一小段空间。

  ( 2 ) avcodec_find_decoder() 函数用于查找与 codec ID 相匹配的已注册的解码器。

  ( 3 ) avcodec_alloc_context() 函数用于分配一个 AVCodecContext 并设置默认值,如果失败返回 NULL ,并可用 av_free() 进行释放。

  ( 4 ) avcodec_alloc_frame() 函数用于分配一个 AVFrame 并设置默认值,如果失败返回 NULL ,并可用 av_free() 进行释放。

  ( 5 ) avcodec_open() 函数用给定的 AVCodec 来初始化 AVCodecContext 。

    对于一些编解码器,像 msmpeg4 和 mpeg4 ,其宽度和高度必须要初始化,因为这些信息在码流( bitstream )中是没有的。 avcodec_open() 会帮我们把宽度和高度设置好。

  ( 6 )打开文件 fopen 。

  ( 7 )循环解码。

来源:(http://blog.sina.com.cn/s/blog_4e87ac6e0100a60g.html ) - FFMpeg中apiexample.c例子分析——解码分析_eNsEmpire_新浪博客

  ( 7.1 )读取文件 fread(inbuf, 1, INBUF_SIZE, f );

    注意 1 :一些编解码器是基于流的(像 mpegvideo , mpegaudio ),这是使用它们的唯一一种方法,因为在解析它之前,你不知道压缩数据的大小。

    但是,一些其他编解码器(像 msmpeg4 , mpeg4 )是基于帧的,所以对于某一帧,你必须调用这些编解码器来处理所有数据。你也必须在初始化这些编解码器前,先把宽度和高度设置了。

    注意 2 :一些编解码器允许原始参数(像帧大小,采样率)在任何一帧被改变。我们虽然已对此做了处理,但你也要重视起来。

    这儿,我们用一个基于流的解码器( mpeg1video ),所以我们把数据输到解码器,看它是否可以解码一帧。

  ( 7.2 ) avcodec_decode_video() 函数用于解码一个视频帧 , 从 inbuf_ptr 到 picture, 所采用的编解码器是 c 。

  ( 7.3 )写入文件。

  ( 8 )解码延时的帧,再写入文件。

    一些解码器,像 MPEG ,传输 I 帧和 P 帧时,都会有一帧的延时。所以我们必须要获取视频的最后一帧数据。

  ( 9 )释放资源。

     fclose(f);

     avcodec_close(c);

     av_free(c);

     av_free(picture);

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yfh1985sdq/archive/2010/07/01/5706451.aspx

阅读(1440) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-03-09 09:37:11

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com