.mkvを.mp4にバッチ変換


10

VLCを使用して、フォルダー内のすべての.mkvファイルを.mp4にバッチ変換したい。

元のビデオ/オーディオストリームと、可能であれば.mkvの.assサブタイトルを使用する必要があります。これは実際には変換ではなく、コンテナを変更するようなものです。プレーヤーがMKVビデオを読み取ることができません。

この変換を手動で(手動で)実行すると機能しますが、変換するMKVファイルがたくさんあるので、かなり時間がかかります。

これを行うためのバッチファイルをインターネットで検索したところ、いくつか見つかりました。私はそれらを私の希望に合わせて変更しようとしましたが、オーディオストリームが含まれていない.mp4ファイルを作成しようとしたすべての試みと、ビデオストリームもPC上のすべてのメディアプレーヤーでレンダリングできません。

だから誰かがバッチがどのように見えるべきかを私に言うことができます、それでそれは元のビデオとオーディオストリーム(そして多分.assの字幕)で動作しますか?


どのオペレーティングシステムを使用していますか。また、VLCを使用する必要がありますか。また、私が覚えている限り、ISO MP4は字幕をサポートしていません。それらについて何をすべきですか?
slhck

テストでは、別のプレーヤー(mplayer / KMPlayer / BSPlayer)を試すことができます
Remus Rigo

ハンドブレーキ、それだけです。
Sam

@Sam Handbrakeはビデオおよびオーディオストリームを再エンコードし、結果として品質が低下します。また、これはOPが特に望まなかったことです。
slhck 2013年

回答:


13

mkvtomp4

mkvtomp4あなたが望むもののように見えますか?

mpeg4ipまたはGPACのMP4Box、mkvtoolnix、ffmpegを使用して、面倒なmkvファイルをmp4変換します。変換はビデオを再エンコードせず、AACコーデックを使用しない場合にのみオーディオを再エンコードします(--audio-codecを使用してこの動作をオーバーライドできます)。

WindowsとLinuxのバージョンは、Google Codeページからダウンロードできます。ただし、追加のソフトウェアが必要になります。

WindowsまたはLinuxのダウンロードについては、サイトを確認してください。OS Xでは、Homebrewがあるbrew install mkvtoolnix mp4box場合にのみ必要です。

ただし、字幕はコピーされません。追加の手順が必要になります。


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では、おそらく2つのバッチファイル(ここから恥知らずなプラグイン)が必要です、1つは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

ちなみに、私はFFmpegと字幕抽出をOS Xでテストしましたが、問題なく動作しました。
slhck

私はffmpeg for Windowsを使用しました。しかし、バッチがあるので、フォルダ内のすべてのファイルを同じファイル名のmp4に自動的に変換/多重化しますか?または、ドラッグアンドドロップでファイルを変換するバッチ

2

これはslhckが出した答えの一部の微調整です(そして、おかげで、slhck!)そのコマンドが最新の(この執筆時点での)ffmpegに対して機能しなかったことがわかりました-バージョン間でパラメーターが変更されたのではないでしょうか?

Windows 7では、使用してffmpegのv.20130103-のgit-9e36d9e-Win64の静的経由で見つかった(解凍それ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 copy -acodec copy」パラメーターを使用すると、ソースストリームが(ターゲット内の)新しいコンテナーにコピーされるだけなので、ロスレスコンバージョンになります(そして、私はそれが当てはまると思いますさまざまなターゲットコンテナも)。

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:aand -acodecとor -c:vとの間に違いはありません-vcodec。実際、前者は推奨される構文であるため、今日でも前者を使用しています。両方ともFFmpegのドキュメントに記載されています。AVIファイルは予測コーディング(H.264ビデオで使用されている、iPhoneが提供するもの)のサポートを欠いているため、多くのビデオおよびオーディオコーデックでは、コンテナーをAVIに変換すると壊れる可能性があります。MP4またはMOVコンテナーをターゲットとして使用しない場合は、常に再エンコードすることをお勧めします。
slhck 2013年

"IF EXIST%1.mov GOTO exit"は "%1.avi"(またはソース形式の代わりにターゲット形式が何であれ)と読み替える必要がありますか?それ以外はこれでうまくいきました、ありがとう!
kjosh 2016

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


使用するコマンドラインが何であれ、それをa内に配置する必要がありますMakefile-それを再実行して新しいソースのみを変換できるようにするとともに、複数の変換を並行して実行できるようにします(すべてのCPUを利用するため) )。
ミハイルT.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.