ชุดแปลง. mkv เป็น. mp4


10

ฉันต้องการแบทช์แปลงไฟล์. mkv ทั้งหมดในโฟลเดอร์เป็น. mp4 ด้วย VLC

ควรใช้สตรีมวิดีโอ / เสียงต้นฉบับและหากเป็นไปได้คำบรรยาย. ass ของ. mkv มันไม่ใช่การแปลงจริงๆมันเหมือนกับการเปลี่ยนคอนเทนเนอร์ - เครื่องเล่นของฉันไม่สามารถอ่านวิดีโอ MKV ได้

ถ้าฉันทำการแปลงด้วยมือ (ด้วยตนเอง) มันใช้งานได้ แต่ฉันมีไฟล์ MKV จำนวนมากที่จะทำการแปลงดังนั้นมันจะใช้เวลานานมาก

ฉันค้นหาอินเทอร์เน็ตเป็นชุดไฟล์เพื่อทำสิ่งนี้และฉันพบบางอย่าง ฉันพยายามปรับเปลี่ยนตามความต้องการ แต่ความพยายามทั้งหมดที่ฉันพยายามเพิ่งสร้างไฟล์. mp4 ที่ไม่มีสตรีมเสียงและสตรีมวิดีโอก็ไม่สามารถแสดงผลได้โดยเครื่องเล่นสื่อของฉันบนพีซี

ดังนั้นใครบางคนสามารถบอกฉันได้ว่าแบตช์มีหน้าตาเป็นอย่างไรจึงใช้งานได้กับวิดีโอต้นฉบับและออดิโอสตรีม (และอาจเป็นคำบรรยาย. ass)


ระบบปฏิบัติการใดที่คุณใช้อยู่และคุณจำเป็นต้องใช้ VLC หรือไม่ นอกจากนี้ ISO MP4 ยังไม่รองรับคำบรรยายเท่าที่ฉันจำได้ - สิ่งที่ควรทำเกี่ยวกับพวกเขา
slhck

สำหรับการทดสอบคุณสามารถลองผู้เล่นคนอื่น (mplayer / KMPlayer / BSPlayer)
Remus Rigo

เบรกมือนั่นคือทั้งหมดที่
Sam

@Sam Handbrake จะเข้ารหัสสตรีมวิดีโอและเสียงอีกครั้งทำให้คุณมีคุณภาพไม่ดี นี่คือสิ่งที่ OP ต้องการโดยเฉพาะ
slhck

คำตอบ:


13

mkvtomp4

ดูเหมือนmkvtomp4ว่าคุณต้องการอะไร

ใช้ mpeg4ip หรือ GPAC ของ mp4box, mkvtoolnix และ ffmpeg การแปลงไฟล์ MKV ลำบากเพื่อ mp4 การแปลงไม่ได้เข้ารหัสวิดีโออีกครั้งและเข้ารหัสเสียงอีกครั้งหากไม่ได้ใช้ตัวแปลงสัญญาณ AAC (หนึ่งสามารถแทนที่พฤติกรรมนี้โดยใช้ --audio-codec)

คุณสามารถดาวน์โหลดเวอร์ชัน Windows และ Linux บนหน้า Google Code คุณจะต้องใช้ซอฟต์แวร์เพิ่มเติม

ตรวจสอบเว็บไซต์เพื่อดาวน์โหลด 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 ที่ถูกต้องโดยไม่มีการเข้ารหัสซ้ำ วนรอบไฟล์ตามที่จำเป็นและพร้อมใช้งานโดยระบบปฏิบัติการของคุณ อย่างไรก็ตามชุดนี้จะไม่คัดลอกคำบรรยาย

ใน * ระวังคุณสามารถทำต่อไปนี้ เพียงสร้างไฟล์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 คุณอาจต้องใช้ไฟล์ Batch สองไฟล์ ( เสียบแบบไร้ยางอายจากที่นี่ ) ไฟล์หนึ่งไฟล์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

นี่คือสมมติว่าไฟล์ของคุณมีคำบรรยายที่ track 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 สำหรับ Windows แต่มีแบทช์ดังนั้นมันจึงแปลง / mux ไฟล์ทั้งหมดในโฟลเดอร์เป็น 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 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: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.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.