web-dev-qa-db-ja.com

.mkvを.mp4にバッチ変換

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

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

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

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

では、バッチがどのように見えるかを誰かに教えてもらえますか?そうすれば、元のビデオとオーディオストリーム(および.ass字幕)で動作しますか?

10
IamHere

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
13
slhck

これは、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 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
2
r_alex_hall

古い質問ですが、記録のためにここに私の答えがあります。ビデオフレームの一部にしない限り、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

0
miken32