FFMPEG 视频格式转换& 视频压缩
安装:https://dl.fedoraproject.org/pub/archive/epel/7/x86_64/Packages/e/epel-release-7-14.noarch.rpm
本教程教你使用 FFmpeg 将 MOV 转为 MP4,其中包含命令行、示例和输出示例。
使用 Macbook 和 Quicktime 制作视频的人经常需要将 MOV 文件转换为 MP4 文件。你可以购买相关软件,也可以使用 FFmpeg 的一行命令将 MOV 文件快速转换为 MP4。
在本教程中,我将向你展示两种使用 FFmpeg 将 MOV 转为 MP4 文件的简单技巧:
- 无需重新编码(复制)
- 重新编码(无损、高质量)
注意:本教程需要 MOV 文件。如果你没有 MOV 文件,可以从这里下载一个样本:https://file-examples.com/index.php/sample-video-files/sample-mov-files-download/。
转换
转换前检查音频格式
使用 FFmpeg 将 MOV 文件转换为 MP4 有几种方法,但首先需要检查文件的音频格式,并检查 MOV 使用的音频容器是否与 MP4 文件兼容。
使用 ffprobe,在命令行键入以下内容并检查输出。
ffprobe -i 阿里云DMS使用说明.mov
如果输出包含 (HE)-AAC、MPEG-1 Audio Layer 1-2-3、CELP、TwinVQ、Vorbis 或 Apple Lossless 格式的音频,那么就可以将文件转换为 MP4,并且它们在大多数机器(Windows、Mac 等)上都可以播放。
如果视频的音频格式与 MP4 不兼容,那么你可能需要重新编码。我将在本文中展示这两种技巧 – 不用担心。
使用 FFmpeg 将 MOV 转换为 MP4,无需重新编码 (Transmux)
当音频和视频编解码器与 MP4 容器兼容时,可以使用此技术。
Transmux 意味着将文件从一种容器格式转换为另一种容器格式, **而无需重新编码音频或视频。**只需将音视频内容复制到一个新的容器中。
视频容器(通常称为格式或包装器)将多种数据类型封装到一个文件中。视频容器可以保存各种数据类型,例如压缩视频和音频流、字幕、元数据,甚至编解码器信息。
将 MOV 转换为 MP4,无需在 FFmpeg 中重新编码,可以按如下方式完成:
ffmpeg -i 阿里云DMS使用说明.mov -c copy -movflags +faststart output-mp4.mp4
以下是参数的解释:
-i 阿里云DMS使用说明.mov
:-i
参数用于指定输入文件。-c copy
:-c
参数是-codec
的简写。这里,copy
指示 FFmpeg 直接将现有的音频和视频流从输入文件复制到输出文件。用于避免由于编码或解码而造成的质量损失。-movflags +faststart
:-movflags
参数用于设置FFmpeg的特定标志。+faststart
标志会重新排列 MP4 文件的元数据,以便在线流式传输时可以在完全下载之前开始播放。output-mp4.mp4
:这是输出文件的名称。
使用 FFmpeg 重新编码将 MOV 转换为 MP4
使用以下命令将 MOV 文件转换为 MP4 文件,并使用 FFmpeg 重新编码。当音频或视频格式与 MP4 容器格式不兼容或者您想要更改视频或音频质量时,必须执行此操作。
ffmpeg -i input.mov -c:v libx264 -b:v 2M -c:a aac -b:a 128K -movflags +faststart output.mp4
这里不重复我们在上一节中介绍的大部分参数。我们在这里做的是
- 将 H.264/AVC编解码器的视频编解码器设置为 libx264 。
-c:a aac
将音频编码器设置为AAC-b:v
和-b:a
将视频和音频比特率分别指定为2M和128k。
这将使用指定的参数重新编码视频并将其放入 MP4 容器中。
使用 FFmpeg 将 MOV 转为 MP4 – 高质量或无损压缩
将 MOV 转为 MP4 并获得极高质量的另一种方法是在重新编码时使用 CRF 参数。你只需运行以下命令:
ffmpeg -i input.mov -c:v libx264 -crf 18 -c:a aac -b:a 128K movflags +faststart output.mp4
这将把 CRF 值设置为 18,并指示 FFmpeg 在制作高质量视频时尽可能多地使用比特。如果想限制使用的比特数(或比特率),可以使用该命令的 Capped CRF 版本,方法是指定比特率上限和所需的 CRF 值。
了解更多有关 FFmpeg 中可用的 CRF、CBR 和capped VBR 编码方法的信息。
现在你知道了使用 FFmpeg 将 MOV 文件转换为 MP4 文件的多种方法。但在结束本教程之前,让我们来访问一下容器格式,了解更多有关它们的信息!
什么是 MOV 容器格式?
MOV(QuickTime Movie)是苹果公司开发的一种多媒体容器格式。它通常用于存储视频、音频和文本轨道,使其成为媒体内容的通用格式。MOV 文件与 Apple 的 QuickTime 软件广泛相关,并以其高质量播放和对各种编解码器的支持而闻名。虽然 MOV 文件在 Apple 生态系统中很流行,但它们可能会遇到与外部特定设备和平台的兼容性问题。
MP4 容器格式是什么?
MP4 (MPEG-4 Part 14)是一种广泛使用的多媒体容器格式,支持视频和音频流。MP4 文件以其高效的压缩和卓越的质量而闻名,使其成为流式传输、共享和存储媒体内容的理想选择。
结论
使用 FFmpeg 将 MOV 转换为 MP4 非常简单!您可以利用上述命令行参数获得高质量的结果,同时保持各种设备和平台的兼容性。
视频压缩
引子
压缩视频大多使用ffmpeg,我们需要思考清楚,为什么需要压缩视频。是因为用户体验(秒开、流畅)问题?还是因为成本(带宽、存储)问题?还是因为运营(广告、互动)需要?我们在进行压缩之前要锚定好关键目标,然后平衡取舍。
背景
最初我拿到的需求是用户播放卡顿,需要解决。使用ffmpeg简单分析视频源,基本信息包括分辨率、帧率、码率这几个关键数据,参考信息包括文件格式、编码格式、像素格式等;(音频占用文件不大,先放低优先级)
可以看到分辨率是2878x1824,帧率是60fps,码率是5605kbps,文件就是mp4,编码格式是h264(main),像素格式yuv420p;文件时长00:07:04.37,7分04秒 ;按这个码率,视频部分尺寸是5605x420.4=2356342kb,这里是bit位,换算大KB是294542.75,换算MB是约287.6394MB。
我们简单评估一下对用户网络的要求,如果缓冲是500ms,那么5605x0.5=2802.5kb/8=350.312KB/1024=约0.342MB的下载速度,还是比较苛刻的,因为网络运营商给大家报的是kbps是小b,乘以8换算一下相当于要求2.7368Mb。
解决
针对以上问题,我的解决思路如下:
1、手机播放端一般不需要这么高分辨率,降低1080p;
2、帧率60fps也可以适当降低,降低到22~25都可以;
3、码率压缩,选用-crf固定码率比压缩/-b:v最高码率压缩方式都可以;
4、视频编码h264(main)可以调整到h264(high);
以上4个参数配置压缩命令如下:
ffmpeg -y -i output-mp4.mp4 -c:a copy -c:v libx264 -profile:v high -r 30 -crf 30 -s 1920x1080 out.mp4
简单介绍参数:
-y
:表示输出文件覆盖-i
:表示输入文件-c:a
:表示音频部分编码,copy表示直接复制到新文件-c:v
:表示视频部分编码,libx264表示使用h264编码-profile:v
:h264编码参数,使用更紧凑的压缩算法-r
:表示视频帧率,30fps-crf
:表示码率应用固定码率比,从0~500,越大码率越低,一般18~32效果较好-s
:视频分辨率裁剪,1920x1080表示裁剪成1080p
效果
以上命令执行完成后效果如下:
最明显码率降低到186kbps,其他都按照参数发生变化,新文件体积优化到186x420.4=78194.4kb,约9.54MB。从287.6394MB降低到9.54MB,优化效果是很好的。对用户网络带宽要求大约降低到463kb,比起6.4Mb来说只是零头。
是不是就可以达成秒开了呢?我们再回过头看看moov头的情况:
查看命令
可以看到ftyp、free是文件标识,不用理会;mdat是视频+音频数据存储,占用8030053字节,接下来才是moov头,我们知道视频播放会先获取moov头才知道具体的元数据信息,如何编码,分辨率几何之类的。一般视频播放器也会有优化,就是先读取视频头前面一定数量字节,如果还没有解析到moov头,会重新发起请求从文件尾部读取一定数量字节,用于补充解析moov。理想状态肯定是第一次缓冲数据就能解析moov头,并继续缓冲数据,而不是断开再请求,解析moov头,再请求缓冲数据。所以需要针对moov头进行前移操作。
具体的ffmpeg命令如下:
-movflags +faststart
在上述命令中增加以上参数即可。最终命令如下:
ffmpeg -y -i xx.mp4 -c:a copy -c:v libx264 -profile:v high -r 30 -crf 30 -s 720x1080 -movflags +faststart xx-out.mp4
扩展
基本针对视频优化我们先介绍到这里,上面是最基本的优化,其他的优化我们也基于上面继续推进。
1、更换编码格式,尝试h265(需要兼容苹果qt),尝试vp9,尝试av1;
2、视频切片,使用hls+ts的m3u8文件格式;
3、应用2-pass优化码率;
4、最重要引进视频质量评价体系,ssim、psnr、vmaf;
5、尝试多分辨率分发,480p、720p、1080p;
6、网络优化,cdn加速;
7、其他小优化;
在实际实践过程中,还是需要不断调整应用,遇到问题解决问题;选定优化目标,选择质量比对参数,就可以不断调优上述参数,达到最终的优化平衡。
评论区