logo资料库

使用FFmpeg和Qt制作图形化转码工具.pdf

第1页 / 共31页
第2页 / 共31页
第3页 / 共31页
第4页 / 共31页
第5页 / 共31页
第6页 / 共31页
第7页 / 共31页
第8页 / 共31页
资料共31页,剩余部分请下载后查看
使用 FFmpeg 和 Qt 制作 转码工具 by 捉不住的鼬鼠 2017-09-18
目 录 1 开始 .....................................................................................................................................................................3 2 Qt ..........................................................................................................................................................................3 2.1 安装 ........................................................................................................................................................3 2.2 乱码解决 ...............................................................................................................................................5 3 FFmpeg ...............................................................................................................................................................6 3.1 下载 ........................................................................................................................................................6 3.2 FFmpeg 命令 ........................................................................................................................................7 3.2.1 调整分辨率 ..............................................................................................................................7 3.2.2 转格式 .......................................................................................................................................7 3.2.3 查看视频信息 .........................................................................................................................7 3.2.4 Hap 和 Hapq 编码 ..................................................................................................................8 3.2.5 HLS 协议 ................................................................................................................................. 10 3.2.6 从图片帧序列合成视频 .................................................................................................... 11 3.2.7 截取指定长度 ...................................................................................................................... 12 3.2.8 硬件加速 ................................................................................................................................ 12 3.2.9 查看帮助 ................................................................................................................................ 18 3.3 ffplay 命令........................................................................................................................................... 19 3.4 ffprob 命令 ......................................................................................................................................... 20 4 开发记录 ......................................................................................................................................................... 20 4.1 寻找 ffmpeg.exe .............................................................................................................................. 20 4.2 指定分辨率转码 .............................................................................................................................. 22 4.3 多线程解决 UI 线程阻塞问题 ..................................................................................................... 24 4.4 Qt 编译 Release 版........................................................................................................................... 27
1 开始 以前就使用过 Qt,其 Linux/Windows 配置、MinGW 编译以及 GUI 控件的使用都比较了 解。在不久之前,我想过一个问题,就是面对许许多多的新技术和新框架,如何选择合适的 作为长期学习和不断深入的首选。比如网站后台框架的选择,结合以前实习积累的经验,选 定继续使用 Django 作为长期使用和不断学习的网站后台框架首选。也就是说,在非极特殊 情况下,就选定 Django 来进行。毕竟 Django 项目开发历史悠久,版本迭代很快,作为一 个大而全的 Python 网站框架,可谓长盛不衰。另外鉴于 MySQL 自身的一些不足以及被 Oracle 收购后的种种情况,选定 PostgreSQL 作为开源数据库使用首选。扯得有点远,回到图形化 界面的选择上,选定 Qt 作为长期学习的目标。其实本科毕设的时候经过查询资料比较已经 选定了 Qt,其跨平台及不断新添加的特性等能满足我们日常开发使用所需。这里做转码的 GUI 选择 Qt 来搭建,且作为开源里面首屈一指的视频编解码库,FFmpeg 也自然成为以后 长期研究的视频处理库首选。 啰嗦了这么多,主要是因为感觉到了自己的长进,因为知道选择长期目标了。这样对于 新出现的各种框架和技术方案不必感到迷茫或者感觉选择困惑,且借助于长期积累的技术经 验可以很快开展工作并不断推进。所有这些接触和学习过程的经验及文档记录都不会浪费, 而且事实证明确实是比较可取的。 这里选择的 Qt 为 5.9 LTS,相当应景,因为我的技术方案选择 Qt 和 FFmpeg 也是 LTS 的。所以,开始吧。 2 Qt 2.1 安装 Qt5.9 可以支持 VS2017,这点是比较好的。以前也就是本科毕设的时候刚接触 Qt,其 不同 VS 和 MinGW 版本,x86 和 x64 等区别和 debug 及 release 的事情真的搞得人怀疑人 生。现在 Qt5.9 作为 LTS 版,各方面的支持会很完善,所以有对 VS2017 的支持就不用自己 搞编译了。 下面是 Qt5.9 安装的选择组件界面:
这里要注意的是其默认有 Andorid ARMv7 却没有任何一项 msvc 勾选,根据自己的选 择及逆行勾选,这里我使用 msvc2017,所以就把 Android 取消勾选,选择 msvc2017 了。 这里还是有些疑惑的,Qt 官方论坛有透露 msvc2017 库只有 64 位,但是 VS2017 实际是 32
位: 当然 VS 是可以在编译的时候选择 32 还是 64 位的,所以这里 Qt 提供的 64-bit 是不是 只能编译 64 位程序还不确定,幸好开发中没有啥意料之外的事情。 2.2 乱码解决 查看 Qt 的构建套件: 这个 15.0 的 C++编译器就是 VS 自己的,因此也带来了中文乱码问题。为什么 Qt 的代 码中使用的也是 UTF-8 运行时却也乱码呢?可以用 Notepad++看文件编码: 这种是没有 BOM 的,如果.cpp 文件是这个编码却含有汉字,运行时可能会出乱码。所 以需要改成有 BOM 的: 然后添上下面的代码:
#if _MSC_VER >= 1600 #pragma execution_character_set("utf-8") #endif 这样就可以告诉程序不要乱改代码,运行时以 UTF-编码来,这样程序就乖了。 另外在 pro 文件中就不要转 UTF-8 带 BOM 了,因为这个文件就是要 UTF-8 无 BOM 的,否则 Qt Creator 会报错。 3 FFmpeg FFmpeg 在实际使用中有许多的应用场合,这里也只能记录一些用到的简单命令。实际 上 FFmpeg 是有 API 的,就是可以用 C++来进行开发的。目前还没这么多个性化的需求,所 以就是使用 ffmpeg.exe 来进行转码整流等工作。 3.1 下载 FFmpeg 作为开源库,可以使用源码进行编译。但是其支持项众多,比如 cuda 及硬件 加速等让新手难以自己配置编译,所以可以选择官方提供的包下载安装即可。也就是:
安装后其实就是三个 exe 文件,且个头都很大: 所以就执行执行命令就可以了。 3.2 FFmpeg 命令 3.2.1 调整分辨率 FFmpeg 很强大,初看教程恐怕会被吓到。先来增加点自信,电脑上随便找一个百十兆 大小的视频比如 test.mp4,直接在命令行输入: ffmpeg.exe -i test.mp4 -s 1024*576 out.mp4 这样是不是很快就输出了一个新的视频文件 out.mp4,且用播放器打开看下其分辨率, 是不是 1024*576? 就是这么简单,这么强大。 稍微解释下,FFmpeg 在安装的时候应该会自动添加环境变量的,所以只需要在命令行 敲就可以了。如果说命令找不到,那么就自己手动添加下环境变量即可。使用-i 参数指定源 文件,也就是 test.mp4,使用-s 也就是 size 来指定分辨率,这里是 1024*576。然后是输出 文件 out.mp4。 3.2.2 转格式 FFmpeg 转格式的时候可能会转编码,这样一来就会很耽误时间。了解到视频的一些基 础时候后可以发现,格式如 mp4 和 mkv 等简单理解就是个容器,那么其内部的流不用转码 就看换容器的。命令如下: ffmpeg -i test.mov -c:v copy out.mp4 这样就能从 mov 格式直接就转换成了 mp4 格式了。解释以下,这里的-c:v copy 就是 对 video 流进行复制操作,这样就避免了视频流的转码,所以转格式将会非常迅速。另外这 里为了增加自信,将命令设计的很短,没有考虑音频,故音频可能会被转码,造成音频码率 下降到默认值。所以同样的操作,加上-c:a copy 将音轨进行复制操作可以保持音质不下降。 如果有字幕的话,也可以用类似的方式处理 3.2.3 查看视频信息 许多时候我们会需要查看视频的一些分辨率和编码等信息,FFmpeg 当然可以满足这种 需求,命令如下: ffmpeg -i input.mp4 2>&1
这里先看下输出: 前面一堆都没啥,就是 FFmpeg 编译选项,标明其支持的特性。可以顺便看下 enable- cuda 和 enable-cuvid 两个是关于硬件加速的,对于某些编码解码工作可以用 GPU 加速,确 实比 CPU 的编解码快得多,这个后面会继续研究。 这个命令可以进行一些更多的处理,比如结合 Linux 的一些命令可以直接输出时长: 这里的 grep、cut 和 sed 等命令就不详细展开了。 3.2.4 Hap 和 Hapq 编码 所谓名不正则言不顺,言不顺则事不成。我们做什么东西,怎么做要有前因后果,这样 才能让其他人不再云里雾里,解决问题才能水到渠成。 为什么要研究 Hap 和 Hapq 编码呢?因为最近在围绕 8K 视频进行工作,而在 4K 都没 普及的时代,8K 对软硬件的压力都非常大。我们在 Unity 商店里面找到一些处理方法,可以 使用 GPU 加速的方式使 8K 视频能流畅地在眼镜中播放。 由于百度上搜索 Hap 和 Hapq 貌似没多少结果,换 Google 搜索后可以得到一些信息。 下这段英语介绍就是 Hap 和 Hapq 的基本内容:
分享到:
收藏