Chuyển đổi hàng loạt .mkv sang .mp4


10

Tôi muốn chuyển đổi hàng loạt tất cả các tệp .mkv trong một thư mục thành .mp4 bằng VLC.

Nó nên sử dụng luồng video- / âm thanh gốc và nếu có thể là phụ đề .ass của .mkv. Nó không thực sự là một chuyển đổi, nó giống như thay đổi container - trình phát của tôi không thể đọc các video MKV.

Nếu tôi thực hiện chuyển đổi này bằng tay (thủ công) thì nó hoạt động, nhưng tôi có rất nhiều tệp MKV để chuyển đổi, vì vậy sẽ mất rất nhiều thời gian.

Tôi đã tìm kiếm trên internet một tập tin hàng loạt để làm điều này và tôi tìm thấy một vài. Tôi đã cố gắng sửa đổi chúng theo mong muốn của mình, nhưng tất cả các nỗ lực tôi đã thử chỉ tạo một tệp .mp4 không chứa luồng âm thanh và luồng video cũng không thể được hiển thị bởi tất cả các trình phát phương tiện của tôi trên PC.

Vì vậy, ai đó có thể cho tôi biết lô đó trông như thế nào, để nó hoạt động với luồng video và âm thanh gốc (và có thể .ass phụ đề)?


Bạn đang sử dụng hệ điều hành nào và bạn có nhất thiết phải sử dụng VLC không? Ngoài ra, ISO MP4 không hỗ trợ phụ đề theo như tôi nhớ - nên làm gì với chúng?
slhck

để thử nghiệm, bạn có thể thử một người chơi khác (mplayer / KMPlayer / BSPlayer)
Remus Rigo

Phanh tay, thế thôi.
Sam

@Sam Handbrake sẽ mã hóa lại các luồng video và âm thanh, khiến bạn có chất lượng kém. Ngoài ra, đây là điều mà OP đặc biệt không muốn.
slhck

Câu trả lời:


13

mkvtomp4

Hình như mkvtomp4là những gì bạn muốn?

Sử dụng MP4Box, mkvtoolnix và ffmpeg của mpeg4ip hoặc GPAC để chuyển đổi các tệp mkv rắc rối sang mp4 . Việc chuyển đổi không mã hóa lại video và chỉ mã hóa lại âm thanh nếu nó không sử dụng codec AAC (người ta có thể ghi đè hành vi này bằng cách sử dụng --audio-codec).

Bạn có thể tải xuống các phiên bản Windows và Linux trên trang Google Code. Bạn sẽ cần phần mềm bổ sung mặc dù.

Kiểm tra các trang web để tải xuống cho Windows hoặc Linux. Trên OS X, bạn chỉ cần brew install mkvtoolnix mp4boxHomebrew .

Điều này sẽ không sao chép phụ đề của bạn mặc dù. Bạn sẽ cần một bước bổ sung.


Lô FFmpeg

Nếu mkvtomp4 không hoạt động với bạn, một tệp bó FFmpeg đơn giản cũng có thể làm được. Đối với Windows, bạn có thể tải xuống các bản dựng Zeranoe . Trong Linux, kiểm tra FFmpeg từ các nguồn gói. Trong OS X, sử dụng brew install ffmpeg.

Sau đó, chỉ cần gọi:

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

Điều này sẽ tạo ra một thùng chứa MP4 hợp lệ mà không cần mã hóa lại. Lặp lại các tập tin khi cần và có sẵn bởi hệ điều hành của bạn. Lô này sẽ không, tuy nhiên, sao chép phụ đề.

Trong * nix, bạn có thể làm như sau. Chỉ cần tạo một tập tin 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

Thay thế đường dẫn đến thư mục video của bạn ở đây. Làm cho nó thực thi với chmod +x convert.sh, sau đó chạy nó với ./convert.sh.

Trong Windows, bạn có thể cần hai tệp Batch ( phích cắm không biết xấu hổ từ đây ), một là startconvert.bat:

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

Và một trong đó thực hiện chuyển đổi:

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

Lưu cả hai trong thư mục video. Chỉ cần chạy startconvert.battừ thư mục bạn muốn bắt đầu chuyển đổi từ.


Phụ đề

Nếu bạn muốn thêm phụ đề, bạn có thể cần một quy trình thủ công nếu cách sau không phù hợp với bạn:

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

