Toplu Dönüştürme .mkv .mp4


10

Bir klasördeki tüm .mkv dosyalarını VLC ile .mp4'e toplu olarak dönüştürmek istiyorum.

Orijinal video / ses akışını ve mümkünse .mkv dosyasının .ass altyazısını kullanmalıdır. Gerçekten bir dönüşüm değil, kabı değiştirmek gibi - oynatıcım MKV videolarını okuyamıyor.

Elle (manuel olarak) bu dönüşüm yaparsanız çalışır, ama dönüştürmek için MKV dosyaları bir sürü var, bu yüzden çok zaman alacaktı.

Bunu yapmak için bir toplu iş dosyası için internette arama yaptım ve birkaç tane buldum. Onları isteğime göre değiştirmeye çalıştım, ancak denediğim tüm denemeler sadece ses akışını içermeyen bir .mp4 dosyası oluşturdu ve video akışı da PC'deki tüm medya oynatıcıları tarafından işlenemiyor.

Birisi bana partinin nasıl görünmesi gerektiğini söyleyebilir, bu yüzden orijinal video ve ses akışı (ve belki .ass altyazıları) ile çalışır?


Hangi işletim sistemindesiniz ve mutlaka VLC kullanmak zorunda mısınız? Ayrıca, ISO MP4 hatırladığım kadarıyla altyazıları desteklemiyor - bunlar hakkında ne yapılmalı?
Haziran'da slhck

bir test için başka bir oyuncuyu deneyebilirsiniz (mplayer / KMPlayer / BSPlayer)
Remus Rigo

El freni, hepsi bu.
Sam

@Sam Handbrake, video ve ses akışlarını yeniden kodlar ve sonuç olarak sizi kötü kalitede bırakır. Ayrıca, OP özellikle bunu istemiyordu.
slhck

Yanıtlar:


13

mkvtomp4

Görünüşe mkvtomp4göre ne istiyorsun?

Sorunlu mkv dosyalarını mp4'e dönüştürmek için mpeg4ip veya GPAC'ın MP4Box, mkvtoolnix ve ffmpeg'i kullanır . Dönüştürme videoyu yeniden kodlamaz ve yalnızca AAC kodek kullanmazsa sesi yeniden kodlar (biri --audio-kodek kullanarak bu davranışı geçersiz kılabilir).

Windows ve Linux sürümlerini Google Code sayfasından indirebilirsiniz. Yine de ek yazılıma ihtiyacınız olacak.

Sitelerde Windows veya Linux için indirme olup olmadığını kontrol edin. OS X'te, yalnızca Homebrew'unuzbrew install mkvtoolnix mp4box varsa gerekir .

Bu, altyazılarınızı kopyalamaz. Ek bir adıma ihtiyacınız olacak.


FFmpeg toplu işi

Mkvtomp4 sizin için çalışmazsa, basit bir FFmpeg toplu iş dosyası da yapabilir. Windows için Zeranoe yapılarını indirebilirsiniz . Linux'ta, paket kaynaklarından FFmpeg'i kontrol edin. OS X'te kullanın brew install ffmpeg.

Ardından, sadece şunu arayın:

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

Bu, yeniden kodlama yapmadan geçerli bir MP4 kabı oluşturur. İşletim sisteminiz tarafından ihtiyaç duyulan ve kullanılabilen dosyaları gözden geçirin. Ancak bu toplu iş altyazıları kopyalamaz.

* Nix'de aşağıdakileri yapabilirsiniz. Sadece bir dosya oluşturun 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

Video klasörünüzün yolunu buradan değiştirin. İle çalıştırılabilir yapın chmod +x convert.sh, ardından ile çalıştırın ./convert.sh.

Windows'da, muhtemelen iki Batch dosyasına ( buradan utanmaz fiş ) ihtiyacınız vardır startconvert.bat:

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

Ve dönüşüm gerçekleştiren:

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

Her ikisini de video klasörüne kaydedin. startconvert.batDönüşümü başlatmak istediğiniz klasörden çalıştırın .


Altyazı

