답변:
예.를 사용 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에 정의 된대로).
이것은 일부 스트리밍 형식에서 필요하며 일반적으로 mpegts
MKV h.264를 처리 하는 MPEG-2 전송 스트림 형식 ( )이 필요합니다 (포함되어 있지 않은 경우).
-sn
자막 스트림의 스트리밍을 중지합니다 (동영상에 자막을 원하지 않는 경우) 선택 사항이며 제거 할 수 있습니다.
-map 0:0 -map 0:1
ffmpeg에게 파일의 처음 두 스트림 만 처리하도록 지시합니다 ( 0:0
비디오 스트림, 0:1
파일의 첫 번째 오디오 스트림). 이것은 두 가지 작업을 수행하여 과도한 오디오 스트림을 제거합니다. 일반적으로 첫 번째 오디오 스트림은 영어이지만 항상 그런 것은 아닙니다. 포함 된 자막과 같은 다른 스트림이 제거되어 파일 크기가 줄어 듭니다. 이것은 또한 선택적 문자열입니다. ffprobe
파일에서 사용 가능한 스트림을 보는 데 사용할 수 있습니다 . -map
선택적이며 명령에서 버릴 수 있습니다.
-vcodec libx264
이것은 ffmpeg에게 출력을 H.264로 인코딩하도록 지시합니다.
"$i.ts"
출력을 .ts 형식으로 저장합니다. 소스 파일을 덮어 쓰지 않도록하는 데 유용합니다.
mv "$i.ts" "$i.mpg"
동일한 디렉토리에서 파일 확장자를 MPG로 변환합니다. 원하는 디렉토리로 보내도록 설정할 수 있습니다.
sleep 3
-프로세스가 ffmpeg 시간을 주어 다음 파일을 큐에 넣을 수있게합니다.
-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
(그것을 가정 표시되어 있습니다).
ffmpeg -i $INPUT -vcodec h264 -acodec copy $OUTPUT
입니다. 내가 매일 사용하고 모든 ffmpeg 답변이 그렇게 악명 높은 의미없는 깃발의 사격과는 대조적으로 실제로 암기 할 수있는 것.
이 예제는 최근에 작성된 것입니다 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 를 참조하십시오 .
이것은 조금 더 복잡합니다. 입력 오디오가 AAC인지 여부에 따라 조건부 인코딩을 수행합니다. 입력 오디오가 AAC 인 경우 오디오는 그대로 스트림 복사 (다시 muxed)되며 불필요한 재 인코딩을 피할 수 있습니다. 입력 오디오가 AAC 가 아닌 경우 AAC로 다시 인코딩됩니다.
다음은 ffprobe
and를 사용하여이 작업을 수행하는 방법을 보여주는 간단한 스크립트 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
.
sleep 3
불필요 하다고 말하지만 (루프를 종료하는 데 유용 할 수 있음)INPUT=$1
대화 형 쉘에서 직접 실행하기 때문에 의미가 없습니다.