侧边栏壁纸
博主头像
★街角晚灯★ 博主等级

博观而约取 厚积而薄发

  • 累计撰写 468 篇文章
  • 累计创建 185 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

FFMPEG 视频格式转换& 视频压缩

WinJay
2024-11-27 / 0 评论 / 0 点赞 / 41 阅读 / 0 字 / 正在检测是否收录...

FFMPEG 视频格式转换& 视频压缩

image-20241127171227667

安装: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

image-20241127163112700

如果输出包含 (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简单分析视频源,基本信息包括分辨率、帧率、码率这几个关键数据,参考信息包括文件格式、编码格式、像素格式等;(音频占用文件不大,先放低优先级)

image-20241127163701590

可以看到分辨率是2878x1824,帧率是60fps,码率是5605kbps,文件就是mp4,编码格式是h264(main),像素格式yuv420p;文件时长00:07:04.37,7分04秒 ;按这个码率,视频部分尺寸是5605x420.4=2356342kb,这里是bit位,换算大KB是294542.75,换算MB是约287.6394MB。

image-20241127164224651

我们简单评估一下对用户网络的要求,如果缓冲是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

效果

以上命令执行完成后效果如下:

image-20241127165928836

最明显码率降低到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、其他小优化;
在实际实践过程中,还是需要不断调整应用,遇到问题解决问题;选定优化目标,选择质量比对参数,就可以不断调优上述参数,达到最终的优化平衡。

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区