استخدام FFMPEG للحصول على الإطار الأوسط من الفيديو؟

StackOverflow https://stackoverflow.com/questions/1066638

  •  21-08-2019
  •  | 
  •  

سؤال

وأنا أتساءل كيفية استخدام FFMPEG لGRAP الإطار الأوسط من شريط فيديو. لقد كتبت بالفعل C # لانتزاع إطار في وقت معين (أي سحب إطار واحد في الثانية 3). ولكن أنا حتى الآن لمعرفة كيفية العثور على منتصف الفيديو باستخدام الأوامر 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 للحصول على عدد من الإطار الأوسط.

وأي لمدة 30 ثواني الفيديو على التوالي في 15 لقطة في الثانية: 30 * 15 = 450/2 = 225، وهذا يعني أنك بحاجة للاستيلاء على إطار 225th

.

ومع بسيطة قذيفة البرمجة يمكنك استخدام 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، وما إلى ذلك.

وهذا الأمر باش يعمل مثل السحر (اختبار):

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