저는 사용자들이 비디오를 업로드할 수 있는 프로젝트를 진행하고 있습니다. FFmpeg를 사용하여 비디오에서 일부 이미지를 가져와서 GIF를 만들 수 있는 방법이 있습니까?
프로젝트가 Java로 작성되었기 때문에 비디오에서 이미지를 가져올 수 있는 방법이 있지만 GIF를 생성하려면 여러 이미지가 필요하고 비용이 많이 듭니다.
서버는 Debian X64 시스템을 실행하고 있으므로 FFMpeg가 적합하지 않은 경우 Linux의 다른 도구를 사용하여 이 작업을 효율적으로 수행할 의향이 있습니다.
답변1
저는 비디오에서 장면을 추출하기 위해 Linux를 사용하고 있습니다 vlc
. 그렇지 않은 경우
apt-get install vlc
설치하세요. 설치한 후에는 다음 명령줄의 변형을 사용하여 비디오에서 프레임을 추출할 수 있습니다. 기본 이미지 형식은 png
내 목적에 잘 맞는 입니다. 이미지 사용을 고집한다면 이미지 형식 변환 gif
설치를 권장합니다 . imagemagick
프레임을 추출하는 명령은 다음과 같습니다.
cvlc ${videofile} \
--video-filter=scene \
--vout=dummy \
--start-time=${start-sec} --stop-time=${end-sec} \
--scene-ratio=1 --scene-prefix=${prefix} \
--scene-path=${MyStorePath} \
vlc://quit
어디
videofile
mp4 형식의 동영상입니다. 다른 형식도 가능할 수 있지만 테스트되지 않았습니다.
start-sec
프레임 캡처를 시작하려는 위치(초)입니다.
end-sec
시작 후 몇 초 이내에 프레임 캡처를 끝내려는 위치입니다. 보다 커야합니다start-sec
prefix
는 캡처된 이미지 파일 이름의 접두어입니다.
MyStorePath
캡처한 이미지를 저장하려는 경로입니다.
이 명령은 비디오 길이를 계산하는 데 도움이 될 수 있습니다.
ffmpeg -i ${vidfile} 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,//
출력이 HH:MM:SS.xx
포맷되었습니다. 초 단위의 비디오 길이로 변환하려면 다음을 사용합니다.
l=$(ffmpeg -i ${vidfile} 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,//)
h=$(echo $l|cut -d: -f1)
m=$(echo $l|cut -d: -f2)
s=$(echo $l|cut -d: -f3|cut -d"." -f1)
(( hh=$h*3600 ))
(( mm=$m*60 ))
(( LengthSeconds=$hh+$mm+$s ))
이 시점에서 LengthSeconds
변수를 조작하여 시작 및 종료 시간을 자동으로 결정할 수 있습니다. 불행히도 내 vlc
명령이 작동 하려면~ 해야 하다프레임이 추출되는 시간 조각을 지정합니다.