ffmpeg和SDL的多媒体编程(一) 制作屏幕录像

电影文件有很多基本的组成部分。首先,文件本身被称为容器Container,容器的类型决定了信息被存放在文件中的位置。AVI和Quicktime就是容器的例子。接着,你有一组流,例如,你经常有的是一个音频流和一个视频流。(一个流只是一种想像出来的词语,用来表示一连串的通过时间来串连的数据元素)。在流中的数据元素被称为帧Frame。 每个流是由不同的编码器来编码生成的。编解码器描述了实际的数据是如何被编码Coded和解码DECoded的,因此它的名字叫做CODEC。Divx和 MP3就是编解码器的例子。接着从流中被读出来的叫做包(Packets)。包是包含了一段可以被解码成方便我们最后在应用程序中操作的原始帧的 数据。根据我们的目的,每个包包含了完整的帧或者对于音频来说是许多格式的完整帧。

基本上来说,处理视频和音频流是很容易的:

10 从video.avi文件中打开视频流video_stream

20 从视频流中读取包到帧中

30 如果这个帧还不完整,跳到20

40 对这个帧进行一些操作

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_register_all()一 次,因此我们在主函

数main()中来调用它。如果你喜欢,也可以只注册特定的格式和编解码器,但是通常你没有必要这样做。

现在我们可以真正的打开文件:

AVFormatContext *pFormatCtx;

// Open video file

if(av_open_input_file(&pFormatCtx, argv[1], NULL, 0, NULL)!=0)

return -1; // Couldn't open file

我们通过第一个参数来获得文件名。这个函数读取文件的头部并且把信息保存到我们给的AVFormatContext结构体中。最后三个参数用来指定特殊的文件格式,

缓冲大小和格式参数,但如果把它们设置为空NULL或者0,libavformat将自动检测这些参数。

这个函数只是检测了文件的头部,所以接着我们需要检查在文件中的流的信息:

// Retrieve stream information

if(av_find_stream_info(pFormatCtx)<0)

return -1; // Couldn't find stream information

时间: 2016-09-29

ffmpeg和SDL的多媒体编程(一) 制作屏幕录像的相关文章

ffmpeg和SDL的多媒体编程(二) 输出到屏幕

SDL和视频 为了在屏幕上显示,我们将使用SDL.SDL是Simple Direct Layer的缩写.它是一个出色的多媒体库,适用于多平台,并且被用在许多工程中.你可以从它的官方网站的网址 http://www.libsdl.org/上来得到这个库的源代码或者如果有可能的话你可以直接下载开发包到你的操作系统中.按照这个指导,你将需要 编译这个库.(剩下的几个指导中也是一样) SDL库中有许多种方式来在屏幕上绘制图形,而且它有一个特殊的方式来在屏幕上显示图像――这种方式叫做YUV覆盖.YUV(从

如何在Linux上制作一个屏幕录像视频教程

一图胜千言,一个精心设计的指导视频更是能给你带来良好体验.Linux上有你需要的制作有用且高质量教学视频的所有工具.我们将用强大的kdenlive视频编辑器和Audacity音频录制器和编辑器制作一个简单的屏幕录像,并学习如何在YouTube上分享精彩的屏幕录像. 一台安装了Kdenlive和Audacit软件的Linux系统PC,一个质量好的麦克风或耳机,和一个YouTube的帐号就是你需要准备的全部.(是的,除了Youtube还有很多其他的免费视频共享服务,你也可以使用它们.)YouTube

我的媒体播放器——多媒体编程

第二个题目是我的播放器,可以播放音频和视频.其实略懂计算机多媒体技术的人都清楚,音频和视频的差异具体是体现在文件格式上的.不同的音频mp3,midi,wav等其实是不同的编码或者格式,同理不同的视频avi,rm(rmvb),mov等其实也是不同的编码格式,这些格式中,大多数都是不公开源代码的,但是公开标准或者API接口.但编程调用依然很繁琐,我们也没有精力和能力去研究这些. .Net本身不带多媒体库,但是具有与COM交互的强大能力.恰好,微软DirectShow技术能满足上述要求,而且可以跟.N

python多媒体编程 我在安装完PyOpenGL3.0.1后,运行根据书里面写的一个脚本,却出错

问题描述 python多媒体编程 我在安装完PyOpenGL3.0.1后,运行根据书里面写的一个脚本,却出错 python多媒体编程 我在安装完PyOpenGL3.0.1后,运行根据书里面写的一个脚本,却出错 解决方案 这个就是ctypes没找到,你尝试把环境变量什么的好好配置一下

Qt开发中如何添加第三方库--(以ffmpeg和sdl库为例)

 近期做一个播放器的项目,界面采用qt开发,需要用到第三方库ffmpeg和sdl库.由于以前没有qt添加第三方库的经验,因此在环境配置上费了不少功夫,因此在这里总结一下   在QT中,自动化编译过程,是通过qmake工具生成一个makefile文件实现的,它是由.pro文件生成而来的,因此添加第三方库可以从.pro工程文件入手. 添加第三方库,我们主要添加两个信息,一个是头文件信息,参数是INCLUDE,还有一个是链接库信息,参数在pro文件参数中是LIBS 同样由于我们所采用的编译器的不同,第

关于在android下用ffmpeg和sdl开发播放器的问题

问题描述 关于在android下用ffmpeg和sdl开发播放器的问题 从网上找了个ffmpeg和SDL开发的全格式播放器,但是发现每次播放完毕就会kill掉APP,好像是由于exit(0)执行的结果. 请问有没有人研究过这一块儿,如何只退出当前的activity,回到列表页面,而且下次进来还可以继续播放? 如果把C代码中解码和播放的部分写成线程有用吗? 解决方案 播放过程有没有先放在 Service 中?就像音乐播放器的实现一样. 解决方案二: 没有放在service中,但是放在一个线程中.我

RGB和YUV 多媒体编程基础详细介绍_基础知识

RGB和YUV 多媒体编程 一.概念 1.什么是RGB? 对一种颜色进行编码的方法统称为"颜色空间"或"色域".用最简单的话说,世界上任何一种颜色的"颜色空间"都可定义成一个固定的数字或变量.RGB(红.绿.蓝)只是众多颜色空间的一种.采用这种编码方法,每种颜色都可用三个变量来表示-红色绿色以及蓝色的强度.记录及显示彩色图像时,RGB是最常见的一种方案. 2.什么是YUV? YUV是被欧洲电视系统所采用的一种颜色编码方法(属于PAL),是PAL和

求助:急需一份《Visual C++.NET多媒体编程》的源码

问题描述 本人急需一份<VisualC++.NET多媒体编程>的源码?能帮帮忙么,在网上苦熬两天了,找不到,想买书得到那光盘,可现在书也没处买,实在需要,兄弟帮个忙吧!大恩不言谢.白客同志介绍过来地.我在技术交流1群.qq:[email protected]昵称:qbdpqbdp先谢了,在线等. 解决方案 解决方案二:不明LZ在说什么解决方案三:都是很好的建议!值得学习

java编程,在屏幕上显示一个带标题的窗口,并添加一个按钮

问题描述 java编程,在屏幕上显示一个带标题的窗口,并添加一个按钮 编写程序,在屏幕上显示一个带标题的窗口,并添加一个按钮,当用户单击按钮时,弹出对话框,显示用户单击了按钮. 解决方案 找点Java 的 Swing学习资料,这种界面估计用netbean或idea都可以自动生成. 解决方案二: import java.awt.Frame; import java.awt.Graphics; import java.awt.GridLayout; import java.awt.event.Act