문제

FFMPEG를 사용하여 비디오의 중간 프레임을 잡는 방법이 궁금합니다. 나는 이미 특정 시간에 프레임을 잡기 위해 C#을 작성했습니다 (즉, 두 번째 프레임을 잡아 당겼습니다). 그러나 FFMPEG 명령을 사용하여 비디오 중간을 찾는 방법을 아직 알지 못했습니다.

도움이 되었습니까?

해결책

이것은 단순화 될 수 있지만 여기에 내가 거짓말을했던 오래된 PHP 코드가 있습니다. (경로에없는 경우 FFMPEG에 위치를 추가하십시오)

$output = shell_exec("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("ffmpeg -y  -i {$path} -f mjpeg -vframes 1 -ss " . ($total_seconds / 2) . " -s {$w}x{$h} {$output_filename}");   

다른 팁

FFMPEG는 프레임 속도와 비디오의 길이를 얻는 데 도움이되므로 다른 하나를 곱하고 2로 나뉘어 중간 프레임의 수를 얻을 수 있습니다.

즉, 초당 15 프레임에서 실행되는 30 초 비디오 : 30 * 15 = 450 / 2 = 225의 경우 225 번째 프레임을 잡아야합니다.

간단한 쉘 스크립팅을 사용하면 사용할 수 있습니다 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

이것은 PHP에 대한 필요성을 제거하고 echo, awk, tr, grep, sed, 등.

이 bash 명령은 매력 (테스트)처럼 작동합니다.

avconv -i 'in.mpg' -vcodec mjpeg -vframes 1 -an -f rawvideo -s 420x300 -ss avconv -i in.mpg 2>&1 | grep Duration | awk '{print $2}' | tr -d , | awk -F ':' '{print ($3+$2*60+$1*3600)/2}' out.jpg
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top