약 20분 길이의 720p 비디오 파일이 있습니다. 단일 연산자(예: 밝게, 어둡게 등)를 사용하여 비디오의 각 프레임을 합성하여 단일 이미지 출력을 생성하고 싶습니다.
내 생각은 Imagemagick의 변환 기능을 사용하여 다음과 같이 이 작업을 수행할 수 있다는 것이었습니다.
convert video.mp4 -compose Lighten output.jpg
하지만 몇 분 동안 실행하면 메모리가 부족해집니다.많은대부분의 메모리를 허용하도록 정책을 설정했습니다.) 내부적으로는 ffmpeg를 호출하는 것처럼 보이지만 무슨 일이 일어나든 매우 비효율적인 것 같습니다. 여러 개의 720p 프레임을 RAM에 한 번에 로드하려면 수십 GB의 RAM이 필요합니다(하나는 합성용이고 다른 하나는 새 프레임용).
비디오를 이미지로 합성하는 더 빠르고 효율적인 방법은 무엇입니까?
답변1
이 작업은 ffmpeg를 사용하여 효율적으로 수행할 수 있지만, 결합해야 하는 프레임 수를 정확히 알아야 합니다. tblend
인접한 프레임을 병합하려면 필터를 설정해야 합니다. 각 필터는 프레임 수를 절반으로 분할합니다.
내 경우에는 72,000프레임(20분 @ 60fps)이 있었습니다. 16개의 스테이지를 선택했는데, 이렇게 하면 영상이 65536으로 나누어지기 때문입니다.tblend
문서설명하다:
기본적으로 가장 긴 입력이 종료되면 출력도 종료됩니다.
이것으로부터 나는 마지막 나누기가 전체 길이 입력과 올바르게 결합되어야 하는 짧은 입력을 생성해야 하기 때문에 131072로 나누어야 한다고 예상했습니다. 하지만 17단계를 사용하면 출력이 생성되므로 Output file is empty, nothing was encoded
16단계로 줄였고, 그 시점에서 이미지 출력이 나왔습니다.
마지막 명령은 다음과 같습니다.
ffmpeg -i $I -vf "tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,setpts=1*PTS" -f image2 $O.png
여기서 $I는 입력 파일이고, $O는 확장자가 제거된 입력 파일입니다.
이에 비해 convert
20분 길이의 비디오 파일에 대해 위 명령과 함께 ffmpeg를 사용하면 1분 남짓 소요되며 무시할 만큼의 처리 메모리를 사용합니다.