ffmpeg从mkv转换为mp4而不重新编码

unk*_*own 9 ffmpeg

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

ffmpeg -i filename.mkv -vcodec copy 1.mp4
Run Code Online (Sandbox Code Playgroud)

这是我在没有重新编码的情况下从mkv容器转换到mp4时发现的最简单的命令.输出另有说明(如果我没有记错的话)

这是输出的小屏幕截图:

FFmpeg截图

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

任何帮助表示赞赏......

unk*_*own 18

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

ffmpeg -i filename.mkv -vcodec copy -acodec copy 1.mp4
Run Code Online (Sandbox Code Playgroud)

  • 只需使用`-c copy`而不是`-vcodec copy -acodec copy`. (13认同)
  • 另请注意,-i 参数必须位于 -vcodec 和 -acodec 参数之前。 (2认同)

Cri*_*sov 11

使用 FFmpeg 重新复用容器(例如 MKV 或 AVI 到 MP4)将仅保留单个 \xe2\x80\x93,它会尝试从输出文件中的输入文件中选择最佳可用 \xe2\x80\x93 音频和视频流。这可以通过提供来避免-map 0

\n\n

Matroska 文件经常包含 FFmpeg 的 MOV/MPEG 容器不支持的格式的字幕,尤其是。SRT/Subrip 或 ASS/SSA。它们可以简单地删除-sn或转换为本机格式,例如mov_text. (您还可以使用滤镜将硬字幕刻录到视频流中。)

\n\n

有时,使用启发式方法添加缺失的信息可能会有所帮助。这是用 激活的-find_stream_info,但我不确定是否应该默认使用它。

\n\n

我假设构建的配置并不重要(-hide_banner),只有严重的问题才应该记录到控制台(-loglevel warning,或者:quiet| panic| fatal| error| warning| info默认) | verbose| debug| trace)。

\n\n

因此,一个相当通用的转换命令如下所示:

\n\n
$ ffmpeg -find_stream_info -i input.mkv \\\n         -map 0 -codec copy -codec:s mov_text output.mp4 \\\n         -hide_banner -loglevel warning; \\\n  rm input.mkv\n
Run Code Online (Sandbox Code Playgroud)\n\n

要批量处理 Windows 机器上的多个文件cmd并覆盖现有文件 ( -y),请使用for

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