ffmpeg 从 mkv 转换为 mp4,无需重新编码

问题描述 投票:0回答:4

我正在使用 ffmpeg 通过以下命令将容器从 mkv 切换到 mp4:

ffmpeg -i filename.mkv -vcodec copy 1.mp4

这是我在从 mkv 容器转换为 mp4 时发现的最简单的命令,无需重新编码。输出另有说明(如果我没记错的话)

这是输出的小屏幕截图:

FFmpeg Screenshot

其中提到流映射,#0:0 (264 (native)) -> 264 (libx264))。这是否意味着它从 x264 重新编码为 libx264?我做错了什么?

如有任何帮助,我们将不胜感激...

ffmpeg
4个回答
61
投票

问题已解决,指定音频编解码器解决我的问题...

ffmpeg -i filename.mkv -vcodec copy -acodec copy 1.mp4

11
投票

重新混合容器,例如MKV 或 AVI 到 MP4,FFmpeg 将仅保留一个(它尝试从输入文件中选择一个可用的“最佳”音频和视频流)到输出文件中。通过提供 -map 0

 可以避免这种情况。
Matroska 文件经常包含 FFmpeg 的 MOV/MPEG 容器不支持的格式的字幕,尤其是。 SRT/Subrip 或 ASS/SSA。它们可以简单地用

-sn

删除,也可以转换为像

mov_text
这样的原生格式。 (您还可以使用滤镜
刻录硬字幕到视频流中。)
有时,使用启发式方法添加缺失的信息可能会有所帮助。这是用 

-find_stream_info

激活的,但我不确定是否应该默认使用它。

我假设构建的配置并不重要(

-hide_banner

),只有严重的问题才应该记录到控制台(

-loglevel warning
,或者:
quiet
|
panic
|
fatal
|
error
|
warning
|
info
verbose
)| debug |
trace
)。
因此,一个相当通用的转换命令如下所示:
$ ffmpeg -find_stream_info -i input.mkv \
         -map 0 -codec copy -codec:s mov_text output.mp4 \
         -hide_banner -loglevel warning && \
  rm input.mkv

要在

cmd

内批量处理 Windows 盒子上的多个文件并覆盖现有文件 (
-y
),请使用

for

:
FOR /r %F IN (*.mkv) DO (@ffmpeg ^
  -find_stream_info -i "%F" ^
  -map 0 -codec copy -codec:s mov_text "%~pnF.mp4" ^
  -hide_banner -loglevel warning -y)

对于那些使用Windows并且想要转换MKV文件目录的人,将此批处理文件扔到同一目录中并执行它:
@ECHO OFF

FOR %%F IN (*.mkv) DO (
    ffmpeg -i %%~nF.mkv -acodec copy -vcodec copy %%~nF.mp4
)

1
投票

一些背景,以防其他人面临同样的情况:

我之前使用OBS录制过桌面; Sony Vegas 不接受 mkv 文件。我在每个捕获上运行了上面的批处理,该批处理称为 

ffmpeg,生成的 MP4 被 Sony Vegas 接受。

ffmpeg.exe -i input_file_name.mkv output_file_name.mp4

它转换为 mp4,但尺寸更大。 :)

-3
投票

© www.soinside.com 2019 - 2024. All rights reserved.