Để trích xuất phụ đề, sử dụng:

mkvextract tracks input.mkv 3:subtitles.srt

Điều này giả định rằng tệp của bạn thực sự chứa phụ đề ở ID số theo dõi số 3 và chúng có thể được xuất sang định dạng SRT. Để kiểm tra xem một tập tin có thực sự chứa phụ đề ở track 3 hay không, hãy sử dụng mkvmerge -i input.mkv.

Sau đó, sử dụng MP4Box để thêm lại phụ đề vào tệp MP4.

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

Để ghi lại, tôi đã thử FFmpeg và trích xuất phụ đề trên OS X và nó hoạt động hoàn hảo.
slhck

Tôi đã sử dụng ffmpeg cho Windows. Nhưng có một lô để nó tự động chuyển đổi / mux tất cả các tệp trong thư mục thành mp4 với cùng tên tệp không? Hoặc có thể một lô chuyển đổi tệp khi kéo và thả

2

Đây là một phần của câu trả lời mà slhck đã đưa ra (và cảm ơn, slhck!) Bởi vì tôi thấy rằng lệnh đó không hoạt động cho ffmpeg mới nhất (tại văn bản này) - có lẽ các tham số đã thay đổi giữa các phiên bản?

Trên Windows 7, sử dụng ffmpeg v.20130103-git-9e36d9e-win64-static (giải nén nó với tiện ích 7zip), được tìm thấy qua http://ffmpeg.zeranoe.com/builds/ lần lượt qua http://ffmpeg.org /doad.html , lệnh sau đã chuyển đổi tệp .mov (được lấy từ iPhone) thành tệp .mp4:

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

Tôi thấy rằng việc thay đổi phần .mp4 của cái này thành .avi cũng hoạt động, để thay đổi nó thành một thùng chứa .avi. Với một trong hai bộ chứa đích, sử dụng các tham số "-vcodec copy -acodec copy" này dường như chỉ sao chép các luồng nguồn vào một bộ chứa mới (trong mục tiêu), do đó, nó chuyển đổi không mất dữ liệu (và tôi đoán đó là trường hợp của một nhiều loại container mục tiêu, quá).

Những điều chỉnh của các đợt mà slhck đưa ra cũng có tác dụng với tôi:

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
Không có sự khác biệt giữa -c:a-acodec, -c:v-vcodec. Trong thực tế tôi vẫn đang sử dụng trước đây vì đây là cú pháp được đề xuất và cả hai đều được đề cập trong tài liệu FFmpeg . Lưu ý rằng việc chuyển đổi vùng chứa thành AVI có thể phá vỡ nhiều codec video và âm thanh, vì các tệp AVI không hỗ trợ mã hóa dự đoán (video H.264 sử dụng một cách mà iPhone cung cấp cho bạn). Nếu bạn không sử dụng bộ chứa MP4 hoặc MOV làm mục tiêu, việc mã hóa lại luôn luôn tốt hơn.
slhck

"NẾU EXIST% 1.mov GOTO exit" nên đọc "% 1.avi" (hoặc bất kể định dạng đích là gì, thay vì định dạng nguồn) thay vào đó, không? Ngoài ra, điều này làm việc rất tốt cho tôi, cảm ơn bạn!
kjosh

0

Câu hỏi cũ, nhưng đây là câu trả lời của tôi, cho hồ sơ. MP4 không thể làm phụ đề trừ khi chúng là một phần của khung video, nhưng đây là cách tôi chuyển đổi các tệp .mkv thành .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
}

Lưu nó dưới dạng mkv2mp4.ps1 và thả nó vào thư mục bạn đang làm việc. Nhấp chuột phải và "Mở trong Powershell" và nó sẽ làm việc của nó.

Đây là lần đầu tiên tôi thậm chí nhìn vào Powershell (và là lần cuối cùng tôi hy vọng - tại sao MS không thể chuyển sang Bash?!) Nhưng nó hoạt động với tôi và dựa trên mã tôi tìm thấy ở đây: https: // wiki .videolan.org / How_to_Batch_Encode / # Powershell


Dù bạn sử dụng dòng lệnh nào, bạn nên đặt nó bên trong Makefile- để có thể chạy lại nó và chỉ chuyển đổi các nguồn mới cũng như có thể chạy song song nhiều chuyển đổi (để sử dụng tất cả các CPU của bạn ).
Mikhail T.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.