파일을 다시 인코딩 할 수 있도록 ffmpeg를 사용하여 H.265 mkv를 H.264로 일괄 변환


31

리소스를 많이 사용하는 H.265로 인코딩 된 파일이 제대로 재생되지 않으며 변환 소프트웨어 (멘 코더)가 (현재) H.265 형식을 지원하지 않습니다. 명령 줄 배치 파일에서 H.264로 변환하여 Devede / OGMrip을 사용하여 다시 압축 할 파일을 신속하게 변환 할 수 있습니까? 이 사이트를 검색했을 때 나는 그것이 토론 된 것을 발견하지 못했기 때문에 유용한 질문이라고 생각하고 질문에 대한 답변을 게시 할 것입니다.

답변:


37

예.를 사용 ffmpeg합니다.

터미널을 열고 H.265로 인코딩 된 파일이 포함 된 디렉토리로 지시하십시오 ffmpeg. 해당 라이브러리가 설치되어 있고 해당 라이브러리가 MKV 형식이라고 가정하고 다음을 터미널 창에 붙여 넣으십시오.

INPUT="$1"
for i in *.mkv ; do
    ffmpeg -i "$i" -bsf:v h264_mp4toannexb -sn -map 0:0 -map 0:1 -vcodec libx264 "$i.ts"
    mv "$i.ts" "$i.mpg"
    sleep 3
done

거기 있어요 동일한 디렉토리의 MPG 컨테이너에서 h.264로 변환됩니다.

명령 스위치에 대한 설명 :

  • for i in *.mkv ; do ... done

    이는 배치 프로세스에 포함되도록 디렉토리에 모든 .mkv 파일을 설정합니다. 처리하려는 파일의 컨테이너 확장명을 수용하도록 변경 될 수 있습니다.

  • ffmpeg -i "$i" 프로그램 ffmpeg를 실행하고 처리 할 파일을 호출합니다.

    • -bsf:v 사용할 비디오 비트 스트림 필터를 활성화합니다.

    • h264_mp4toannexb -활성화 된 비트 스트림 필터입니다.

      H.264 비트 스트림을 길이 접두사 모드에서 시작하여 코드 접두사 모드를 시작하십시오 (ITU-T H.264 사양의 부록 B에 정의 된대로).

      이것은 일부 스트리밍 형식에서 필요하며 일반적으로 mpegtsMKV h.264를 처리 하는 MPEG-2 전송 스트림 형식 ( )이 필요합니다 (포함되어 있지 않은 경우).

    • -sn 자막 스트림의 스트리밍을 중지합니다 (동영상에 자막을 원하지 않는 경우) 선택 사항이며 제거 할 수 있습니다.

    • -map 0:0 -map 0:1ffmpeg에게 파일의 처음 두 스트림 만 처리하도록 지시합니다 ( 0:0비디오 스트림, 0:1파일의 첫 번째 오디오 스트림). 이것은 두 가지 작업을 수행하여 과도한 오디오 스트림을 제거합니다. 일반적으로 첫 번째 오디오 스트림은 영어이지만 항상 그런 것은 아닙니다. 포함 된 자막과 같은 다른 스트림이 제거되어 파일 크기가 줄어 듭니다. 이것은 또한 선택적 문자열입니다. ffprobe파일에서 사용 가능한 스트림을 보는 데 사용할 수 있습니다 . -map선택적이며 명령에서 버릴 수 있습니다.

    • -vcodec libx264 이것은 ffmpeg에게 출력을 H.264로 인코딩하도록 지시합니다.

    • "$i.ts" 출력을 .ts 형식으로 저장합니다. 소스 파일을 덮어 쓰지 않도록하는 데 유용합니다.

  • mv "$i.ts" "$i.mpg"동일한 디렉토리에서 파일 확장자를 MPG로 변환합니다. 원하는 디렉토리로 보내도록 설정할 수 있습니다.

  • sleep 3 -프로세스가 ffmpeg 시간을 주어 다음 파일을 큐에 넣을 수있게합니다.


3
우수한! 이제 질문 아래의 주석을 삭제할 수 있습니다. 나는 sleep 3불필요 하다고 말하지만 (루프를 종료하는 데 유용 할 수 있음) INPUT=$1대화 형 쉘에서 직접 실행하기 때문에 의미가 없습니다.
muru December

11
다시 인코딩 하는 대신 오디오를 스트림 복사 하는 것을 고려하십시오 -c:a copy. 또한 0:0항상 비디오를 0:1나타내는 것은 아니며 항상 오디오를 나타내는 것은 아닙니다. 당신은 잠재적 인 문제를 방지하기 위해 스트림 지정자를 사용할 수 있습니다 : -map 0:v -map 0:a당신이 입력 0에서 모든 비디오 및 오디오 스트림을 원하는 경우, 또는 -map 0:v:0 -map 0:a:0당신은 단지 입력 0에서 첫 번째 비디오 및 오디오 스트림을 원하는 경우에만 영어 오디오 스트림을 원하는 경우 : -map 0:m:language:eng(그것을 가정 표시되어 있습니다).
llogan

