FFmpeg를 사용하여 비디오 중간에 썸네일을 만드는 방법

FFmpeg를 사용하여 비디오 중간에 썸네일을 만드는 방법

FFmpeg에서 비디오 썸네일을 가져오는 방법이 있습니까?

가장 가운데 있는 프레임을 비디오로 가져와서 썸네일로 사용하고 싶습니다. 동영상 길이를 알 수 없습니다.

썸네일의 크기를 지정하는 기능도 도움이 될 것입니다.

답변1

한 줄 명령 :

ffmpeg -i input.mp4 -vcodec mjpeg -vframes 1 -an -f rawvideo -ss `ffmpeg -i input.mp4 2>&1 | grep Duration | awk '{print $2}' | tr -d , | awk -F ':' '{print ($3+$2*60+$1*3600)/2}'` output.jpg

하위 명령은 입력 비디오의 총 지속 시간을 가져옵니다.

ffmpeg -i input.mp4 2>&1 | grep Duration | awk '{print $2}' | tr -d ,

그리고 이것을 파이프로 연결하여 awk이렇게 기간/2를 계산합니다.

echo '00:01:30.000' | awk -F ':' '{print ($3+$2*60+$1*3600)/2}'

그래서 -ss 옵션에 몇 초를 주면 완료됩니다.

크기를 지정하려면 WxH와 같은 -s 옵션을 추가하세요. 여기서 W와 H는 정수 값(예: -s 800x600 또는 -s svga)입니다. 또는 ffmpeg 매뉴얼 페이지를 읽어 다른 사용 가능한 옵션이나 형식을 확인하세요.

답변2

다음을 사용하는 방법이 있습니다.

  • ffprobe기간을 얻으려면
  • bc기간의 절반을 계산하려면
  • ffmpeg썸네일 이미지를 만들려면

예:

input=input.mp4; ffmpeg -ss "$(bc -l <<< "$(ffprobe -loglevel error -of csv=p=0 -show_entries format=duration "$input")*0.5")" -i "$input" -frames:v 1 half.png

답변3

우선, 항상 최신 버전의 FFmpeg를 사용하세요.

PHP에 액세스할 수 있는 경우 Stack Overflow에서 귀하의 질문에 대한 완벽한 답변을 얻을 수 있습니다.FFMpeg를 사용하여 비디오의 중간 프레임을 얻으시겠습니까?

$output = shell_exec("/usr/local/bin/ffmpeg -i {$path}");
preg_match('/Duration: ([0-9]{2}):([0-9]{2}):([^ ,])+/', $output, $matches);
$time = str_replace("Duration: ", "", $matches[0]);
$time_breakdown = explode(":", $time);
$total_seconds = round(($time_breakdown[0]*60*60) + ($time_breakdown[1]*60) + $time_breakdown[2]);
shell_exec("/usr/local/bin/ffmpeg -y  -i {$path} -f mjpeg -vframes 1 -ss " . ($total_seconds / 2) . " -s {$w}x{$h} {$output_filename}"; 

그것이 할 일은 FFmpeg의 출력에서 ​​지속 시간을 추출하고 이를 사용하여 중간 프레임의 타임코드를 결정하는 것입니다.

이를 다른 쉘에 쉽게 적용하고 다음 명령에 삽입하기만 하면 됩니다. 여기서 중간 프레임은 대략 534초 단위입니다.

ffmpeg -y  -i input.mp4 -f mjpeg -vframes 1 -ss 534 thumbnail.jpg

-s 480x320옵션 뒤 어딘가에 삽입하여 원하는 크기에 따라 언제든지 크기를 변경할 수 있습니다 -i input.mp4.


위의 해결책은 약간 부정확합니다. 즉시 결과를 제공하지만 원하는 프레임을 지정할 수는 없습니다. 추출하려는 정확한 프레임을 이미 알고 있는 경우 필터를 사용하십시오 select(예: 프레임 번호 포함) 12345.

ffmpeg -i input.mp4 -filter:v select="eq(n\,12345)" -vframes 1 thumbnail.jpg

이 명령은 특정 프레임을 추출하기 전에 지정된 프레임으로 건너뛰어야 하기 때문에 시간이 걸릴 수 있습니다.

답변4

간단한 해결책은 다음과 같습니다.

 ffmpeg -i l1.mp4 -ss 00:00:14.435 -vframes 1 out.png

관련 정보