【问题标题】:What ffmpeg output format (-f) do I use for two-pass encoding of mkv files我使用什么 ffmpeg 输出格式 (-f) 对 mkv 文件进行两次编码
【发布时间】:2020-05-16 03:45:12
【问题描述】:

我最近备份了一部蓝光电影,大约 36 GB。使用 ffmpeg 从视频中获取信息,它位于 mkv 容器中的 h.264 中。我想使用 h.265 压缩并以 4 Mbits/s 的比特率为目标来缩​​小文件大小,以便我可以在我不在家时通过我的 Plex 服务器流式传输它。我的上传速度限制为 5 Mb/s。

虽然我可以使用简单的软件轻松完成此操作,但我想学习更多编码。我找到了正确的ffmpeg code 两个进行两次编码,但是在我发现的所有示例中,它们都使用 mp4 的输出格式,但声明“您需要指定与您将在第 2 步中使用的输出格式。”我假设我的“输出格式”是 mkv,但这不允许我的代码运行。有人可以向我解释一下输出格式是什么意思,以及我应该使用什么来在 mkv 容器中将其从 h264 编码为 h265?

ffmpeg -y -i input.mkv -c:v libx265 -b:v 4M -x265-params pass=1 -an -f mkv /dev/null && \ ffmpeg -i "Arrival (2016).mkv" -c:v libx265 -b:v 4M -x265-params pass=2 -c:a copy output.mkv 

另外,为了在我的 Windows PC 上工作,我正在尝试学习如何编辑一些参数以使其在 Powershell 中工作。我相信我会这样做:

(ffmpeg -y -i input.mkv -c:v libx265 -b:v 4M -x265-params pass=1 -an -f mkv NUL) -AND (^ ffmpeg -i "Arrival (2016).mkv" -c:v libx265 -b:v 4M -x265-params pass=2 -c:a copy  output.mkv)

【问题讨论】:

标签: ffmpeg h.264 h.265


【解决方案1】:

使用-f matroskamkv 是 matroska 容器格式的通用文件扩展名。通常,ffmpeg 使用输出文件名来猜测输出格式(例如 *.ts -> mpegts、*.mp4 -> mp4 等)。请参阅ffmpeg -formats 的输出以获取有效的复用器和解复用器列表。

