[ffmpeg] FFMPEG (libx264)“높이를 2로 나눌 수 없음”

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는 짝수 차원이 필요하므로이 필터는 다음을 수행합니다.

  1. 원래 높이와 너비를 2로 나눕니다.
  2. 가장 가까운 픽셀로 반올림
  3. 다시 2를 곱하여 짝수로 만듭니다.
  4. 이 숫자까지 검은 색 패딩 픽셀 추가

필터 매개 변수를 추가하여 패딩의 색상을 변경할 수 있습니다 :color=white. pad 문서를 참조하십시오 .


답변

그냥 사용 -2

로부터 스케일 필터 문서 :

값 중 하나가 -nwith n > 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_widthoutput_height는 지금 2 가까운 작은 숫자 나눌로 반올림됩니다
  • setsar=1output_dimensions 가 최종 임을 의미하며 , 가로 세로 비율 수정이 적용되지 않아야 함

누군가 도움이 될 수 있습니다.