我正在使用 ffmpeg 通过以下命令将容器从 mkv 切换到 mp4:
ffmpeg -i filename.mkv -vcodec copy 1.mp4
这是我在从 mkv 容器转换为 mp4 时发现的最简单的命令,无需重新编码。输出另有说明(如果我没记错的话)
这是输出的小屏幕截图:
其中提到流映射,#0:0 (264 (native)) -> 264 (libx264))。这是否意味着它从 x264 重新编码为 libx264?我做错了什么?
如有任何帮助,我们将不胜感激...
问题已解决,指定音频编解码器解决我的问题...
ffmpeg -i filename.mkv -vcodec copy -acodec copy 1.mp4
重新混合容器,例如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
-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
)
一些背景,以防其他人面临同样的情况:
我之前使用OBS录制过桌面; Sony Vegas 不接受 mkv 文件。我在每个捕获上运行了上面的批处理,该批处理称为ffmpeg,生成的 MP4 被 Sony Vegas 接受。
ffmpeg.exe -i input_file_name.mkv output_file_name.mp4