Altyazı eklemek istiyorsanız, aşağıdakiler işe yaramazsa manuel bir prosedüre ihtiyacınız olabilir:

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

Altyazıları çıkarmak için şunu kullanın:

mkvextract tracks input.mkv 3:subtitles.srt

Bu, dosyanızın parça numarası 3'teki altyazıları gerçekten içerdiğini ve SRT biçiminde dışa aktarılabileceğini varsayar. Bir dosyanın parça 3'te gerçekten altyazı içerip içermediğini kontrol etmek için kullanın mkvmerge -i input.mkv.

Ardından, MP4 dosyasına altyazıları yeniden eklemek için MP4Box kullanın.

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

Kayıt için FFmpeg'i ve OS X'te altyazı çıkarmayı test ettim ve kusursuz çalıştı.
slhck

Windows için ffmpeg kullandım. Ancak otomatik olarak klasördeki tüm dosyaları aynı dosya adıyla mp4'e dönüştürür / mux yapar? Veya dosyayı sürükleyip

2

Bu, slhck'in verdiği cevabın bir parçası (ve teşekkürler, slhck!) Çünkü komutun en son (bu yazıda) ffmpeg için çalışmadığını gördüm - belki parametreler sürümler arasında değişti?

Windows 7'de kullanarak ffmpeg v.20130103-git-9e36d9e-win64-statik aracılığıyla bulunan (kaldırmakta o 7zip programı ile), http://ffmpeg.zeranoe.com/builds/ yoluyla sırayla http://ffmpeg.org /download.html , aşağıdaki komut bir .mov dosyasını (iPhone'dan alınmıştır) bir .mp4 dosyasına dönüştürdü:

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

Bunun .mp4 kısmını .avi olarak değiştirmenin, bir .avi kabına dönüştürmek için de işe yaradığını gördüm. Her iki hedef kapsayıcıda da, bu "-vcodec copy -acodec copy" parametrelerini kullanarak kaynak akışlarını yalnızca yeni bir kapsayıcıya (hedefte) kopyalamış gibi görünür, bu yüzden kayıpsız dönüşümdür (ve sanırım bu durum hedef kapsayıcıların çeşitliliği de).

Slhck partilerinin verdiği bu ince ayarlar da benim için çalıştı:

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:aVe -acodec, veya -c:vve arasında bir fark yoktur -vcodec. Aslında bugün hala eski olanı kullanıyorum, çünkü önerilen sözdizimi ve her ikisi de FFmpeg belgelerinde belirtildi . Kapsayıcıyı AVI'ye dönüştürmenin birçok video ve ses codec bileşeni için kırılabileceğini unutmayın, çünkü AVI dosyaları tahmin kodlaması için destek içermez (H.264 videosunun kullandığı — iPhone'un size verdiği). Hedef olarak bir MP4 veya MOV kabı kullanmazsanız, yeniden kodlamak her zaman daha iyidir.
slhck

"EXIST% 1.mov GOTO çıkış" EĞER "% 1.avi" (veya kaynak biçim yerine hedef biçim ne olursa olsun) yerine "hayır" yazmalıdır. Bunun dışında bu benim için harika çalıştı, teşekkür ederim!
kjosh

0

Eski bir soru, ama işte benim yanıtım. MP4, video çerçevesinin bir parçası olmadıkça altyazı yapamaz, ancak .mkv dosyalarını .mp4'e nasıl dönüştürdüğüm:

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 kaydedin ve üzerinde çalıştığınız klasöre bırakın. Sağ tıklayın ve "Powershell'de Aç" ve işini yapacak.

Bu bile ilk kez Powershell'e baktım (ve son umarım - neden MS sadece Bash'i portlayamadım ?!) Ama benim için çalışıyor ve burada bulduğum koda dayanıyor: https: // wiki .videolan.org / How_to_Batch_Encode / # Powershell


Hangi komut satırını kullanırsanız kullanın, onu Makefileyeniden çalıştırabilmeniz ve yalnızca yeni kaynakları dönüştürebilmeniz ve paralel olarak birden fazla dönüşüm çalıştırabilmeniz için (tüm CPU'larınızı kullanmak için) ).
Mikhail T.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.