中国科学技术大学电子工程与信息科学系©2020 实验十九SDL+ffmpeg播放mp4 实验目的 (1)学习Visual Studio中SDL编程的流程。 (2)了解ffmpeg工具包作用。 (3) 学习ffmpeg工具包中命令行的使用。 (4)学习Visual Studio中基于ffmpeg库编程的流程。 二、 实验原理 1、SDL SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库, 使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者 只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、.Mac OS X等)的应用软件。目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体 应用领域。 官网:http://libsdl..org 官方文档:http:wiki.libsdl.org/FrontPage 在SDL2.0中,提供了如下不同类别的函数[1]:Basics、Video、Input Events、 Force Feedback、Audio、Threads、Timers、File Abstraction、Shared Object Support、. Platform and CPU Information,Power Management,Additional Functionality 2、ffmpeg FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用 LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。 FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行, 包括Windows、Mac OS X等。FFmpeg有非常强大的功能包括视频采集功能、视 频格式转换、视频抓图、给视频加水印等。 FFmpeg有三种版本。静态库(static)版本里面有3个exe:ffmpeg,exe, ffplay.exe,ffprobe.exe,每个exe体积很大,因为相关的dl已经被编译到exe 里面去了。作为工具而言此版本就可以满足一般应用的需求。动态库(shared) 版本,里面有3个exe:ffmpeg.exe,ffplay..exe,ffprobe.exe,还有一些dl。Shared 版本里面的exe体积很小,这些exe在运行的时候,到相应的dl中调用功能。 程序运行过程必须依赖于提供的dl文件。开发者(dv)版本,是用于开发的, 里面包含了库文件xxx.lib以及头文件xxx.h,这个版本不包含exe文件。 三、 示例说明 实验示例由[2]例子改编而来。在Visual Studio2017环境测试通过。代码中 如果您在阅读过程中发现疏漏和错误,请联系《多媒体技术基础》课程组{network,cxh}@ustc.edu.cn
中国科学技术大学电子工程与信息科学系© 2020 如果您在阅读过程中发现疏漏和错误,请联系《多媒体技术基础》课程组{network,cxh}@ustc.edu.cn 实验十九 SDL+ffmpeg 播放 mp4 一、 实验目的 (1) 学习 Visual Studio 中 SDL 编程的流程。 (2) 了解 ffmpeg 工具包作用。 (3) 学习 ffmpeg 工具包中命令行的使用。 (4) 学习 Visual Studio 中基于 ffmpeg 库编程的流程。 二、 实验原理 1、SDL SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库, 使用 C 语言写成。SDL 提供了数种控制图像、声音、输出入的函数,让开发者 只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS X 等)的应用软件。目前 SDL 多用于开发游戏、模拟器、媒体播放器等多媒体 应用领域。 官网:http://libsdl.org/ 官方文档:http://wiki.libsdl.org/FrontPage 在 SDL2.0 中,提供了如下不同类别的函数[1]:Basics、Video、Input Events、 Force Feedback、Audio、Threads、Timers、File Abstraction、Shared Object Support、 Platform and CPU Information、Power Management、Additional Functionality。 2、ffmpeg FFmpeg 是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用 LGPL 或 GPL 许可证。它提供了录制、转换以及流化音视频的完整解决方案。 FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行, 包括 Windows、Mac OS X 等。FFmpeg 有非常强大的功能包括视频采集功能、视 频格式转换、视频抓图、给视频加水印等。 FFmpeg 有三种版本。静态库(static)版本里面有 3 个 exe: ffmpeg.exe, ffplay.exe, ffprobe.exe,每个 exe 体积很大,因为相关的 dll 已经被编译到 exe 里面去了。作为工具而言此版本就可以满足一般应用的需求。动态库(shared) 版本,里面有 3 个 exe:ffmpeg.exe,ffplay.exe,ffprobe.exe,还有一些 dll。Shared 版本里面的 exe 体积很小,这些 exe 在运行的时候,到相应的 dll 中调用功能。 程序运行过程必须依赖于提供的 dll 文件。开发者(dev)版本,是用于开发的, 里面包含了库文件 xxx.lib 以及头文件 xxx.h,这个版本不包含 exe 文件。 三、 示例说明 实验示例由[2]例子改编而来。在 Visual Studio 2017 环境测试通过。代码中
中国科学技术大学电子工程与信息科学系©2020 需要阅读的源文件是SDL ffmpeg player.cpp,使用前请阅读源代码中注释信息。 示例代码编译连接前需要修改项目属性中: ●头文件包含路径,含SDL和ffmpeg ●库文件包含路径,含SDL和ffmpeg ●需要输入的库文件,*.ib 另外需要修改代码中:拟播放的mp4文件名称。需要的MP4测试文件,自 行下载,如可从以下链接下载: http://clips.vorwaerts-gmbh.de/big buck bunny.mp4 http://vjs.zencdn.net/v/oceans.mp4 https://media.w3.org/2010/05/sintel/trailer.mp4 http://mirror.aarnet.edu.au/pub/TED-talks/ 示例代码生成EXE后,需要拷贝有关的DLL至EXE文件所在目录。具体 需要拷贝的DLL名称参见上级内容部分说明。 四、上机内容 1、SDL环境配置 (1)下载SDL软件包 从http:/libsdl..org下载Development Libraries中VC对应的版本。实验示例 编写时(2020.10.19)最新版本为SDL2-devel-2.0.12-VC.zip(Visual C+32/64-bit). 下载后的软件包解压后备用。 (2)阅读SDL文档[3]. (3)Visual Studio下测试SDL 依据[4]教程,在Visual Studio下新建一个项目(Console类型的项目),设置 项目属性。需要配置: ●Setting the Include Path,例如E:project202oSDL2-2.0.l2 include; ●Setting the Library Path,例如E:project2020SDL2-2.0.l2lib; Adding the Library Dependencies,SDL2.lib;SDL2main.lib; (4)测试如下代码, #include #include int main(int,char**) if(SDL Init(SDL INIT VIDEO)!=0){ std::cout <"SDL Init Error:"<SDL GetError()<<std:endl; return 1; SDL Quit(); return 0: } 注意:生成EXE后,运行前需要把SDL2.DLL拷贝到和EXE文件相同的目录 下。并且,依据Visual Studio中配置是x64还是x86,要拷贝对应的DLL版本。 如果您在阅读过程中发现疏漏和错误,请联系《多媒体技术基础》课程组{network,cxh}@ustc.edu.cn
中国科学技术大学电子工程与信息科学系© 2020 如果您在阅读过程中发现疏漏和错误,请联系《多媒体技术基础》课程组{network,cxh}@ustc.edu.cn 需要阅读的源文件是 SDL_ffmpeg_player.cpp,使用前请阅读源代码中注释信息。 示例代码编译连接前需要修改项目属性中: 头文件包含路径,含 SDL 和 ffmpeg 库文件包含路径,含 SDL 和 ffmpeg 需要输入的库文件,*.lib 另外需要修改代码中:拟播放的 mp4 文件名称。需要的 MP4 测试文件,自 行下载,如可从以下链接下载: http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4 http://vjs.zencdn.net/v/oceans.mp4 https://media.w3.org/2010/05/sintel/trailer.mp4 http://mirror.aarnet.edu.au/pub/TED-talks/ 示例代码生成 EXE 后,需要拷贝有关的 DLL 至 EXE 文件所在目录。具体 需要拷贝的 DLL 名称参见上级内容部分说明。 四、 上机内容 1、SDL 环境配置 (1) 下载 SDL 软件包 从 http://libsdl.org/下载 Development Libraries 中 VC 对应的版本。实验示例 编写时(2020.10.19)最新版本为 SDL2-devel-2.0.12-VC.zip (Visual C++ 32/64-bit)。 下载后的软件包解压后备用。 (2) 阅读 SDL 文档[3]。 (3) Visual Studio 下测试 SDL 依据[4]教程,在 Visual Studio 下新建一个项目(Console 类型的项目),设置 项目属性。需要配置: Setting the Include Path,例如 E:\project_2020\SDL2-2.0.12\include; Setting the Library Path,例如 E:\project_2020\SDL2-2.0.12\lib; Adding the Library Dependencies, SDL2.lib; SDL2main.lib; (4) 测试如下代码, #include #include int main(int, char**){ if (SDL_Init(SDL_INIT_VIDEO) != 0){ std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl; return 1; } SDL_Quit(); return 0; } 注意:生成 EXE 后,运行前需要把 SDL2.DLL 拷贝到和 EXE 文件相同的目录 下。并且,依据 Visual Studio 中配置是 x64 还是 x86,要拷贝对应的 DLL 版本
中国科学技术大学电子工程与信息科学系©2020 2、ffmpeg环境测试 (5)下载ffmpeg。目前官网(https:/ffmpeg.org/download.html)给出2个可下 载Windows用版本的网址: https://www.gyan.dev/ffmpeg/builds/ https://github.com/BtbN/FFmpeg-Builds/releases 但是最新版本调试过程有问题,实验示例调试过程采用的是ffmpeg-4.2.3 win64-dev ffmpeg-4.2.3-win64-shared. (6)了解“FFmpeg Tools”中的三个程序的作用。阅读ffprobe帮助文档 (htps:/ffmpeg.org/fprobe.html);阅读ffmpeg帮助文档 (https://ffmpeg..org/ffmpeg.html);阅读ffplay帮助文档 (https://ffmpeg.org/ffplay.html). (7)使用ffplay播放mp4文件。尝试播放过程中控制操作(暂停、继续、增加 音量、减小音量.):改变显示窗口的大小。 (8)在使用ffmpeg前,需要配置Visual Studio,可参考[S]。在Visual Studio下 新建一个项目(Console类型),弄成如下配置: a)添加头文件目录,C例如,E.\cxh_work\FFmpeg\ffmpeg-4.2.3-win64- dev\include; b)添加库文件目录,例如,E:cxh_work\FFmpeg\ffmpeg-4.2.3-win64-devllib; c)添加附加依赖库,顺序为:avcodec..lib;avformat.lib,avutil.lib;avdevice.lib; avfilter.lib;postproc.lib;swresample.lib;swscale.lib; (9)测试如下代码, #include "pch.h" #include extern "C"{ #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" } int main(int argc,char*argv[]){ printf("%s\nOK!",avcodec configuration(): return 0; } 注意:生成EXE后,运行前需要把几个DLL(avcodec-58.dll avdevice-58.dl avfilter-7.dll avformat-58.dll avutil-56.dll postproc-55.dll swresample-3.dll swscale-5.dl)拷贝到和EXE文件相同的目录下。并且,依据Visual Studio中配 置是x64还是x86,要拷贝对应的DLL版本。 3、调试示例代码 (10)将示例SDL ffmpeg_player.rar解压后用Visual Studio打开项目。参考代码 (SDL_ffmpeg_player..cpp)中注释信息,修改项目属性的头文件包含目录、 如果您在阅读过程中发现疏漏和错误,请联系《多媒体技术基础》课程组{network,.cxh}@ustc.edu.cn
中国科学技术大学电子工程与信息科学系© 2020 如果您在阅读过程中发现疏漏和错误,请联系《多媒体技术基础》课程组{network,cxh}@ustc.edu.cn 2、ffmpeg 环境测试 (5) 下载 ffmpeg。目前官网(https://ffmpeg.org/download.html)给出 2 个可下 载 Windows 用版本的网址: https://www.gyan.dev/ffmpeg/builds/ https://github.com/BtbN/FFmpeg-Builds/releases 但是最新版本调试过程有问题,实验示例调试过程采用的是 ffmpeg-4.2.3- win64-dev 和 ffmpeg-4.2.3-win64-shared。 (6) 了解“FFmpeg Tools”中的三个程序的作用。阅读 ffprobe 帮助文档 ( https://ffmpeg.org/ffprobe.html ) ; 阅 读 ffmpeg 帮 助 文 档 ( https://ffmpeg.org/ffmpeg.html ) ; 阅 读 ffplay 帮 助 文 档 (https://ffmpeg.org/ffplay.html)。 (7) 使用 ffplay 播放 mp4 文件。尝试播放过程中控制操作(暂停、继续、增加 音量、减小音量…);改变显示窗口的大小。 (8) 在使用 ffmpeg 前,需要配置 Visual Studio,可参考[5]。在 Visual Studio 下 新建一个项目(Console 类型),弄成如下配置: a) 添加头文件目录,C 例如,E:\cxh_work\FFmpeg\ffmpeg-4.2.3-win64- dev\include; b) 添加库文件目录,例如,E:\cxh_work\FFmpeg\ffmpeg-4.2.3-win64-dev\lib; c) 添加附加依赖库,顺序为:avcodec.lib; avformat.lib; avutil.lib; avdevice.lib; avfilter.lib;postproc.lib;swresample.lib; swscale.lib; (9) 测试如下代码, #include "pch.h" #include extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" } int main(int argc, char* argv[]) { printf("%s\nOK!", avcodec_configuration()); return 0; } 注意:生成 EXE 后,运行前需要把几个 DLL(avcodec-58.dll avdevice-58.dll avfilter-7.dll avformat-58.dll avutil-56.dll postproc-55.dll swresample-3.dll swscale-5.dll)拷贝到和 EXE 文件相同的目录下。并且,依据 Visual Studio 中配 置是 x64 还是 x86,要拷贝对应的 DLL 版本。 3、调试示例代码 (10)将示例 SDL_ffmpeg_player.rar 解压后用 Visual Studio 打开项目。参考代码 (SDL_ffmpeg_player.cpp)中注释信息,修改项目属性的头文件包含目录
中国科学技术大学电子工程与信息科学系©2020 库文件包含目录、指定需要输入的库文件(*.1b)。 (11)测试播放mp4文件的效果。 4、完善示例代码(*选作) (12)在示例代码上添加播放控制功能(如暂停、停止、视频适应窗口大小进行 缩放)。 五、 思考题 (13)查阅SDL文档[3],说明SDL Create Window的作用是什么? (14)示例程序只能播放连续的图像,不能播放声音。自行查询资料,如果在播 放连续图像的同时还播放声音,需要做哪些扩展? 参考文献 [] S. Wiki.SDL 2.0 API by Category. Available: http://wiki.libsdl.org/APIByCategory [2] 简书-MzDavid.(2019).FFmpeg+SDL2实现视频流播放.Available: https://www.jianshu.com/p/002060731418 [3] S.Wiki.Simple DirectMedia Layer:SDL Tutorials. Available: http://wiki.libsdl.org/&http://wiki.libsdl.org/Tutorials [4] S.I.Will Usher,University of Utah.TwinklebearDev SDL 2.0 Tutorial,Lesson 0:Setting up SDL.Available:https://www.willusher.io/pages/sdl2/& https://www.willusher.io/sd12%20tutorials/2013/08/15/lesson-0-visual-studio [5] cnblogs-.灰色飘零.(2019).S2017配置FFmpeg开发环境.Available: https://www.cnblogs.com/renhui/p/10387764.html 如果您在阅读过程中发现疏漏和错误,请联系《多媒体技术基础》课程组{network,cxh}@ustc.edu.cn
中国科学技术大学电子工程与信息科学系© 2020 如果您在阅读过程中发现疏漏和错误,请联系《多媒体技术基础》课程组{network,cxh}@ustc.edu.cn 库文件包含目录、指定需要输入的库文件(*.lib)。 (11)测试播放 mp4 文件的效果。 4、完善示例代码(*选作) (12)在示例代码上添加播放控制功能(如暂停、停止、视频适应窗口大小进行 缩放)。 五、 思考题 (13)查阅 SDL 文档[3],说明 SDL_CreateWindow 的作用是什么? (14)示例程序只能播放连续的图像,不能播放声音。自行查询资料,如果在播 放连续图像的同时还播放声音,需要做哪些扩展? 参考文献 [1] S. Wiki. SDL 2.0 API by Category. Available: http://wiki.libsdl.org/APIByCategory [2] 简 书 -MzDavid. (2019). FFmpeg+SDL2 实 现 视 频 流 播 放 . Available: https://www.jianshu.com/p/002060731418 [3] S. Wiki. Simple DirectMedia Layer: SDL Tutorials. Available: http://wiki.libsdl.org/ & http://wiki.libsdl.org/Tutorials [4] S. I. Will Usher, University of Utah. TwinklebearDev SDL 2.0 Tutorial, Lesson 0: Setting up SDL. Available: https://www.willusher.io/pages/sdl2/ & https://www.willusher.io/sdl2%20tutorials/2013/08/15/lesson-0-visual-studio [5] cnblogs-灰色飘零. (2019). VS 2017 配置 FFmpeg 开发环境. Available: https://www.cnblogs.com/renhui/p/10387764.html