【讨论】:

    【解决方案2】:

    低带宽视频服务器如何选择ffmpeg编解码器和容器:

    您可能想要下载、安装和使用Handbrake(用于 Windows 64 位)和WinFF,以了解要使用的设置。

    Windows 用户使用 NUL 代替 /dev/null 和 ^ 代替 \
    非 Windows 用户使用 /dev/null 代替 NUL 和 \ 代替 ^

    ffmpeg -y -i "1.mkv" -c:v libx265 -b:v 4M -pass 1 -an -f matroska NUL &&^
    ffmpeg -i "1.mkv" -c:v libx265 -b:v 4M -pass 2 -c:a aac -b:a 128k "output.mkv" 
    rem 
    

    一样
    ffmpeg -y -i "1.mkv" -c:v libx265 -b:v 4M -pass 1 -an -f matroska NUL && ffmpeg -i "1.mkv" -c:v libx265 -b:v 4M -pass 2 -c:a aac -b:a 128k "output.mkv" 
    rem 
    

    您可能想要比较恒定速率因子 (CRF) 与两次 ABR 以及 265 与 264。mp4 容器中的 720p、具有 4Mbps 最大比特率的 H264 和 AAC 音频可能是您的最佳选择。 CRF265 制作最小的文件。

    从 1 分钟开始制作一个 15 秒的视频:

    ffmpeg -ss 00:01:00 -y -i "1.mkv" -c:v libx264 -b:v 4M -filter:v scale=1280:720 -preset slow -c:a copy -t 00:00:15 "outputSlow264720p.mp4" &&^
    ffmpeg -ss 00:01:00 -y -i "1.mkv" -c:v libx264 -b:v 4M -f matroska -c:a copy -t 00:00:15 "outputSlow264.mkv" &&^
    ffmpeg -ss 00:01:00 -y -i "1.mkv" -c:v libx265 -crf 28 -f matroska -c:a copy -t 00:00:15 "outputCRF265.mkv" &^
    ffmpeg -ss 00:01:00 -y -i "1.mkv" -c:v libx265 -b:v 4M -f matroska -c:a copy -t 00:00:15 "output4M265.mkv" &^
    ffmpeg -ss 00:01:00 -y -i "1.mkv" -c:v libx264 -preset slow -crf 22 -f matroska -c:a copy -t 00:00:15 "outputCRF264Slow.mkv" &^
    ffmpeg -ss 00:01:00 -y -i "1.mkv" -c:v libx264 -b:v 4M -f matroska -c:a copy -t 00:00:15 "output4M264.mkv"
    rem   
    

    请参阅 https://trac.ffmpeg.org/wiki/Encode/H.265 这些增益在 1080p 及更高的分辨率下最为明显。
    请参阅https://trac.ffmpeg.org/wiki/Encode/H.264 CRF:这是大多数用途推荐的速率控制模式。
    https://programminghistorian.org/en/lessons/introduction-to-ffmpeg
    https://opensource.com/article/17/6/ffmpeg-convert-media-file-formats
    https://davidhide.com/2019/02/03/compressing-audio-with-ffmpeg-and-powershell/

    https://slhck.info/video/2017/02/24/crf-guide.html

    PowerShell 在一行中替换 ^ 和 && :2 次通过 h265.mkv 和 h264.mp4 输出

    ffmpeg -ss 00:01:00 -y -i "1.mkv" -c:v libx265 -b:v 4M -pass 1 -an -f matroska -t 00:00:15 NUL; if($?) {ffmpeg -ss 00:01:00 -y -i "1.mkv" -c:v libx265 -b:v 4M -pass 2 -c:a copy -t 00:00:15 "output.mkv"}
    ffmpeg -ss 00:01:00 -y -i "1.mkv" -c:v libx264 -b:v 4M -pass 1 -an -f mp4 -t 00:00:15 NUL; if($?) {ffmpeg -ss 00:01:00 -y -i "1.mkv" -c:v libx264 -b:v 4M -pass 2 -c:a copy -t 00:00:15 "output.mp4"}
    rem 
    

    PowerShell 分两行:720p h264.mp4 2-pass 输出

    ffmpeg -ss 00:01:00 -i "1.mkv" -c:v libx264 -b:v 4M -filter:v scale=1280:720 -preset slow -c:a copy -t 00:00:15 -pass 1 output.mp4
    ffmpeg -ss 00:01:00 -y -i "1.mkv" -c:v libx264 -b:v 4M -filter:v scale=1280:720 -preset slow -c:a copy -t 00:00:15 -pass 2 output.mp4
    rem 
    

    预设 - 见https://trac.ffmpeg.org/wiki/Encode/H.264

    预设是一组选项,可提供一定的编码速度与压缩比。较慢的预设将提供更好的压缩(压缩是每个文件大小的质量)。这意味着,例如,如果您以特定文件大小或恒定比特率为目标,您将使用较慢的预设获得更好的质量。同样,对于恒定质量编码,您只需选择较慢的预设即可节省比特率。

    使用您有耐心的最慢预设。按速度降序排列的可用预设是:

    ultrafast
    superfast
    veryfast
    faster
    fast
    medium – default preset
    slow
    slower
    veryslow
    

    【讨论】:

    • 谢谢。在我的 powershell 版本中,似乎无法识别 &&、&&^ 或 &^ 的任何变体。我收到不支持“&”符号的错误。它确实在 cmd.exe 中工作,但我只是希望更熟悉 powershell。 cmd.exe中的单个& vs &&相同吗?我假设“^”符号只是在 shell 中表示“新行”的一种方式?
    • @mav & 表示执行下一个命令 && 表示只有在上一个命令成功时才执行下一个命令。使用 powershell 命令更新了答案。
    猜你喜欢
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    相关资源
    最近更新 更多