预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共69页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Asdjflaksdjflaskjdfl;akjsdlfFFPLAY的原理概要电影文件有很多基本的组成部分。首先,文件本身被称为容器Container,容器的类型决定了信息被存放在文件中的位置。AVI和Quicktime就是容器的例子。接着,你有一组流,例如,你经常有的是一个音频流和一个视频流。(一个流只是一种想像出来的词语,用来表示一连串的通过时间来串连的数据元素)。在流中的数据元素被称为帧Frame。每个流是由不同的编码器来编码生成的。编解码器描述了实际的数据是如何被编码Coded和解码DECoded的,因此它的名字叫做CODEC。Divx和MP3就是编解码器的例子。接着从流中被读出来的叫做包Packets。包是一段数据,它包含了一段可以被解码成方便我们最后在应用程序中操作的原始帧的数据。根据我们的目的,每个包包含了完整的帧或者对于音频来说是许多格式的完整帧。基本上来说,处理视频和音频流是很容易的:10从video.avi文件中打开视频流video_stream20从视频流中读取包到帧中30如果这个帧还不完整,跳到2040对这个帧进行一些操作50跳回到20在这个程序中使用ffmpeg来处理多种媒体是相当容易的,虽然很多程序可能在对帧进行操作的时候非常的复杂。因此在这篇指导中,我们将打开一个文件,读取里面的视频流,而且我们对帧的操作将是把这个帧写到一个PPM文件中。打开文件首先,来看一下我们如何打开一个文件。通过ffmpeg,你必需先初始化这个库。(注意在某些系统中必需用<ffmpeg/avcodec.h>和<ffmpeg/avformat.h>来替换)#include<avcodec.h>#include<avformat.h>...intmain(intargc,charg*argv[]){av_register_all();这里注册了所有的文件格式和编解码器的库,所以它们将被自动的使用在被打开的合适格式的文件上。注意你只需要调用av_register_all()一次,因此我们在主函数main()中来调用它。如果你喜欢,也可以只注册特定的格式和编解码器,但是通常你没有必要这样做。现在我们可以真正的打开文件:AVFormatContext*pFormatCtx;//Openvideofileif(av_open_input_file(&pFormatCtx,argv[1],NULL,0,NULL)!=0)return-1;//Couldn'topenfile我们通过第一个参数来获得文件名。这个函数读取文件的头部并且把信息保存到我们给的AVFormatContext结构体中。最后三个参数用来指定特殊的文件格式,缓冲大小和格式参数,但如果把它们设置为空NULL或者0,libavformat将自动检测这些参数。这个函数只是检测了文件的头部,所以接着我们需要检查在文件中的流的信息://Retrievestreaminformationif(av_find_stream_info(pFormatCtx)<0)return-1;//Couldn'tfindstreaminformation这个函数为pFormatCtx->streams填充上正确的信息。我们引进一个手工调试的函数来看一下里面有什么://Dumpinformationaboutfileontostandarderrordump_format(pFormatCtx,0,argv[1],0);现在pFormatCtx->streams仅仅是一组大小为pFormatCtx->nb_streams的指针,所以让我们先跳过它直到我们找到一个视频流。inti;AVCodecContext*pCodecCtx;//FindthefirstvideostreamvideoStream=-1;for(i=0;i<pFormatCtx->nb_streams;i++)if(pFormatCtx->streams[i]->codec->codec_type==CODEC_TYPE_VIDEO){videoStream=i;break;}if(videoStream==-1)return-1;//Didn'tfindavideostream//GetapointertothecodeccontextforthevideostreampCodecCtx=pFormatCtx->streams[videoStream]->codec;流中关于编解码器的信息就是被我们叫做"codeccontext"(编解码器上下文)的东西。这里面包含了流中所使用的关于编解码器的所有信息,现在我们有了一个指向他的指针。但是我们必需要找到真正的编解码器并且打开它:AVCodec*pCodec;//Findthedeco