《如何用FFmpeg编写一个简单播放器详细步骤介绍》.docx
文本预览下载声明
如何用FFmpeg编写一个简单播放器详细步骤介绍(转载)
HYPERLINK /bbs/tag.php?name=FFmpeg \t _blank FFmpeg, HYPERLINK /bbs/tag.php?name=%E6%92%AD%E6%94%BE%E5%99%A8 \t _blank 播放器, HYPERLINK /bbs/tag.php?name=%E7%BC%96%E5%86%99 \t _blank 编写
FFMPEG是一个很好的库,可以用来创建视频应用或者生成特定的工具。FFMPEG几乎为你把所有的繁重工作都做了,比 如解码、编码、复用和解复用。这使得多媒体应用程序变得容易编写。它是一个简单的,用C编写的,快速的并且能够解码 几乎所有你能用到的格式,当然也包括编码多种格式。唯一的问题是它的文档基本上是没有的。有一个单独的指导讲了它的基本原理另外还有一个使用doxygen生成的文档。这就是为什么当我决定研究 FFMPEG来弄清楚音视频应用程序是如何工作的过程中,我决定把这个过程用文档的形式记录并且发布出来作为初学指导的原因。在FFMPEG工程中有一个示例的程序叫作ffplay。它是一个用C编写的利用ffmpeg来实现完整视频播放的简单播放器。这个指导将从原来Martin Bohme写的一个更新版本的指导开始(我借鉴了一些),基于Fabrice Bellard的ffplay,我将从那里开发一个可以使用的视频播放器。在每一个指导中,我将介 绍一个或者两个新的思想并且讲解我们如何来实现它。每一个指导都会有一个C源文件,你可以下载,编译并沿着这条思路来自己做。源文件将向你展示一个真正 的程序是如何运行,我们如何来调用所有的部件,也将告诉你在这个指导中技术实现的细节并不重要。当我们结束这个指导的时候,我 们将有一个少于1000行代码的可以工作的视频播放器。在写播放器的过程中,我们将使用SDL来输出音频和视频。SDL是一个优秀的跨平台的多媒体库,被用在MPEG播放、模拟器和很多视频游戏中。你将需要下载并安装SDL开发库到你的系统中,以便于编译这个指导中的程序。这篇指导适用于具有相当编程背景的人。至少至少应该懂得C并且有队列和互斥量等概念。你应当了解基本的多媒体中的像波形一类的概念,但是你不必知道的太 多,因为我将在这篇指导中介绍很多这样的概念。更新:我修正了在指导7和8中的一些代码错误,也添加-lavutil参数。欢迎给我发邮件到 HYPERLINK mailto:dranger@ dranger@,讨论关于程序问题、疑问、注释、思路、 特性等任何的问题
指 导1:制作屏幕录像
源代码:tutorial01.c概要电影文件有很多基本的组成部分。首先,文件本身被称为容 器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...int main(int argc, charg *argv[]) {av_register_all();这里注册了所有的文件格式和编解码器的库,所以它们将被自 动的使用在被打开的合适格式的文件上。注意你只需要调用av_reg
显示全部