1
@LordNeckbeard 완전한 답변을 작성해 주셔서 감사합니다.
Fran Marzoa

1
@Fran 그 의견에 대해 많은 찬사를 받았음을 알지 못했습니다. 더 간단하고 오류가 적으며 더 효율적인 방법을 사용하여 답변 을 추가했습니다 .
llogan

1
나는 단순히 간단하게 갈 것 ffmpeg -i $INPUT -vcodec h264 -acodec copy $OUTPUT입니다. 내가 매일 사용하고 모든 ffmpeg 답변이 그렇게 악명 높은 의미없는 깃발의 사격과는 대조적으로 실제로 암기 할 수있는 것.
벤 싱클레어

20

H.265에서 H.264로 일괄 변환

이 예제는 최근에 작성된 것입니다 ffmpeg. 문제를 해결하고 최신 버전을 다운로드 하십시오 . 그런 다음 ffmpeg바이너리를 ~/bin또는에 넣으십시오 /usr/local/bin(알아 두려면 로그 아웃 한 후 로그인해야 할 수도 있습니다).

마트로 스카 출력

mkdir h264vids
for f in *.mp4; do ffmpeg -i "$f" -map 0 -c copy -c:v libx264 -crf 23 -preset medium h264vids/"${f%.*}.mkv"; done
  • 이 예제는라는 디렉토리로 출력됩니다 h264vids.

  • 이 예에서는 입력 값이이라고 가정합니다 .mp4. 그렇지 않은 경우 .mp4예제 의 인스턴스를 입력 파일 유형으로 변경하거나 욕심 만 사용하십시오 *.

  • -crf품질 및 -preset인코딩 속도 / 효율에 맞게 조정하십시오 . 또는 이러한 옵션을 제거하고 상당히 양호하고 대부분의 경우 충분해야하는 기본값을 사용하십시오 (예 : 이러한 옵션의 기본값을 사용하는 예). 이러한 옵션에 대한 자세한 내용은 FFmpeg Wiki : H.264 를 참조하십시오 .

MP4 출력

이것은 조금 더 복잡합니다. 입력 오디오가 AAC인지 여부에 따라 조건부 인코딩을 수행합니다. 입력 오디오가 AAC 인 경우 오디오는 그대로 스트림 복사 (다시 muxed)되며 불필요한 재 인코딩을 피할 수 있습니다. 입력 오디오가 AAC 가 아닌 경우 AAC로 다시 인코딩됩니다.

다음은 ffprobeand를 사용하여이 작업을 수행하는 방법을 보여주는 간단한 스크립트 ffmpeg입니다. 변환 할 비디오가 들어있는 디렉토리에 복사하여 저장 chmod +x yourscriptname한 다음에 실행 권한을 부여한 다음로 실행하십시오 ./yourscriptname.

#!/bin/bash

mkdir h264vids

for f in *.mkv
do
  audioformat=$(ffprobe -loglevel error -select_streams a:0 -show_entries stream=codec_name -of default=nw=1:nk=1 "$f")
  if [ "$audioformat" = "aac" ]; then
    ffmpeg -i "$f" -c:v libx264 -crf 23 -preset medium -c:a copy -movflags +faststart h264vids/"${f%.*}.mp4"
  else
    ffmpeg -i "$f" -c:v libx264 -crf 23 -preset medium -c:a aac -movflags +faststart h264vids/"${f%.*}.mp4"
  fi
done
  • 이 예제는라는 디렉토리로 출력됩니다 h264vids.

  • 이 예에서는 입력 값이이라고 가정합니다 .mkv. 그렇지 않은 경우 .mkv예제 의 인스턴스를 입력 파일 유형으로 변경하거나 욕심 만 사용하십시오 *.

  • -crf및 에 대해서는 위의 참고를 참조하십시오 -preset.

  • ctrl+로 인코딩을 일시 중지 z하고로 다시 시작할 수 있습니다 fg.


0

이전 답변을 고려하여 다음을 생각해 냈습니다.

for file in *265.mkv; do nice -n19 ffmpeg -i $file -c copy -c:v libx264 ${file/%265.mkv/264.mkv}; done

파일 이름은 항상으로 끝나는 것으로 가정합니다 265.mkv. 이 결말은로 대체됩니다 264.mkv.

파일 이름이 다른 경우 그에 따라 명령을 조정해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.