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

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

我们直接从 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);

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

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

相关文章

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

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

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

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

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

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

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

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

.net 常见异常及其翻译

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

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

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

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

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

与 OpenCV 1 同时使用

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

第五周 Leetcode 99. Recover Binary Search Tree (HARD)

Leetcode99 给定一个 二叉搜索树,其中两个节点被交换,写一个程序恢复这颗BST. 只想到了时间复杂度O(n)空间复杂度O(h) h为树高的解法,还没想到空间O(1)的解法。 交换的情况只有两种&…

Fedora15安装NVIDIA显卡驱动全过程

Fedora安装N卡驱动全过程 Fedora安装NVIDIA显卡全过程,经过自己亲自安装 折腾了一个上午,搞定了N卡驱动安装,现将安装步骤整理如下: 1、首先访问Nvidia官网下载最新的Linux驱动:http://www.nvidia.cn/Download/index…

板邓:wordpress自定义登录页面实现用户登录

首先检查用户是否已经登录&#xff0c;如果已经登录就返回info目录下的页面。 <?phpglobal $current_user;$loginuserid $current_user->ID;if($loginuserid){//如果已经登录header("Location:".get_bloginfo(url)."/info/"); exit;} 如果用户未登…

机器学习(machine learning)之AdaBoost算法

转自&#xff1a;http://blog.csdn.net/haidao2009/article/details/7514787 浅谈 Adaboost 算法 机器学习是利用一些方法来使机器实现人的学习行为&#xff0c;以便获取新的知识或技能&#xff0c;重新组织已有的知识结构使之不断改善自身的性能。 AdaBoost全名“adaptive B…

交换两个整形变量的数值

课堂问题一: #include<stdio.h>void swap(int *p,int *q) {int *m;printf("m%d\n",m);printf("%s\n",*m);*m*p;*p*q;*q*m; } int main(){int a,b;scanf("%d,%d",&a,&b);swap(&a,&b);printf("a%d b%d\n",a,b);re…

使用CodeFirst创建并更新数据库

本文主要介绍如何使用CodeFirst模式来新建并更新数据库 在使用Entity Framwork的三种方式&#xff08;ModelFist、DBFirst、CodeFirst&#xff09;中&#xff0c;CodeFirst方式书写的代码最为干净。 至于CodeFist方式的详细优缺点请各位读者自行搜索&#xff0c;这里不多赘述。…

fedora 15怎么修改运行级别?

inittab改了已经在fedora15中&#xff0c;你vim它就可以看到更改说明&#xff0c;就是说都改到/etc/systemd/system/default.target这里了&#xff0c;就是缺省的设置。如果你要改变缺省值就把对应的runlevel移动过去覆盖了。 To 3 字符 [root15 system]# rm -rf /etc/systemd…

浅析人脸检测之Haar分类器方法

由于工作需要&#xff0c;我开始研究人脸检测部分的算法&#xff0c;这期间断断续续地学习Haar分类器的训练以及检测过程&#xff0c;在这里根据各种论文、网络资源的查阅和对代码的理解做一个简单的总结。我试图概括性的给出算法的起源、全貌以及细节的来龙去脉&#xff0c;但…

利用微软平台生成报表,线性图,柱形图

说来惭愧,以前的工作中一直借助第三方dll进行报表制作,比如线性图,柱形图. 因为现在工作的这家公司不允许随便引入第三方dll,听同事说起可以建rdl类型文件进行引入到winform窗体中,窗体上使用reportViewer控件进行关联展示.下面是我今天摸索3个小时的结果分享. 第一步. 首先找到…

Linux ffmpeg的安装编译过程

Linux ffmpeg的安装编译过程 1、下载ffmpeg。    在网上搜索一下,或者到官方网站下载2、解压   tar命令解压3、配置  ./configure --enable-shared --prefix/usr/local/ffmpeg  其中&#xff1a;--enable-shared 是允许其编译产生动态库&#xff0c;在以后的编程中…

opencv 模板匹配(cvMatchTemplate)

opencv 模板匹配(cvMatchTemplate) 模板匹配是通过在输入图像上滑动模板图像块对实际的图像块和输入图像进行匹配&#xff0c;并且可以利用函数cvMinMaxLoc()找到最佳匹配的位置。例如在工业应用中&#xff0c;可以锁定图像中零部件的位置&#xff0c;并根据具体的位置&…

爬虫系统Lucene分词

思路&#xff1a;查询数据库中信息&#xff0c;查询出id和name把那么进行分词存入文件 package com.open1111.index; import java.io.IOException;import java.nio.file.Paths;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet; impor…