将.mkv批量转换为.mp4


10

我想使用VLC将文件夹中的所有.mkv文件批量转换为.mp4。

它应该使用原始的视频/音频流,并尽可能使用.mkv的.ass字幕。这并不是真正的转换,更像是更改容器–我的播放器无法读取MKV视频。

如果我手动进行此转换,则可以,但是我要转换的MKV文件很多,因此将花费很多时间。

我在互联网上搜索了一个批处理文件来执行此操作,然后发现了一些文件。我试图按照自己的意愿进行修改,但是所有尝试都创建了一个.mp4文件,该文件不包含音频流,视频流也无法由PC上的所有媒体播放器呈现。

因此,有人可以告诉我该批处理的外观如何,以便与原始视频和音频流(也许还有.ass字幕)一起使用吗?


您使用什么操作系统,是否必须使用VLC?另外,据我所记得,ISO MP4不支持字幕-应该怎么做?
slhck 2012年

要进行测试,您可以尝试其他播放器(mplayer / KMPlayer / BSPlayer)
Remus Rigo 2012年

手刹,仅此而已。
2013年

@Sam Handbrake将重新编码视频和音频流,从而使您的质量降低。另外,这是OP明确不想要的。
slhck

Answers:


13

mkvtomp4

看起来mkvtomp4是你想要的吗?

使用mpeg4ip或GPAC的MP4Box,mkvtoolnix和ffmpeg 将麻烦的mkv文件转换为mp4。转换不会重新编码视频,仅在不使用AAC编解码器时才重新编码音频(可以使用--audio-codec覆盖此行为)。

您可以在Google代码页上下载Windows和Linux版本。但是,您将需要其他软件。

检查站点是否有Windows或Linux下载。在OS X上,只有brew install mkvtoolnix mp4box拥有Homebrew才需要。

但是,这不会复制您的字幕。您将需要一个额外的步骤。


FFmpeg批处理

如果mkvtomp4对您不起作用,则简单的FFmpeg批处理文件也可以。对于Windows,您可以下载Zeranoe版本。在Linux中,从软件包来源检查FFmpeg。在OS X中,使用brew install ffmpeg

然后,只需调用:

ffmpeg -i input.mkv -c:v copy -c:a copy output.mp4

这将创建一个有效的MP4容器,而无需重新编码。根据需要循环使用文件,并且操作系统可以使用这些文件。但是,该批次不会复制字幕。

在* nix中,您可以执行以下操作。只需创建一个文件convert.sh

#!/bin/bash
find /path/to/input/folder -iname '*.mkv' -print0 | while read -d '' -r file; do
    ffmpeg -i "$file" -c:v copy -c:a copy ${file%%.mkv}.mp4
done

在此处替换视频文件夹的路径。使用使其可执行chmod +x convert.sh,然后使用进行运行./convert.sh

在Windows中,您可能需要两个批处理文件(来自此处的无耻插件),其中一个是startconvert.bat

for %%i IN (*.mkv) DO (convert-to-mp4.bat "%%i") 
pause

而执行转换的是:

IF EXIST "%1.mp4" GOTO exit

@echo Conversion for %1 started on %DATE% %TIME% 
ffmpeg -i %1 -c:v copy -c:a copy %1.mp4

:exit 
@echo %1.mp4 already exists

将两者都保存在视频文件夹中。只需startconvert.bat从您要开始转换的文件夹中运行即可。


字幕

如果您想添加字幕,那么以下操作可能对您不起作用:

ffmpeg -i input.mkv -c:a copy -c:v copy -map 0 output.mp4

要提取字幕,请使用:

mkvextract tracks input.mkv 3:subtitles.srt

这是假设您的文件中确实包含轨道ID为3的字幕,并且可以将其导出为SRT格式。要检查文件是否真的包含字幕的轨道3,请使用mkvmerge -i input.mkv

然后,使用MP4Box将字幕重新添加到MP4文件中。

mp4box -add input.mp4 -add subtitles.srt -new output.mp4

为了进行记录,我在OS X上测试了FFmpeg和字幕提取,并且可以正常工作。
slhck 2012年

我将ffmpeg用于Windows。但是是否有一个批处理,因此它会自动将文件夹中的所有文件转换/混合为具有相同文件名的mp4?或者,也许是一批可拖放拖放的文件

2

这是slhck给出的答案的一部分(感谢slhck!),因为我发现该命令不适用于最新的ffmpeg(在撰写本文时)-也许参数在版本之间已更改?

在Windows 7上,使用ffmpeg v.20130103-git-9e36d9e-win64-static(使用7zip实用程序将其解压缩),可通过http://ffmpeg.zeranoe.com/builds/依次通过http://ffmpeg.org找到/download.html,以下命令将.mov文件(来自iPhone)转换为.mp4文件:

ffmpeg -i test.mov -vcodec copy -acodec copy test.mp4

我发现将其.mp4部分更改为.avi也可以,将其更改为.avi容器。无论使用哪种目标容器,使用这些“ -vcodec复制-acodec复制”参数似乎只会将源流复制到新容器中(在目标中),因此它是无损转换的(我猜想对于各种目标容器)。

slhck进行的批次的这些调整也对我有用:

callConvert.bat:

for %%i IN (*.mov) DO (convert.bat "%%i")
pause

convert.bat:

IF EXIST %1.mov GOTO exit

@echo Conversion for %1 started on %DATE% %TIME% 
ffmpeg -i %1 -vcodec copy -acodec copy %1.avi

:exit 
@echo %1.avi already exists

1
-c:a-acodec,或-c:v和之间没有区别-vcodec。实际上,我今天仍在使用前者,因为它是推荐的语法,并且在FFmpeg文档中都提到了两者。请注意,将容器转换为AVI可能会破坏许多视频和音频编解码器,因为AVI文件缺乏对预测编码的支持(H.264视频使用了iPhone所提供的一种)。如果您不使用MP4或MOV容器作为目标,最好重新编码。
slhck

“如果存在%1.mov GOTO出口”应该读为“%1.avi”(或任何目标格式,而不是源格式),不是吗?除此之外,这对我来说非常有用,谢谢!
kjosh

0

有记录的老问题,但这是我的答案。除非将字幕制作成视频帧的一部分,否则MP4不会做字幕,但这是我将.mkv文件转换为.mp4的方式:

foreach($inputFile in get-childitem -recurse -Filter *.mkv) {
    $outputFileName = [System.IO.Path]::GetFileNameWithoutExtension($inputFile.FullName) + ".mp4";
    $outputFileName = [System.IO.Path]::Combine($inputFile.DirectoryName, $outputFileName);

    $progDir = ${env:ProgramFiles(x86)};
    if ($progDir -eq $null) {
        $progDir = $env:ProgramFiles;
    }

    $processName = $progDir + "\VideoLAN\VLC\vlc.exe";
    $processArgs = "-I dummy -v `"$($inputFile.FullName)`" --sout=#transcode{}:standard{access=`"file`",mux=`"mp4`",dst=`"$outputFileName`"} vlc://quit"

    start-process $processName $processArgs -wait
}

将其另存为mkv2mp4.ps1,并将其放入正在使用的文件夹中。右键单击“在Powershell中打开”,它将完成其工作。

这是我第一次查看Powershell(也是我希望的最后一次–为什么MS不能只移植Bash ?!),但是它对我有用,并且基于我在这里找到的代码:https:// wiki .videolan.org / How_to_Batch_Encode /#Powershell


无论使用什么命令行,都应将其放在Makefile-内,以便能够重新运行它并仅转换新的源,并能够并行运行多个转换(以利用所有CPU )。
Mikhail T.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.