ffmpeg与sdl
ffmpeg编译、使用与常见问题
FFMPEG编译、使用与常见问题一. Linux下FFMPEG的安装与测试 (1)二. FFMPEG编译中出现的一些问题与解决方法 (4)三. FFMpeg简介及命令选项参数 (8)四. FFMPEG与x264的编译 (13)一.Linux下FFMPEG的安装与测试a. 先装mp3在linux下的包:lame-3.97.tar.gz;tar -xvzf lame-3.97.tar.gz;cd lame-3.97;./configure --enable-shared --prefix=/usr/;make;make install;b. 支持Ogg Vorbis:as4自带相应的rpm包,你可以安装一下如下rpm包:libvorbis, libvorbis-devel,libogg, libogg-devel 一般情况下as4都会安装c. 支持xvid x264,现在最流行的两种高质量的压缩格式xvid的编译安装wget /downloads/xvidcore-1.1.0.tar.gztar zvxf xvidcore-1.1.0.tar.gzcd xvidcore-1.1.2/build/generic./configure --prefix=/usr --enable-sharedmakemake installx264的获取用git:git clone git:///x264.gitcd x264./configure --prefix=/usr --enable-sharedmakemake install3d. AC3和dts编码的支持as4系统似乎已经支持ac3编码,编译的时候只要加--enable-a52 --enable-gpl参数就行libdts编译参数tar zxvf libdts-0.0.2.tar.gz./configure --prefix=/usrmakemake installe. mpg4 aac格式支持,由于服务器还针对手机用户服务,所以,类似aac,mpg4铃声格式的支持,我们也得做。
只需四行代码即可简单实现SDL嵌入MFC播放视频和图片2014.2.18
纠结半个多月的SDL嵌入MFC的工作终于实现了,蛋疼的是看了那么多代码,找了好多程序,结果实现只需几行代码!!!我们还是低估SDL了,大家都想错路了。
百度看了好多人写的文章,虽然只有几篇介绍SDL嵌入MFC的文章,但是大致都出自一人之手,都是改写winmain,SDL_main等函数的,我第一次看的时候就感觉改了那么多东西,但是关联都不是很大,只知道要获取控件的ID(你想在哪个控件上播放),MFC的原理就是这样,就是获取各种ID。
第一次实现那位仁兄的显示图片到SDI的功能的时候(我是用DLG实现的),我没发觉为什么显示的时候覆盖了整个对话框,因为要实现播放视频,当时还没调通显示视频的部分,而他代码里只有DrawPict这个函数,所以就没注意。
知道今天当我把视频播放,语音播放功能都实现后回头看的时候才发现,原来最重要的就是那么几行。
好了,不瞎扯了,大家可能着急了,到底怎么实现的SDL播放画面嵌入MFC控件中去的。
下面是代码片段:SDL_Event event;static struct SwsContext *img_convert_ctx;char * filePath="c:/test.mp4";/************************************************************************//* 测试SDL窗口显示到mfc对话框中*//************************************************************************/char variable[256];CWnd* pWnd = this->GetDlgItem(IDC_VIEW); //获取图片控件的窗口指针sprintf(variable,"SDL_WINDOWID=0x%1x",pWnd->GetSafeHwnd()); // 格式化字符串SDL_putenv(variable); //这句是最重要的了,将上面的字符串传入即可//剩下的就是设置视频播放大小的问题了,自己可以随便改SDL_Rect rect; //设置好播放的大小后传入SDL_SetVideoModeRECT rc;pWnd->GetWindowRect(&rc);rect.x = 0;rect.y = 0;rect.w = rc.right-rc.left;rect.h = rc.bottom-rc.top;// Register all formats and codecsavcodec_register_all();av_register_all();if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) {fprintf(stderr, "Could not initialize SDL - %s\n", SDL_GetError());exit(1);}以下N行代码都是解码的部分,就不写了,主要写和SDL嵌入有关的下面这句大家是相当的熟悉了,用过SDL播放的都应该知道// Make a screen to put our videoscreen = SDL_SetVideoMode(rect.w, rect.h, 0, 0); //此处需要设置成缩放大小if(!screen) {exit(1);}不知道大家看明白没?其实实现这个功能一共就需要四行代码,大家是不是有种蛋碎的感觉?char variable[256];CWnd* pWnd = this->GetDlgItem(IDC_VIEW); //获取图片控件的窗口指针sprintf(variable,"SDL_WINDOWID=0x%1x",pWnd->GetSafeHwnd()); // 格式化字符串SDL_putenv(variable); //这句是最重要的了,将上面的字符串传入即可只要把上面的SDL_WINDOWID传入后,不管你怎么画图,播放视频,都是在那个控件中显示!这个问题绝对不是我第一个想出来的,肯定有人已经知道,但是就这么一个简单的问题,百度上却没有一个人说明!可见中国的大环境啊!为了刚接触ffmpeg的TX少走弯路我会后续写自己对SDL在MFC中运作的一些体会。
如何用FFmpeg编写一个简单播放器详细步骤介绍
如何用FFmpeg编写一个简单播放器详细步骤介绍(转载)FFmpeg, 播放器, 编写FFMPEG是一个很好的库,可以用来创建视频应用或者生成特定的工具。
FFMPEG 几乎为你把所有的繁重工作都做了,比如解码、编码、复用和解复用。
这使得多媒体应用程序变得容易编写。
它是一个简单的,用C编写的,快速的并且能够解码几乎所有你能用到的格式,当然也包括编码多种格式。
唯一的问题是它的文档基本上是没有的。
有一个单独的指导讲了它的基本原理另外还有一个使用doxygen生成的文档。
这就是为什么当我决定研究 FFMPEG来弄清楚音视频应用程序是如何工作的过程中,我决定把这个过程用文档的形式记录并且发布出来作为初学指导的原因。
在FFMPEG工程中有一个示例的程序叫作ffplay。
它是一个用C编写的利用ffmpeg来实现完整视频播放的简单播放器。
这个指导将从原来Martin Bohme写的一个更新版本的指导开始(我借鉴了一些),基于Fabrice Bellard的ffplay,我将从那里开发一个可以使用的视频播放器。
在每一个指导中,我将介绍一个或者两个新的思想并且讲解我们如何来实现它。
每一个指导都会有一个C源文件,你可以下载,编译并沿着这条思路来自己做。
源文件将向你展示一个真正的程序是如何运行,我们如何来调用所有的部件,也将告诉你在这个指导中技术实现的细节并不重要。
当我们结束这个指导的时候,我们将有一个少于1000行代码的可以工作的视频播放器。
在写播放器的过程中,我们将使用SDL来输出音频和视频。
SDL是一个优秀的跨平台的多媒体库,被用在MPEG播放、模拟器和很多视频游戏中。
你将需要下载并安装SDL开发库到你的系统中,以便于编译这个指导中的程序。
这篇指导适用于具有相当编程背景的人。
至少至少应该懂得C并且有队列和互斥量等概念。
你应当了解基本的多媒体中的像波形一类的概念,但是你不必知道的太多,因为我将在这篇指导中介绍很多这样的概念。
利用C实现实时音视频数据传输系统设计与开发
利用C实现实时音视频数据传输系统设计与开发一、引言随着互联网的快速发展,音视频通信已经成为人们日常生活中不可或缺的一部分。
实时音视频数据传输系统在视频会议、在线教育、远程医疗等领域发挥着越来越重要的作用。
本文将介绍如何利用C语言实现一个高效稳定的实时音视频数据传输系统,涵盖系统设计与开发的方方面面。
二、系统架构设计在设计实时音视频数据传输系统时,首先需要考虑系统的整体架构。
一个典型的音视频传输系统包括采集模块、编码模块、传输模块、解码模块和渲染模块。
采集模块负责从摄像头和麦克风中获取音视频数据,编码模块将原始数据进行压缩编码,传输模块通过网络传输编码后的数据,解码模块将接收到的数据进行解码,最后渲染模块将解码后的数据显示在屏幕上。
三、采集模块设计与实现采集模块是实时音视频传输系统中至关重要的一环。
在C语言中,可以利用开源库如OpenCV来实现音视频数据的采集。
通过OpenCV提供的接口,可以轻松地从摄像头和麦克风中获取音视频数据,并进行预处理操作。
四、编码模块设计与实现编码模块负责对采集到的音视频数据进行压缩编码,以减小数据量并保证传输效率。
在C语言中,可以使用FFmpeg等开源编解码库来实现音视频数据的编码工作。
FFmpeg提供了丰富的API接口,可以方便地对音视频数据进行编解码操作。
五、传输模块设计与实现传输模块是实时音视频传输系统中连接采集端和播放端的桥梁。
在C语言中,可以利用Socket编程来实现音视频数据的传输。
通过Socket套接字接口,可以建立客户端和服务器之间稳定可靠的连接,并实现音视频数据的实时传输。
六、解码模块设计与实现解码模块负责将接收到的音视频数据进行解码操作,以便后续渲染显示。
在C语言中,可以使用FFmpeg等开源库来实现音视频数据的解码工作。
通过FFmpeg提供的API接口,可以轻松地对接收到的音视频数据进行解码操作。
七、渲染模块设计与实现渲染模块是实时音视频传输系统中最终将音视频数据显示在屏幕上的环节。
FFmpeg命令行工具学习(二):播放媒体文件的工具ffplay
FFmpeg命令⾏⼯具学习(⼆):播放媒体⽂件的⼯具ffplay ⼀、简述ffplay是以FFmpeg框架为基础,外加渲染⾳视频的库libSDL构建的媒体⽂件播放器。
⼆、命令格式在安装了在命令⾏中输⼊如下格式的命令:ffplay [选项] ['输⼊⽂件']1. 主要选项'-x width' 强制以 "width" 宽度显⽰'-y height' 强制以 "height" ⾼度显⽰'-an' 禁⽌⾳频'-vn' 禁⽌视频'-ss pos' 跳转到指定的位置(秒)'-t duration' 播放 "duration" 秒⾳/视频'-bytes' 按字节跳转'-nodisp' 禁⽌图像显⽰(只输出⾳频)'-f fmt' 强制使⽤ "fmt" 格式'-window_title title' 设置窗⼝标题(默认为输⼊⽂件名)'-loop number' 循环播放 "number" 次(0将⼀直循环)'-showmode mode' 设置显⽰模式可选的 mode :'0, video' 显⽰视频'1, waves' 显⽰⾳频波形'2, rdft' 显⽰⾳频频带默认值为 'video',你可以在播放进⾏时,按 "w" 键在这⼏种模式间切换'-i input_file' 指定输⼊⽂件2. ⼀些⾼级选项'-sync type' 设置主时钟为⾳频、视频、或者外部。
默认为⾳频。
主时钟⽤来进⾏⾳视频同步'-threads count' 设置线程个数'-autoexit' 播放完成后⾃动退出'-exitonkeydown' 任意键按下时退出'-exitonmousedown' 任意⿏标按键按下时退出'-acodec codec_name' 强制指定⾳频解码器为 "codec_name"'-vcodec codec_name' 强制指定视频解码器为 "codec_name"'-scodec codec_name' 强制指定字幕解码器为 "codec_name"3. ⼀些快捷键'q, ESC' 退出'f' 全屏'p, SPC' 暂停'w' 切换显⽰模式(视频/⾳频波形/⾳频频带)'s' 步进到下⼀帧'left/right' 快退/快进 10 秒'down/up' 快退/快进 1 分钟'page down/page up' 跳转到前⼀章/下⼀章(如果没有章节,快退/快进 10 分钟)'mouse click' 跳转到⿏标点击的位置(根据⿏标在显⽰窗⼝点击的位置计算百分⽐)三、ffplay 播放⾳频播放⾳频⽂件的命令:ffplay shy.mp3这时候就会弹出来⼀个窗⼝,⼀边播放MP3⽂件,⼀边将播放⾳频的图画到该窗⼝上。
ffmpeg编译、使用与常见问题
FFMPEG编译、使用与常见问题一. Linux下FFMPEG的安装与测试 (1)二. FFMPEG编译中出现的一些问题与解决方法 (4)三. FFMpeg简介及命令选项参数 (8)四. FFMPEG与x264的编译 (13)一.Linux下FFMPEG的安装与测试a. 先装mp3在linux下的包:lame-3.97.tar.gz;tar -xvzf lame-3.97.tar.gz;cd lame-3.97;./configure --enable-shared --prefix=/usr/;make;make install;b. 支持Ogg Vorbis:as4自带相应的rpm包,你可以安装一下如下rpm包:libvorbis, libvorbis-devel,libogg, libogg-devel 一般情况下as4都会安装c. 支持xvid x264,现在最流行的两种高质量的压缩格式xvid的编译安装wget /downloads/xvidcore-1.1.0.tar.gztar zvxf xvidcore-1.1.0.tar.gzcd xvidcore-1.1.2/build/generic./configure --prefix=/usr --enable-sharedmakemake installx264的获取用git:git clone git:///x264.gitcd x264./configure --prefix=/usr --enable-sharedmakemake install3d. AC3和dts编码的支持as4系统似乎已经支持ac3编码,编译的时候只要加--enable-a52 --enable-gpl参数就行libdts编译参数tar zxvf libdts-0.0.2.tar.gz./configure --prefix=/usrmakemake installe. mpg4 aac格式支持,由于服务器还针对手机用户服务,所以,类似aac,mpg4铃声格式的支持,我们也得做。
FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放
FFmpeg开发笔记(九):ffmpeg解码rtsp流并使⽤SDL同步播放前⾔ ffmpeg播放rtsp⽹络流和摄像头流。
Demo 使⽤ffmpeg播放局域⽹rtsp1080p海康摄像头:延迟0.2s,存在马赛克 使⽤ffmpeg播放⽹络rtsp⽂件流:偶尔卡顿,延迟看不出 使⽤vlc软件播放局域⽹rtsp1080p海康摄像头:演⽰2s,不存在马赛克 使⽤vlc软件播放⽹络rtsp⽂件流:不卡顿,延迟看不出FFmpeg基本播放流程ffmpeg解码流程 ffmpeg新增API的解码执⾏流程。
新api解码基本流程如下:步骤⼀:注册: 使⽤ffmpeg对应的库,都需要进⾏注册,可以注册⼦项也可以注册全部。
步骤⼆:打开⽂件: 打开⽂件,根据⽂件名信息获取对应的ffmpeg全局上下⽂。
步骤三:探测流信息: ⼀定要探测流信息,拿到流编码的编码格式,不探测流信息则其流编码器拿到的编码类型可能为空,后续进⾏数据转换的时候就⽆法知晓原始格式,导致错误。
步骤四:查找对应的解码器 依据流的格式查找解码器,软解码还是硬解码是在此处决定的,但是特别注意是否⽀持硬件,需要⾃⼰查找本地的硬件解码器对应的标识,并查询其是否⽀持。
普遍操作是,枚举⽀持⽂件后缀解码的所有解码器进⾏查找,查找到了就是可以硬解了(此处,不做过多的讨论,对应硬解码后续会有⽂章进⾏进⼀步研究)。
(注意:解码时查找解码器,编码时查找编码器,两者函数不同,不要弄错了,否则后续能打开但是数据是错的)步骤五:打开解码器 开打解码器的时候,播放的是rtsp流,需要设置⼀些参数,在ffmpeg中参数的设置是通过AVDictionary来设置的。
使⽤以上设置的参数,传⼊并打开获取到的解码器。
AVDictionary *pAVDictionary = 0// 设置缓存⼤⼩ 1024000byteav_dict_set(&pAVDictionary, "buffer_size", "1024000", 0);// 设置超时时间 20sav_dict_set(&pAVDictionary, "stimeout", "20000000", 0);// 设置最⼤延时 3sav_dict_set(&pAVDictionary, "max_delay", "30000000", 0);// 设置打开⽅式 tcp/udpav_dict_set(&pAVDictionary, "rtsp_transport", "tcp", 0);ret = avcodec_open2(pAVCodecContext, pAVCodec, &pAVDictionary);if(ret){LOG << "Failed to avcodec_open2(pAVCodecContext, pAVCodec, pAVDictionary)";return;}步骤六:申请缩放数据格式转换结构体 此处特别注意,基本上解码的数据都是yuv系列格式,但是我们显⽰的数据是rgb等相关颜⾊空间的数据,所以此处转换结构体就是进⾏转换前到转换后的描述,给后续转换函数提供转码依据,是很关键并且⾮常常⽤的结构体。
一种多格式视频插件在图书馆的应用
一种多格式视频插件在图书馆的应用【摘要】针对我校图书馆在利用发布视频资源中遇到的实际问题,提出一种多格式视频插件。
该插件利用ActiveX技术开发,使用了FFMPEG和SDL多媒体库函数,实现对各种格式的视频文件解码和播放,并能嵌入到网页浏览器中使用。
将此插件应用于图书馆的视频点播系统中,可简化视频发布系统的工作,解决了工作中的实际问题。
【关键词】视频插件;格式通用;图书馆The Application of A Multi-format Video Plug-in in the Library【Abstract】For my school library practical problems encountered in the use of Video resources,proposed a multi-format video plug-in.The plug-in using ActiveX technology for development,using FFMPEG and SDL multimedia library functions , to achieve a variety of formats for decoding and playback of video files,and can be embedded into web browser to ing this plug-in in the VOD system of library,can simplify the work of video distribution system,and solve the practical problem in work.【Key words】Video plug-in;General format;Library我校图书馆近年来采购和收集了大量的教学、培训、学习等视频资料,为方便读者使用并保护这些资源的版权,准备通过视频点播网站向读者提供这些视频资源,供读者在线观看。
ffmpeg.dll 使用方法
ffmpeg.dll 是一个用于音视频处理的动态链接库(DLL),它提供了一系列功能用于音视频的编解码、格式转换、流媒体处理等。
要使用ffmpeg.dll,你需要按照以下步骤进行操作:
1. 下载ffmpeg.dll 文件:首先你需要下载ffmpeg.dll 文件,可以从官方网站或者其他可靠的来源下载到这个DLL 文件。
2. 将ffmpeg.dll 放置在合适的目录:将下载好的ffmpeg.dll 文件放置在你的项目或者系统的合适目录下,确保程序能够访问到这个DLL 文件。
3. 在你的项目中引用ffmpeg.dll:在你的项目中引用ffmpeg.dll,可以通过在代码中直接调用DLL 中的函数或者通过其他方式进行调用。
4. 调用ffmpeg.dll 中的函数:根据ffmpeg.dll 提供的功能,你可以在你的项目中调用相应的函数来实现音视频处理的功能,比如音视频的编解码、格式转换等。
需要注意的是,使用ffmpeg.dll 需要对音视频处理有一定的了解,并且需要遵守相关的版权和许可协议。
另外,使用ffmpeg.dll 时需要注意安全性,避免因为调用不当导致系统或者程序的安全问题。
嵌入式Linux系统中图片解码和显示的跨平台支持技术
嵌入式Linux系统中图片解码和显示的跨平台支持技术在嵌入式Linux系统中,图片解码和显示的跨平台支持技术是一个关键的问题。
由于嵌入式系统的资源有限,加上不同硬件平台和操作系统的差异,如何有效地实现图片的解码和显示成为了一个挑战。
本文将介绍几种常用的跨平台支持技术,包括FFmpeg、GStreamer和SDL。
一、FFmpegFFmpeg是一个开源的跨平台多媒体解决方案,它包含了一系列处理音视频的库和工具。
对于图片解码和显示,FFmpeg提供了libavcodec和libavformat两个库来支持各种格式的图片解码和编码。
同时,FFmpeg还提供了libswscale库用于图片的缩放和转换,以及libavutil库用于处理音视频数据。
在嵌入式Linux系统中,我们可以使用FFmpeg的库函数来实现图片的解码和显示。
首先,我们需要使用libavformat库中的avformat_open_input函数打开图片文件,并通过avformat_find_stream_info函数获取图像流信息。
然后,我们可以使用libavcodec库中的avcodec_find_decoder函数查找合适的解码器,并通过avcodec_open2函数打开解码器。
接下来,我们可以使用avcodec_decode_video2函数对图像进行解码,并将解码得到的图像数据进行显示。
最后,我们需要释放相关资源,如关闭文件和释放内存。
二、GStreamerGStreamer是一个开源的多媒体框架,可以用于构建多媒体应用程序。
它提供了丰富的插件和管道,可以支持多种媒体格式的解码和编码。
对于图片解码和显示,GStreamer提供了gst-launch-1.0命令行工具和GstPlayer库来实现。
在嵌入式Linux系统中,我们可以使用GstPlayer库中的功能来实现图片的解码和显示。
首先,我们可以使用gst_player_new函数创建一个GstPlayer对象,并使用gst_player_set_uri函数设置要播放的图片文件的路径。
基于RTP的机载网络视频实时监控系统设计
基于RTP的机载网络视频实时监控系统设计郝朝;王灏【摘要】在飞行试验中,视频实时监控是保障试飞安全和提高试飞效率的重要环节.为了解决某型机机载网络视频的实时监控问题,提出了基于RTP/RTCP协议的机载网络视频实时解析系统设计方案.通过UDP组播协议接收网络电台发送的RTP/RTCP数据包,经过解包,拼成完整的一帧视频图像,采用FFmpeg进行视频解码并利用SDL进行显示.首先介绍了遥测网络视频实时监控系统架构,重点介绍了RTP/RTCP协议及解包方法,然后论述了视频解码与显示流程、YUV图像处理算法.软件采用模块化、多线程并发和多缓冲区设计思路,提高处理效率,保证网络视频监控的实时性和功能的可扩展性.目前该软件已成功应用于某型号任务视频实时监控中.实际应用效果表明,视频播放效果清晰流畅,该软件具有良好的实时性、可靠性和人机交互功能,有效保证了试飞安全.【期刊名称】《计算机技术与发展》【年(卷),期】2019(029)005【总页数】4页(P131-134)【关键词】RTP/RTCP;机载网络视频;FFmpeg;SDL;多线程;实时监控【作者】郝朝;王灏【作者单位】中国飞行试验研究院,陕西西安 710089;中国飞行试验研究院,陕西西安 710089【正文语种】中文【中图分类】TP311.10 引言在飞行试验中,实时监控是保障飞行安全和提高飞行效率的一个关键环节,要求实时查看飞行器的位置姿态信息和设备的工作状态。
机载视频影像能够以最为直观与准确的方式描述飞机当前的工作状态,为地面飞行指挥人员和试飞工程师提供及时、丰富的信息,对于保障飞行安全、提高试飞效率有不可替代的作用[1]。
在某型飞机的实时监控中,既有传统的PCM数据遥测,也有网络电台遥测。
传统的视频遥测是将数字视频信号以PCM流的形式传输至地面进行解析[2]。
在该型机上,由于任务需求,在机上加装网络摄像头,通过网络电台以RTP/RTCP[3-4]网络数据包的形式进行H.264视频网络化遥测传输。
ffmpeg.dll使用方法
ffmpeg.dll使用方法标题:完整指南:使用ffmpeg.dll的步骤详解引言:FFmpeg是一个开源的跨平台音视频处理工具集,其中的ffmpeg.dll是其动态链接库的文件,它提供了一系列的功能和接口,使得我们可以在自己的应用程序中轻松地使用FFmpeg的强大功能。
本文将提供一步一步的指南,详细说明如何使用ffmpeg.dll来处理音视频文件。
第一步:下载和安装FFmpeg要使用ffmpeg.dll,首先需要从官方网站(第二步:配置环境变量安装完成后,需要将FFmpeg的安装目录添加到系统的环境变量中。
这样,您在应用程序中调用ffmpeg.dll时,系统才能找到它。
要配置环境变量,可以按照以下步骤操作:1. 在桌面上右键单击“我的计算机”,然后选择“属性”。
2. 在系统属性窗口的左侧选择“高级系统设置”。
3. 在弹出的对话框中,点击“环境变量”按钮。
4. 在新对话框中,找到“系统变量”部分,并在其中找到名为“Path”的变量。
5. 选中“Path”变量,并点击“编辑”按钮。
6. 在编辑环境变量窗口中,点击“新建”按钮,并将FFmpeg的安装目录路径添加到列表中。
7. 确认并保存所有更改。
现在,您的系统已经配置好了FFmpeg的环境变量。
第三步:创建一个新的C++项目在使用ffmpeg.dll之前,我们需要创建一个新的C++项目。
您可以使用任何您熟悉的集成开发环境(IDE)来创建一个新的项目,如Visual Studio、Code::Blocks等。
根据您的首选开发环境,创建一个新项目,并添加一个新的源文件作为主程序文件。
第四步:包含ffmpeg头文件在主程序文件中,我们需要包含FFmpeg的头文件,以便在代码中使用FFmpeg的功能和接口。
根据您的操作系统和系统架构(32位或64位),您需要包含正确的头文件。
在C++中,可以使用以下代码来包含FFmpeg 的头文件:cppextern "C" {#include <libavcodec/avcodec.h>#include <libavformat/avformat.h>第五步:连接ffmpeg.dll接下来,我们需要在项目中连接ffmpeg.dll。
C++开源库,欢迎补充。
C++开源库,欢迎补充。
C++在“商业应⽤”⽅⾯,曾经是天下第⼀的开发语⾔,但这⼀桂冠已经被java抢⾛多年。
因为当今商业应⽤程序类型,已经从桌⾯应⽤迅速转移成Web应⽤。
当Java横⾏天下之后,MS⼜突然发⼒,搞出C#语⾔,有⼤⽚的曾经的C++程序员,以为C++要就此沉沦,未料,这三年来,C++的⽣命⼒突然被严重地增强了。
主⼒原因就是开源的软件、基础软件(⽐如并发原⽣⽀持,⽐如Android必定要推出原⽣的SDK)、各种跨平台应⽤的出现。
开源C++库必须具有以下特点:必须是成熟的产品、跨平台的产品、相对通⽤的库。
⼀、通⽤标准类STL:C++标准模板库,呵呵,它也是开源的嘛。
boost:C++准标准库,它是强⼤地,江湖称之“千锤百炼”。
-------若掌握,必横⾏世界。
deelx (轻量级的正则表达式解析类库,国产),boost⾥有强⼤的正则表达式解析库,但如果你只想要⼀个表达式解析,不想要拖上庞⼤的boost库时……⽀持⼀下国货。
iconv /iconvpp : (C形式的编码转换函数库,⼆、XML解析库C++的XML相关库不少,但是⼤部分其实都是C库,使⽤起来⾃然不那么轻便。
其中基于DOM的有TinyXml,基于SAX的当然是Xerces。
前者⼩巧快捷,便于使⽤,适合做数据交换。
后者则是全功能的XML解析器。
哥更倾向于TingyXml.⼩巧啊!xerces-c :最强⼤的XML解析库了,不是仅仅在开源库⾥,你尽管把商业的算在内。
当然,它的变体,被IBM拿去卖钱的那个版本,多了数百兆的东东来⽀持各国编码转换,是更强⼤,但我觉得有⼩⼩的,开源的iconv在前不就够了?对三个轻型xml解析开源库:SlimXml、TinyXml、RapidXml,对⽐如下:解析这个3.3万⾏,1.5M⼤⼩的xml,三个库分别花了SlimXml: 22msTinyXml: 54msRapidXml: 4ms!结论是,RapidXml果然很强悍,居然⽐SlimXml快5倍多。
ffmpeg简介及命令选项参数
ffmpeg简介及命令选项参数一、ffmpeg简介 (1)二、ffmpeg基本用法 (1)三、ffmpeg选项 (1)四、ffmpeg使用 (4)一、ffmpeg简介ffmpeg包括一组软件,ffmpeg用于对媒体文件进行处理,ffserver是一个http的流媒体服务器,ffplay是一个基于SDL的简单播放器。
两个库文件libavcodec和libavformat。
ffmpeg项目由以下几部分组成:●ffmpeg 视频文件转换命令行工具,也支持经过实时电视卡抓取和编码成视频文件。
●ffserver 基于HTTP(RTSP正在开发中)用于实时广播的多媒体服务器,也支持时间平移●ffplay 用SDL和FFmpeg库开发的一个简单的媒体播放器●libavcodec 一个包含了所有FFmpeg音视频编解码器的库.为了保证最优性能和高可复用性,大多数编解码器从头开发的.●libavformat 一个包含了所有的普通音视格式的解析器和产生器的库.二、ffmpeg基本用法ffmpeg作为媒体文件处理软件,基本用法如下:ffmpeg -i INPUTfile [OPTIONS] OUTPUTfile输入输出文件通常就是待处理的多媒体文件了。
可以是纯粹的音频文件,纯粹的视频文件,或者混合的。
大部分常见的格式都能够“通杀”。
象常见的各种mpeg,A VI封装的DIVX 和Xvid等等,具体的格式支持列表可以使用ffmpeg -formats查看或直接查阅文档。
另:由于Linux把设备视为文件,因此-i选项后可以跟设备名。
比如DV,视频卡,光驱或者其它的各类设备。
如果没有输入文件,那么视音频捕捉就会起作用。
作为通用的规则,选项一般用于下一个特定的文件。
如果你给–b 64选项,改选会设置下一个视频速率。
对于原始输入文件,格式选项可能是需要的。
缺省情况下,ffmpeg试图尽可能的无损转换,采用与输入同样的音频视频参数来输出。
嵌入式Linux系统中图片解码和显示的图像处理库
嵌入式Linux系统中图片解码和显示的图像处理库在嵌入式Linux系统中,图片解码和显示是一项重要的功能需求。
为了实现高效、准确地对图片进行解码和显示,我们可以利用图像处理库来提供必要的支持和功能。
本文将探讨嵌入式Linux系统中常用的图像处理库,并介绍它们的特点和用途。
一、libjpeg库libjpeg是一种广泛使用的用于JPEG图像解码和编码的库。
它具有开源、跨平台的特点,可以在嵌入式Linux系统中方便地使用。
libjpeg 库提供了丰富的API接口,可以实现JPEG图像的解码、编码和转换等功能。
通过libjpeg库,我们可以将JPEG图像文件解码为像素数据,或者将像素数据编码为JPEG图像文件进行存储。
二、libpng库libpng是一种用于处理PNG图像格式的库。
PNG图像格式是一种无损压缩的图像格式,广泛应用于嵌入式Linux系统中。
libpng库提供了一组用于解码和编码PNG图像的API接口,可以实现PNG图像的解码和编码操作。
通过libpng库,我们可以将PNG图像文件解码为像素数据,并在嵌入式Linux系统中对其进行显示。
三、SDL库Simple DirectMedia Layer(SDL)是一种多媒体程序开发库,适用于音频、视频和图形处理等领域。
在嵌入式Linux系统中,SDL库可以用于实现图像的解码和显示。
通过SDL库,我们可以方便地加载和显示各种常见的图像文件格式,如JPEG、PNG等。
同时,SDL库还提供了一些方便的功能,如图像的缩放、旋转和混合等,可以用于图像的处理和特效实现。
四、OpenCV库OpenCV是一种计算机视觉和图像处理的开源库,具有丰富的功能和强大的性能。
在嵌入式Linux系统中,OpenCV库可以用于实现图像的解码、处理和显示。
OpenCV库支持多种图像文件格式,如JPEG、PNG和BMP等,可以实现图像文件的解码和转换。
同时,OpenCV库还提供了各种图像处理和计算机视觉算法,如边缘检测、人脸识别等,可以在嵌入式Linux系统中进行图像处理和分析。
SDL+FFmpeg实现音频简单播放
实现音频的基本播放1.新建工程,右击——属性:a)C/C++——常规——附加包含目录:引入ffmpeg和SDL的include目录b)C/C++——所有选项——附加包含目录:引入ffmpeg和SDL的include目录c)链接器——常规——附加库目录:引入ffmpeg和SDL的lib目录d)链接器——输入——附加依赖项:avcodec.lib;avformat.lib;avutil.lib;avdevice.lib;avfilter.lib;postproc.lib;swresample.lib;swscale.lib;SDL.lib;SDLmain.lib;2.新建头文件:stdafx.h包含一些常用的但不经常更改的头文件#pragma once#include<sdkddkver.h>#include<stdlib.h>#include<string.h>#include<stdio.h>#include<tchar.h>extern"C"{#include"libavcodec\avcodec.h"#include"libavformat\avformat.h"#include"libswresample\swresample.h"#include"SDL.h"#include"SDL_thread.h"};3.新建源文件:main.cppA)包含头文件:#include"stdafx.h"B)创建主程序:#define MAX_AUDIO_FRAME_SIZE 192000static Uint8 *audio_chunk;//音频块static Uint32 audio_len;//音频长度static Uint8 *audio_pos;//播放到的位置//回调函数void fill_audio(void *udata,Uint8 *stream,int len){if(audio_len==0)return;//有数据剩余时播放len=(len>audio_len?audio_len:len);//混合尽可能多的数据SDL_MixAudio(stream,audio_pos,len,SDL_MIX_MAXVOLUME);//混合两个音频缓冲,最后一个参数为音量大小,范围从0—SDL_MIX_MAXVOLUMEaudio_pos+=len;audio_len-=len;}int_tmain(int argc,_TCHAR *argv[]){char filepath[]="S.H.E - 梦田.mp3";//文件路径//1.初始化av_register_all();//2.打开文件AVFormatContext *pFormatCtx;pFormatCtx=avformat_alloc_context();if(avformat_open_input(&pFormatCtx,filepath,NULL,NULL)){return -1;}//3.获取音频信息并输出if(avformat_find_stream_info(pFormatCtx,NULL)){return -1;}av_dump_format(pFormatCtx,0,filepath,false);//4.查找第一个音频流,并记录该流的编码序号int audioStream=-1;for(int i=0;i<pFormatCtx->nb_streams;i++){if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO){audioStream=i;break;}}if(audioStream==-1){return -1;}//5.得到音频流上下文编码的指针AVCodecContext *aCodecCtx;aCodecCtx=pFormatCtx->streams[audioStream]->codec;//6.查找音频流解码器AVCodec *aCodec;aCodec=avcodec_find_decoder(aCodecCtx->codec_id);if(aCodec==NULL){return -1;}//7.打开解码器if(avcodec_open2(aCodecCtx,aCodec,NULL)){return -1;}//8.设置输出的音频参数uint64_t out_channel_layout=AV_CH_LAYOUT_STEREO;//设置输出通道,此处为立体声int out_nb_samples=1024;//音频缓存AVSampleFormat out_sample_fmt=AV_SAMPLE_FMT_S16;//采样格式int out_sample_rate=44100;//采样频率int out_channels=av_get_channel_layout_nb_channels(out_channel_layout);//返回通道数intout_buffer_size=av_samples_get_buffer_size(NULL,out_channels,out_nb_samples,out_sample_ fmt,1);//获得给定的音频参数所需的缓冲区大小。
windows下使用MinGW编译ffmpeg+x265
Windows下使用MinGW编译ffmpeg与x265测试系统:Windows XP SP3 x86 & Windows 8.1 x642014年4月21日luofl19921、准备工作MinGW下载地址:/projects/mingw/files/点选:Installer>>进行下载,完成后开始安装 MinGW,前面的安装设置保持默认,进入到这里后,先在Basic Setup里面选择这样几项:-base -g++ -developer-toolkit如下图:接着在All packages选MSYS里面的 system-builder:选择完毕后,点Installations菜单,选择apply changes,然后确认开始下载这些库(约126个包需要下载)。
下载完成后,界面上会提示完毕,点击close按钮即可。
然后下载yasm,是一个exe文件放到MinGW的安装目录的bin文件夹,重命名为yasm.exe,或者msys/1.0/bin目录下。
下面开始的编译相应库和ffmpeg的操作需要使用MSYS,要修改C:\MinGW\msys\1.0\etc目下的fstab文件,如果不存在fstab,复制一份fstab.sample到当前目录,然后改名为:fstab,再修改其内容为C:/MinGW/mingw /minGW其中前面是MinGW的安装目录,也即为MinGW的安装路径,否则后面编译库的时候会提示缺少头文件。
下面的操作,需要在命令行下完成,不同的是通过msys进入,即运行C:\MinGW\msys\1.0目录下的msys.bat批处理文件,进入一个模拟linux系统的命令行。
如下图,注意切换目录时,相对目录与windows下一致,切换到其他盘时不同,如下图:2、编译ffmpegffmpeg可以到/releases/ 下载,我下载的是最新版本2.2版。
(注意下载的文件后缀名应该是.tar.gz如果下载下来没有这两个点的后缀,请自己加上再解压)或者:https:///FFmpeg/FFmpeg点界面右边的Download Zip下载。
ffmpeg.dll使用方法
ffmpeg.dll使用方法【原创实用版3篇】目录(篇1)1.ffmpeg.dll是什么?2.ffmpeg.dll的使用方法3.ffmpeg.dll的常见问题及解决方法4.总结正文(篇1)一、ffmpeg.dll是什么?ffmpeg.dll是FFmpeg的动态链接库文件,它包含了FFmpeg的各种函数和类,用于实现音视频的编解码、转码和处理。
当你在Windows系统中使用FFmpeg时,它会加载这个动态链接库文件,使得你可以调用其中的函数来实现各种音视频处理功能。
二、ffmpeg.dll的使用方法1.安装FFmpeg:首先需要安装FFmpeg,可以从官方网站下载安装包,根据提示进行安装。
2.加载库文件:在需要使用ffmpeg.dll的程序中,需要先加载这个库文件。
可以使用以下代码:```c#System.Runtime.InteropServices.DllImport("ffmpeg.dll")```3.调用函数:在加载库文件后,就可以使用其中的函数来进行音视频处理了。
例如,以下代码将一个视频文件从MP4格式转换为AVI格式:```c#public static void ConvertVideo(string inputFilePath, string outputFilePath){// 加载库文件DllImport("ffmpeg.dll").Load();// 定义参数string[] args = { "-i", inputFilePath, "-c:v", "libx264", "-c:a", "copy", outputFilePath };// 调用函数进行转换DllImport("ffmpeg.dll").ConvertVideo(args);}```以上代码中,我们首先加载了ffmpeg.dll库文件,然后定义了转换参数args,包括输入文件路径、输出文件路径、视频编解码器等参数。
ffplay源码分析6-音频重采样
ffplay源码分析6-⾳频重采样在尝试分析源码前,可先阅读如下参考⽂章作为铺垫:[1].[2].[3].[4].[5].“ffplay源码分析”系列⽂章如下:[1].[2].[3].[4].[5].[6].[7].6. ⾳频重采样FFmpeg解码得到的⾳频帧的格式未必能被SDL⽀持,在这种情况下,需要进⾏⾳频重采样,即将⾳频帧格式转换为SDL⽀持的⾳频格式,否则是⽆法正常播放的。
⾳频重采样涉及两个步骤:1. 打开⾳频设备时进⾏的准备⼯作:确定SDL⽀持的⾳频格式,作为后期⾳频重采样的⽬标格式2. ⾳频播放线程中,取出⾳频帧后,若有需要(⾳频帧格式与SDL⽀持⾳频格式不匹配)则进⾏重采样,否则直接输出6.1 打开⾳频设备⾳频设备的打开实际是在解复⽤线程中实现的。
解复⽤线程中先打开⾳频设备(设定⾳频回调函数供SDL⾳频播放线程回调),然后再创建⾳频解码线程。
调⽤链如下:main() -->stream_open() -->read_thread() -->stream_component_open() -->audio_open(is, channel_layout, nb_channels, sample_rate, &is->audio_tgt);decoder_start(&is->auddec, audio_thread, is);audio_open()函数填⼊期望的⾳频参数,打开⾳频设备后,将实际的⾳频参数存⼊输出参数is->audio_tgt中,后⾯⾳频播放线程⽤会⽤到此参数,使⽤此参数将原始⾳频数据重采样,转换为⾳频设备⽀持的格式。
static int audio_open(void *opaque, int64_t wanted_channel_layout, int wanted_nb_channels, int wanted_sample_rate, struct AudioParams *audio_hw_params){SDL_AudioSpec wanted_spec, spec;const char *env;static const int next_nb_channels[] = {0, 0, 1, 6, 2, 6, 4, 6};static const int next_sample_rates[] = {0, 44100, 48000, 96000, 192000};int next_sample_rate_idx = FF_ARRAY_ELEMS(next_sample_rates) - 1;env = SDL_getenv("SDL_AUDIO_CHANNELS");if (env) { // 若环境变量有设置,优先从环境变量取得声道数和声道布局wanted_nb_channels = atoi(env);wanted_channel_layout = av_get_default_channel_layout(wanted_nb_channels);}if (!wanted_channel_layout || wanted_nb_channels != av_get_channel_layout_nb_channels(wanted_channel_layout)) {wanted_channel_layout = av_get_default_channel_layout(wanted_nb_channels);wanted_channel_layout &= ~AV_CH_LAYOUT_STEREO_DOWNMIX;}// 根据channel_layout获取nb_channels,当传⼊参数wanted_nb_channels不匹配时,此处会作修正wanted_nb_channels = av_get_channel_layout_nb_channels(wanted_channel_layout);wanted_spec.channels = wanted_nb_channels; // 声道数wanted_spec.freq = wanted_sample_rate; // 采样率if (wanted_spec.freq <= 0 || wanted_spec.channels <= 0) {av_log(NULL, AV_LOG_ERROR, "Invalid sample rate or channel count!\n");return -1;}while (next_sample_rate_idx && next_sample_rates[next_sample_rate_idx] >= wanted_spec.freq)next_sample_rate_idx--; // 从采样率数组中找到第⼀个不⼤于传⼊参数wanted_sample_rate的值// ⾳频采样格式有两⼤类型:planar和packed,假设⼀个双声道⾳频⽂件,⼀个左声道采样点记作L,⼀个右声道采样点记作R,则:// planar存储格式:(plane1)LLLLLLLL...LLLL (plane2)RRRRRRRR...RRRR// packed存储格式:(plane1)LRLRLRLR...........................LRLR// 在这两种采样类型下,⼜细分多种采样格式,如AV_SAMPLE_FMT_S16、AV_SAMPLE_FMT_S16P等,注意SDL2.0⽬前不⽀持planar格式// channel_layout是int64_t类型,表⽰⾳频声道布局,每bit代表⼀个特定的声道,参考channel_layout.h中的定义,⼀⽬了然// 数据量(bits/秒) = 采样率(Hz) * 采样深度(bit) * 声道数wanted_spec.format = AUDIO_S16SYS; // 采样格式:S表带符号,16是采样深度(位深),SYS表采⽤系统字节序,这个宏在SDL中定义wanted_spec.silence = 0; // 静⾳值wanted_spec.samples = FFMAX(SDL_AUDIO_MIN_BUFFER_SIZE, 2 << av_log2(wanted_spec.freq / SDL_AUDIO_MAX_CALLBACKS_PER_SEC)); // SDL声⾳缓冲区尺⼨,单位是单声道采样 wanted_spec.callback = sdl_audio_callback; // 回调函数,若为NULL,则应使⽤SDL_QueueAudio()机制wanted_erdata = opaque; // 提供给回调函数的参数// 打开⾳频设备并创建⾳频处理线程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ffmpeg与sdl电影文件有很多基本的组成部分。
首先,文件本身被称为容器Container,容器的类型决定了信息被存放在文件中的位置。
AVI和Quicktime就是容器的例子。
接着,你有一组流,例如,你经常有的是一个音频流和一个视频流。
(一个流只是一种想像出来的词语,用来表示一连串的通过时间来串连的数据元素)。
在流中的数据元素被称为帧Frame。
每个流是由不同的编码器来编码生成的。
编解码器描述了实际的数据是如何被编码Coded和解码DECoded的,因此它的名字叫做CODEC。
Divx和MP3就是编解码器的例子。
接着从流中被读出来的叫做包Packets。
包是一段数据,它包含了一段可以被解码成方便我们最后在应用程序中操作的原始帧的数据。
根据我们的目的,每个包包含了完整的帧或者对于音频来说是许多格式的完整帧。
基本上来说,处理视频和音频流是很容易的:在这个程序中使用ffmpeg来处理多种媒体是相当容易的,虽然很多程序可能在对帧进行操作的时候非常的复杂。
因此在这篇指导中,我们将打开一个文件,读取里面的视频流,而且我们对帧的操作将是把这个帧写到一个PPM文件中。
打开文件首先,来看一下我们如何打开一个文件。
通过ffmpeg,你必需先初始化这个库。
(注意在某些系统中必需用<ffmpeg/avcodec.h>和<ffmpeg/avformat.h>来替换)这里注册了所有的文件格式和编解码器的库,所以它们将被自动的使用在被打开的合适格式的文件上。
注意你只需要调用av_register_all()一次,因此我们在主函数main()中来调用它。
如果你喜欢,也可以只注册特定的格式和编解码器,但是通常你没有必要这样做。
现在我们可以真正的打开文件:我们通过第一个参数来获得文件名。
这个函数读取文件的头部并且把信息保存到我们给的AVFormatCont ext结构体中。
最后三个参数用来指定特殊的文件格式,缓冲大小和格式参数,但如果把它们设置为空NULL或者0,libavformat将自动检测这些参数。
这个函数只是检测了文件的头部,所以接着我们需要检查在文件中的流的信息:这个函数为pFormatCtx->streams填充上正确的信息。
我们引进一个手工调试的函数来看一下里面有什么:现在pFormatCtx->streams仅仅是一组大小为pFormatCtx->nb_streams的指针,所以让我们先跳过它直到我们找到一个视频流。
流中关于编解码器的信息就是被我们叫做"codec context"(编解码器上下文)的东西。
这里面包含了流中所使用的关于编解码器的所有信息,现在我们有了一个指向他的指针。
但是我们必需要找到真正的编解码器并且打开它:有些人可能会从旧的指导中记得有两个关于这些代码其它部分:添加CODEC_FLAG_TRUNCATED到p CodecCtx->flags和添加一个hack来粗糙的修正帧率。
这两个修正已经不在存在于ffplay.c中。
因此,我必需假设它们不再必要。
我们移除了那些代码后还有一个需要指出的不同点:pCodecCtx->time_base现在已经保存了帧率的信息。
time_base是一个结构体,它里面有一个分子和分母(AVRational)。
我们使用分数的方式来表示帧率是因为很多编解码器使用非整数的帧率(例如NTSC使用29.97fps)。
保存数据现在我们需要找到一个地方来保存帧:因为我们准备输出保存24位RGB色的PPM文件,我们必需把帧的格式从原来的转换为RGB。
FFMPE G将为我们做这些转换。
在大多数项目中(包括我们的这个)我们都想把原始的帧转换成一个特定的格式。
让我们先为转换来申请一帧的内存。
即使我们申请了一帧的内存,当转换的时候,我们仍然需要一个地方来放置原始的数据。
我们使用avpict ure_get_size来获得我们需要的大小,然后手工申请内存空间:av_malloc是ffmpeg的malloc,用来实现一个简单的malloc的包装,这样来保证内存地址是对齐的(4字节对齐或者2字节对齐)。
它并不能保护你不被内存泄漏,重复释放或者其它malloc的问题所困扰。
现在我们使用avpicture_fill来把帧和我们新申请的内存来结合。
关于AVPicture的结成:AVPicture结构体是AVFrame结构体的子集――AVFrame结构体的开始部分与AVPicture结构体是一样的。
最后,我们已经准备好来从流中读取数据了。
读取数据我们将要做的是通过读取包来读取整个视频流,然后把它解码成帧,最好后转换格式并且保存。
这个循环过程是比较简单的:av_read_frame()读取一个包并且把它保存到AVPacket结构体中。
注意我们仅仅申请了一个包的结构体――ffmpeg为我们申请了内部的数据的内存并通过packet.data指针来指向它。
这些数据可以在后面通过av_free_packet()来释放。
函数avcodec_decode_video()把包转换为帧。
然而当解码一个包的时候,我们可能没有得到我们需要的关于帧的信息。
因此,当我们得到下一帧的时候,avco dec_decode_video()为我们设置了帧结束标志frameFinished。
最后,我们使用img_convert()函数来把帧从原始格式(pCodecCtx->pix_fmt)转换成为RGB格式。
要记住,你可以把一个AVFrame结构体的指针转换为AVPicture结构体的指针。
最后,我们把帧和高度宽度信息传递给我们的SaveFrame函数。
现在我们需要做的是让SaveFrame函数能把RGB信息定稿到一个PPM格式的文件中。
我们将生成一个简单的PPM格式文件,请相信,它是可以工作的。
我们做了一些标准的文件打开动作,然后写入RGB数据。
我们一次向文件写入一行数据。
PPM格式文件的是一种包含一长串的RGB数据的文件。
如果你了解HTML色彩表示的方式,那么它就类似于把每个像素的颜色头对头的展开,就像#ff0000#ff0000....就表示了了个红色的屏幕。
(它被保存成二进制方式并且没有分隔符,但是你自己是知道如何分隔的)。
文件的头部表示了图像的宽度和高度以及最大的RGB值的大小。
现在,回顾我们的main()函数。
一旦我们开始读取完视频流,我们必需清理一切:你会注意到我们使用av_free来释放我们使用avcode_alloc_fram和av_malloc来分配的内存。
上面的就是代码!下面,我们将使用Linux或者其它类似的平台,你将运行:如果你使用的是老版本的ffmpeg,你可以去掉-lavutil参数:大多数的图像处理函数可以打开PPM文件。
可以使用一些电影文件来进行测试。
SDL和视频为了在屏幕上显示,我们将使用SDL.SDL是Simple Direct Layer的缩写。
它是一个出色的多媒体库,适用于多平台,并且被用在许多工程中。
你可以从它的官方网站的网址/上来得到这个库的源代码或者如果有可能的话你可以直接下载开发包到你的操作系统中。
按照这个指导,你将需要编译这个库。
(剩下的几个指导中也是一样)SDL库中有许多种方式来在屏幕上绘制图形,而且它有一个特殊的方式来在屏幕上显示图像――这种方式叫做YUV覆盖。
YUV(从技术上来讲并不叫YUV而是叫做YCbCr)是一种类似于RGB方式的存储原始图像的格式。
粗略的讲,Y是亮度分量,U和V是色度分量。
(这种格式比RGB复杂的多,因为很多的颜色信息被丢弃了,而且你可以每2个Y有1个U和1个V)。
SDL的YUV覆盖使用一组原始的YUV 数据并且在屏幕上显示出他们。
它可以允许4种不同的YUV格式,但是其中的YV12是最快的一种。
还有一个叫做YUV420P的YUV格式,它和YV12是一样的,除了U和V分量的位置被调换了以外。
420意味着它以4:2:0的比例进行了二次抽样,基本上就意味着1个颜色分量对应着4个亮度分量。
所以它的色度信息只有原来的1/4。
这是一种节省带宽的好方式,因为人眼感觉不到这种变化。
在名称中的P表示这种格式是平面的――简单的说就是Y,U和V分量分别在不同的数组中。
FFMPEG可以把图像格式转换为YUV420P,但是现在很多视频流的格式已经是YUV420P的了或者可以被很容易的转换成YUV420P格式。
于是,我们现在计划把指导1中的SaveFrame()函数替换掉,让它直接输出我们的帧到屏幕上去。
但一开始我们必需要先看一下如何使用SDL库。
首先我们必需先包含SDL库的头文件并且初始化它。
SDL_Init()函数告诉了SDL库,哪些特性我们将要用到。
当然SDL_GetError()是一个用来手工除错的函数。
创建一个显示现在我们需要在屏幕上的一个地方放上一些东西。
在SDL中显示图像的基本区域叫做面surface。
这就创建了一个给定高度和宽度的屏幕。
下一个选项是屏幕的颜色深度――0表示使用和当前一样的深度。
(这个在OS X系统上不能正常工作,原因请看源代码)现在我们在屏幕上来创建一个YUV覆盖以便于我们输入视频上去:正如前面我们所说的,我们使用YV12来显示图像。
显示图像前面那些都是很简单的。
现在我们需要来显示图像。
让我们看一下是如何来处理完成后的帧的。
我们将原来对RGB处理的方式,并且替换SaveFrame()为显示到屏幕上的代码。
为了显示到屏幕上,我们将先建立一个AVPicture结构体并且设置其数据指针和行尺寸来为我们的YUV覆盖服务:首先,我们锁定这个覆盖,因为我们将要去改写它。
这是一个避免以后发生问题的好习惯。
正如前面所示的,这个AVPicture结构体有一个数据指针指向一个有4个元素的指针数据。
由于我们处理的是YUV420 P,所以我们只需要3个通道即只要三组数据。
其它的格式可能需要第四个指针来表示alpha通道或者其它参数。
行尺寸正如它的名字表示的意义一样。
在YUV覆盖中相同功能的结构体是像素pixel和程度pitc h。
(程度pitch是在SDL里用来表示指定行数据宽度的值)。
所以我们现在做的是让我们的覆盖中的pic t.data中的三个指针有一个指向必要的空间的地址。
类似的,我们可以直接从覆盖中得到行尺寸信息。
像前面一样我们使用img_convert来把格式转换成PIX_FMT_YUV420P。
绘制图像但我们仍然需要告诉SDL如何来实际显示我们给的数据。
我们也会传递一个表明电影位置、宽度、高度和缩放大小的矩形参数给SDL的函数。
这样,SDL为我们做缩放并且它可以通过显卡的帮忙来进行快速缩放。
现在我们的视频显示出来了!让我们再花一点时间来看一下SDL的特性:它的事件驱动系统。