ffmpeg转换没有损失质量

Jen*_*sej 9 ffmpeg loss

当文件类型不是flv/mp4/webm时,我需要将所有视频转换为我的视频播放器(在网站中).

当我使用ffmpeg -i filename.mkv -sameq -ar 22050 filename.mp4::

解码MB 22 1,字节流(8786)时出现[h264 @ 0x645ee0]错误

我的观点是,当我需要将文件类型:.mkv和其他(jwplayer不支持)转换为flv/mp4时,我应该做什么,而不会丢失质量.

llo*_*gan 18

不要使用-sameq,它并不意味着"相同的质量"

这个选项刚刚从FFmpeg中删除了.这意味着您使用的是过时的构建.

使用-crflibx264进行编码时,请使用该选项.这是H.264视频编码器ffmepg,如果可用,它是MP4输出的默认编码器.有关详细信息,请参阅FFmpeg H.264视频编码指南.

得到一个最近的 ffmpeg

转到FFmpeg下载页面并在那里进行构建.Linux,OS X和Windows都有选项.或者您可以按照其中一个FFmpeg编译指南进行操作.由于FFmpeg开发非常活跃,因此始终建议您使用最适合您使用的最新版本.

你将不得不接受一些质量损失

您可以使用libx264生成无损输出,但这可能会创建绝对庞大的文件,并且可能无法被浏览器解码和/或JW Player支持(我从未尝试过).

好消息是,您可以创建一个视觉无损的视频.同样,文件可能有点大,但您需要在质量和文件大小之间做出选择.

随着-crf选择18之间的值,以围绕29.选择仍然给出可接受的质量的最高数字.将该值用于您的视频.

其他事情

  • 添加-movflags +faststart.这将moov原子从文件末尾重新定位到开头.这将允许视频在仍在下载时开始播放.否则,必须先完整下载整个视频才能开始播放.

  • 添加-pix_fmt yuv420p.这将确保与所有玩家兼容的色度子采样.否则,ffmpeg默认情况下,根据几个因素,将尝试最小化或避免色度子采样,并且结果通常不能由非基于FFmpeg的播放器播放.

  • 但这个“答案”完全没有抓住重点。重点不是创建“无损”视频,因为原始视频无论如何都可能非常有损。重点是创建一个与原始视频具有相同程度损耗的视频。 (4认同)
  • 弄清楚CRF是什么,它做什么以及如何使用此参数将是很好的。CRF代表恒定速率因子。ffmpeg docs引用:“ CRF标度的范围是0–51,其中0是无损的,默认是23,而51是可能的最差质量。较低的值通常会导致较高的质量,主观上合理的范围是17 –28。认为17或18在视觉上无损或接近无损。” 有用的链接:[ffmpeg docs](https://trac.ffmpeg.org/wiki/Encode/H.264),[了解速率控制模式](https://slhck.info/video/2017/03/01/ rate-control.html) (3认同)

A. *_*tia 9

代替-sameq(由FFMpeg删除),可以使用-qscale 0:文件大小会增加,但会保持质量。

  • -qscale(或更准确地说是-qscale:v)仅应与旧式MPEG系列一起使用:mjpeg,mpeg1video,mpeg2video,mpeg4等。libx264和libx265会将其忽略,而使用-crf代替。 (2认同)
  • @Michael 输入格式并不重要:只有用于输出的编码器才重要。这是因为无论输入格式如何,ffmpeg 都会将输入分解为原始格式。然后编码器会将原始格式处理为输出。(当然,除非您使用“-c copy”进行流复制,否则不会发生重新编码)。 (2认同)
  • 使用 `-qscale 0` 时,ffmpeg 4.2.1 抛出黄色“请使用 -q:a 或 -q:v,-qscale 不明确”消息 (2认同)

小智 7

将所有mkv转换为mp4而不会造成质量损失(实际上它只是重新打包):

for %a in ("*.mkv") do ffmpeg.exe -i "%a" -vcodec copy -acodec copy -scodec mov_text "%~na.mp4"
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,一个简单的 `ffmpeg -i input_file.mkv output_file.mp4` 就成功了。 (2认同)
  • 但是,@ThiagoNegri 将重新编码所有内容;利用“复制”,您可以避免这样做 (2认同)