libx264 코덱을 사용하여 FFMPEG를 사용하여 프레임 세트에서 .mp4 비디오를 인코딩하려고합니다.
이것은 내가 실행중인 명령입니다.
/usr/local/bin/ffmpeg -r 24 -i frame_%05d.jpg -vcodec libx264 -y -an video.mp4
때때로 다음과 같은 오류가 발생합니다.
[libx264 @ 0xa3b85a0] height not divisible by 2 (520x369)
약간의 검색 후 문제는 스케일링 알고리즘과 관련이 있으며 -vf 인수를 추가하여 해결할 수 있습니다.
그러나 제 경우에는 스케일링을 원하지 않습니다. 이상적으로는 치수를 프레임과 정확히 동일하게 유지하고 싶습니다. 어떤 충고? h264가 적용하는 일종의 종횡비가 있습니까?
답변
받는 사람 대답 원래의 질문에 않습니다 하지 비디오 크기를 조정할이다 :
-vf "pad=ceil(iw/2)*2:ceil(ih/2)*2"
명령:
ffmpeg -r 24 -i frame_%05d.jpg -vcodec libx264 -y -an video.mp4 -vf "pad=ceil(iw/2)*2:ceil(ih/2)*2"
기본적으로 .h264는 짝수 차원이 필요하므로이 필터는 다음을 수행합니다.
- 원래 높이와 너비를 2로 나눕니다.
- 가장 가까운 픽셀로 반올림
- 다시 2를 곱하여 짝수로 만듭니다.
- 이 숫자까지 검은 색 패딩 픽셀 추가
필터 매개 변수를 추가하여 패딩의 색상을 변경할 수 있습니다 :color=white
. pad 문서를 참조하십시오 .
답변
그냥 사용 -2
로부터 스케일 필터 문서 :
값 중 하나가
-n
withn > 1
인 경우 스케일 필터는 지정된 다른 차원에서 계산 된 입력 이미지의 가로 세로 비율을 유지하는 값도 사용합니다. 그러나 계산 된 치수를 나눌 수 있는지 확인하고n
필요한 경우 값을 조정하십시오.
예
집합 1280 폭 및 높이를 자동으로 종횡비를 유지하기 위해 계산되고, 그리고 높이가 2로 나눌 수있을 것이다 :
-vf scale=1280:-2
위와 동일하지만 대신 높이가 선언되어 있습니다. 필터가 처리 할 너비를 남겨 둡니다.
-vf scale=-2:720
“2로 나눌 수있는”
x264에 따라 YUV 4 : 2 : 0 크로마 서브 샘플링 출력에는 “폭과 높이를 2로 나눌 수 있음”이 필요합니다. 4 : 2 : 2는 “너비로 2로 나눌 수 있음”이 필요하며 4 : 4 : 4에는 이러한 제한이 없습니다. 그러나 대부분의 비 FFmpeg 기반 플레이어는 4 : 2 : 0 만 올바르게 디코딩 할 수 있으므로 H.264 비디오를 출력 할 때 옵션 ffmpeg
이있는 명령 이 자주 표시 -pix_fmt yuv420p
됩니다.
경고
불행히도 -2
너비 와 높이 모두에 사용할 수는 없지만 이미 하나의 치수를 지정한 경우 사용하는 -2
것이 간단한 해결책입니다.
답변
출력 너비를 설정하고 원본과 동일한 비율로 출력하려는 경우
scale=720:-1
이 문제에 빠지지 않으면 사용할 수 있습니다.
scale="720:trunc(ow/a/2)*2"
(스케일링으로 방법을 찾는 사람들에게만 해당)
답변
이 scale
솔루션 의 문제점 은 소스 이미지 / 비디오가 왜곡되어 사용자가 원하는 것이 거의 없다는 것입니다.
대신, 가장 좋은 해결책은 홀수 치수에 1 픽셀 패드를 추가하는 것입니다. 기본적으로 패딩은 검은 색이며 알아 채기가 어렵습니다.
다른 pad
솔루션 의 문제점 은 항상 패딩하기 때문에 임의의 크기를 일반화하지 않는다는 것입니다.
이 솔루션은 홀수 인 경우 높이 및 / 또는 너비에 1 픽셀 패드 만 추가합니다.
-vf pad="width=ceil(iw/2)*2:height=ceil(ih/2)*2"
패딩이 필요없는 경우에도 항상 올바른 작업을 수행하기 때문에 이상적입니다.
답변
압축을 적용하기 전에 H264 비디오가 일반적으로 RGB에서 YUV 공간으로 4 : 2 : 0으로 변환된다는 사실 때문일 수 있습니다 (형식 변환 자체는 손실 압축 알고리즘이지만 공간 절약은 50 %입니다).
YUV-420은 RGB (Red Green Blue) 영상으로 시작하여 YUV (기본적으로 1 개의 강도 채널과 2 개의 “hue”채널)로 변환합니다. 그런 다음 해당 색조의 2X2 사각형마다 하나의 색조 샘플을 생성하여 색조 채널을 서브 샘플링합니다.
가로 또는 세로로 홀수의 RGB 픽셀이있는 경우 YUV 프레임의 서브 샘플링 된 색조 공간에서 마지막 픽셀 열 또는 행에 대한 데이터가 불완전합니다.
답변
LordNeckbeard는 정답이 매우 빠릅니다.
-vf scale=1280:-2
안드로이드의 경우 추가를 잊지 마십시오
"-preset ultrafast" and|or "-threads n"
답변
다음 bitand
대신에 함수를 사용할 수도 있습니다 trunc
.
바이트 (x, 65534)
과 동일 할 것입니다 trunc(x/2)*2
그리고 그것은 내 의견에 더 투명합니다.
( 여기서 마법의 숫자 65534를 고려 하십시오.)
내 임무는 자동 으로 많은 비디오 파일을 절반 해상도 로 조정하는 것이 었습니다 .
scale=-2,ih/2
이미지 가 약간 흐려짐
이유:
- 입력 비디오의 디스플레이 종횡비 (DAR) 설정
scale
실제 프레임 크기를 조정합니다- 미리보기 중에 새로운 비디오의 크기는 DAR 을 사용하여 수정해야합니다. 이로 인해 반응이 매우 적은 비디오 (360×288, DAR 16 : 9)의 경우 흐려질 수 있습니다
해결책:
-vf "scale='bitand(oh*dar, 65534)':'bitand(ih/2, 65534)', setsar=1"
설명:
- output_height = 입력 _ 높이 / 2
- output_width = output_height * 원본 _ 디스플레이 _aspect_ratio
- 모두 output_width 및 output_height는 지금 2 가까운 작은 숫자 나눌로 반올림됩니다
setsar=1
output_dimensions 가 최종 임을 의미하며 , 가로 세로 비율 수정이 적용되지 않아야 함
누군가 도움이 될 수 있습니다.
