FFmpeg를 사용하여 모든 짝수 프레임이나 홀수 프레임을 드롭합니까?


14

원본 비디오를 가져 와서 홀수 프레임 또는 프레임 만 포함하는 새 비디오를 추출 할 수있는 정확한 방법이 있습니까 (선택 사항).

예 :

400 프레임 (0-399)의 "blah.yuv"가 있습니다. 프레임 1-399 (1,3,5,7 ... 399)가 포함 된 "blahOdd.yuv"를 만들고 싶습니다. 및 0-398 (0,2,4,6 ... 398) 프레임을 포함하는 "blahEven".

모든 아이디어를 어떻게 FFmpeg를 사용하여 그것을 할 수 있습니까?

답변:


11

정확하게 작동하려면 먼저 RAW YUV 비트 스트림으로 비디오를 변환하십시오 (아직없는 경우).

ffmpeg -i input.mp4 -an -vcodec rawvideo -pix_fmt yuv420p rawbitstream.yuv

다음 단계 : select 필터 걸리다 표현 , 어디서 n 프레임 번호입니다.

ffmpeg -r 2 -s WxH -i rawbitstream.yuv -filter:v select="mod(n-1\,2)" \
-c:v rawvideo -r 1 -format rawvideo -pix_fmt yuv420p -an odd.yuv

ffmpeg -r 2 -s WxH -i rawbitstream.yuv -filter:v select="not(mod(n-1\,2))" \
-c:v rawvideo -r 1 -format rawvideo -pix_fmt yuv420p -an even.yuv

가지고있다 ffmpeg 프레임을 복제하지 않으면 입력의 프레임 속도의 절반을 강제해야합니다. 그래서 "2"를 입력으로 지정하고 "1"을 출력으로 설정합니다. 원시 비트 스트림에이 정보를 전달하는 헤더가 없으므로 WxH를 클립의 실제 크기로 바꾸는 것을 잊지 마십시오.

위의 방법 대신 다른 방법으로 setpts 필터를 사용하여 출력에 대한 새 타임 스탬프를 설정합니다. 그러나 프레임을 정확하게 떨어 뜨리지 않으므로 조심하십시오. 여기에서 25는 원하는 실제 출력 프레임 속도입니다.

ffmpeg -i input.mp4 -filter:v select="mod(n-1\,2)",setpts="N/(25*TB)" \
-c:v rawvideo -r 12.5 -format rawvideo -pix_fmt yuv420p -an odd.yuv

ffmpeg -i input.mp4 -filter:v select="not(mod(n-1\,2))",setpts="N/(25*TB)" \
-c:v rawvideo -r 12.5 -format rawvideo -pix_fmt yuv420p -an even.yuv

물론 다른 픽셀 형식을 선택할 수 있습니다 ( ffmpeg -pix_fmts ). 파일을 읽을 때 픽셀 크기와 픽셀 형식을 알고 있는지 확인하십시오.

ffmpeg -f rawvideo -s:v 1280x720 -pix_fmt yuv420p input.yuv …

고마워, 새 버전의 FFMPEG의 경우 -filter 대신 -vf 여야합니다. v. 또한 n (n-1 \, 2) mod (n-1 \, 2)이어야합니다. 프레임 수가 0에서 시작하는 동안 n 카운터가 1에서 시작하는 것 같습니다. 그렇지 않으면 첫 번째 프레임이 3 번 복사됩니다. 하지만 여전히 문제가 있습니다. 프레임을 복제하면서 제거하고 싶습니다. 예 : 최종 클립에는 프레임의 절반 만 포함됩니다.
Mark

-vf 별칭입니다. -filter:v. 나는 지금 그것을 안정적으로 테스트 할 수는 없지만 나중에 기계로 돌아올 때 이것을 조사 할 것입니다. 어쩌면 tinterlace 필터 똑같이 할 수 있니?
slhck

'-r 2 -i blah.yuv -r 1'시도했는데 오류가 있음을 보여줍니다. 옵션 프레임 속도를 찾을 수 없습니다.
Mark

아아, 미안 .. 스크래치, 이건 (더 이상) 작동하지 않으며 이미지에만 해당됩니다.
slhck

1
@AnmolSinghJaggi 아니요, 이것은 프레임을 방금 떨어 뜨립니다. 그러나 너무 결정적 (즉, 홀수 프레임마다 떨어 뜨림)인지 확신 할 수 없습니다. 정확하지 않을 수도있는 시간 코드를 기반으로합니다.
slhck

2

ffmpeg가 AviSynth 플래그로 빌드 된 경우 나는 믿는다 당신은 .avs 파일.

달리기로 확인할 수 있습니다. ffmpeg 찾고 --enable-avisynth ~ 안에 구성 데이터. --enable-avisynth

그것이 있으면 다음과 같이 사용할 수 있습니다 : ffmpeg -i blahEven.avs blahEven.yuv.

어디에 blahEven.avs 간단합니다 :

ffvideosource ( "blah.yuv"). SelectEven ()

홀수 프레임의 경우 SelectOdd().

고급 사용법은 SelectEvery 선적 서류 비치.


이것은 훌륭한 대안이지만 제가 언급 한 것처럼 저는 ffmpeg만을 사용하도록 제한되어 있습니다. 그 이유는 .bat 파일 만 생성하고 AVS를 추가 할 가능성은없는 자동화 된 시스템의 일부이기 때문입니다.
Mark

@ 마크 생각했다면 if --enable-avisynth AviSynth가 ffmpeg에 내장되어 있다는 의미 였지만, 확실하지 않습니다.
Louis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.