.mkv를 .mp4로 일괄 변환


10

VLC를 사용하여 폴더의 모든 .mkv 파일을 .mp4로 일괄 변환하고 싶습니다.

원본 비디오 / 오디오 스트림과 가능한 경우 .mkv의 .ass 자막을 사용해야합니다. 실제로는 변환이 아니며 컨테이너를 변경하는 것과 비슷합니다. 플레이어가 MKV 비디오를 읽을 수 없습니다.

수동 으로이 변환을 수행하면 작동하지만 변환 할 MKV 파일이 많으므로 시간이 오래 걸립니다.

인터넷에서 배치 파일을 검색 하여이 작업을 수행했으며 몇 가지를 발견했습니다. 원하는대로 수정하려고 시도했지만 시도한 모든 시도는 오디오 스트림이 포함되지 않은 .mp4 파일을 만들었으며 PC의 모든 미디어 플레이어에서 비디오 스트림을 렌더링 할 수도 없습니다.

누군가가 배치가 어떻게 생겼는지 말해 줄 수 있으므로 원본 비디오 및 오디오 스트림 (및 .ass 자막)과 함께 작동합니까?


어떤 운영 체제를 사용하고 있으며 반드시 VLC를 사용해야합니까? 또한 ISO MP4는 내가 기억하는 한 자막을 지원하지 않습니다. 어떻게해야합니까?
slhck 2016 년

테스트를 위해 다른 플레이어를 시도 할 수 있습니다 (MPlayer는 / KMPlayer 한글 / BSPlayer)
레무스 리고

핸드 브레이크, 그게 다야.
Sam

@Sam Handbrake는 비디오 및 오디오 스트림을 다시 인코딩하므로 품질이 떨어집니다. 또한 이것은 OP가 구체적으로 원하지 않는 것입니다.
slhck

답변:


13

mkvtomp4

같은 외모는 mkvtomp4당신이 원하는 무엇인가?

문제가있는 mkv 파일을 mp4로 변환 하기 위해 mpeg4ip 또는 GPAC의 MP4Box, mkvtoolnix 및 ffmpeg를 사용 합니다 . 변환 은 비디오 를 다시 인코딩하지 않으며 AAC 코덱을 사용하지 않는 경우에만 오디오를 다시 인코딩합니다 (--audio-codec를 사용하여이 동작을 무시할 수 있음).

Google 코드 페이지에서 Windows 및 Linux 버전을 다운로드 할 수 있습니다. 그래도 추가 소프트웨어가 필요합니다.

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의 경우, 당신은 아마이 개 배치 파일 (필요 여기에서 뻔뻔한 플러그 ), 하나 개의 존재를 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

기록을 위해 OS X에서 FFmpeg와 자막 추출을 테스트했으며 완벽하게 작동했습니다.
slhck

Windows에서는 ffmpeg를 사용했습니다. 그러나 배치가있어 폴더의 모든 파일을 동일한 파일 이름으로 mp4로 자동 변환 / mux합니까? 또는 드래그 앤 드롭으로 파일을 변환하는 배치

2

이것은 명령이 최신 (이 글을 쓰는 시점) ffmpeg에서 작동하지 않는다는 것을 발견했기 때문에 slhck가 준 대답 (그리고 감사합니다, slhck!)의 일부를 조정했습니다. 매개 변수가 버전간에 변경되었을 수 있습니까?

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 documentation에 언급되어 있습니다 . 컨테이너를 AVI로 변환하면 많은 비디오 및 오디오 코덱에서 AVI 파일이 예측 코딩 (H.264 비디오가 사용하는 iPhone에서 제공하는)에 대한 지원이 부족하기 때문에 중단 될 수 있습니다. MP4 또는 MOV 컨테이너를 대상으로 사용하지 않는 경우 항상 다시 인코딩하는 것이 좋습니다.
slhck

"IF EXIST % 1.mov GOTO exit"대신 "% 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.