video - شرح - إحضار إطار العد مع ffmpeg



ffplay (8)

هل يعرف أحد كيفية إحضار عدد الإطارات الإجمالي من ملف فيديو باستخدام ffmpeg؟ يُظهر الناتج من ffmpeg الإطار الحالي وأحتاج إلى حساب الإطار لحساب التقدم في النسبة المئوية.

https://code.i-harness.com


حسابها على أساس الوقت ، بدلا من ذلك.

هذا ما أفعله ويعمل بشكل رائع بالنسبة لي ، وغير ذلك الكثير.) أولاً ، ابحث عن طول الفيديو في المقتطف أدناه:

Seems stream 0 codec frame rate differs from container frame rate: 5994.00 
(5994/1) -> 29.97 (30000/1001)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/Users/stu/Movies/District9.mov':
  Duration: 00:02:32.20, start: 0.000000, bitrate: 9808 kb/s
    Stream #0.0(eng): Video: h264, yuv420p, 1920x1056, 29.97tbr, 2997tbn, 5994tbc
    Stream #0.1(eng): Audio: aac, 44100 Hz, 2 channels, s16
    Stream #0.2(eng): Data: tmcd / 0x64636D74

يجب أن تكون قادرًا على العثور على Duration: hh:mm:ss.nn باستمرار Duration: hh:mm:ss.nn لتحديد حجم مقطع الفيديو المصدر. بعد ذلك ، بالنسبة لكل خط تحديث (CR ، لا LF) ، يمكنك تحليل النص للعلامة الزمنية الحالية على:

frame=   84 fps= 18 q=10.0 size=       5kB time=1.68 bitrate=  26.1kbits/s    
frame=   90 fps= 17 q=10.0 size=       6kB time=1.92 bitrate=  23.8kbits/s    
frame=   94 fps= 16 q=10.0 size=     232kB time=2.08 bitrate= 913.0kbits/s    

فقط احرص على عدم توقع إخراج مثالي من خطوط الحالة هذه. يمكن أن تشمل رسائل خطأ مثل هنا:

frame=   24 fps= 24 q=-1.0 size=       0kB time=1.42 bitrate=   0.3kbits/s    
frame=   41 fps= 26 q=-1.0 size=       0kB time=2.41 bitrate=   0.2kbits/s    
[h264 @ 0x1013000]Cannot parallelize deblocking type 1, decoding such frames in
sequential order
frame=   49 fps= 24 q=26.0 size=       4kB time=0.28 bitrate= 118.1kbits/s    
frame=   56 fps= 22 q=23.0 size=       4kB time=0.56 bitrate=  62.9kbits/s    

وبمجرد أن يكون لديك الوقت ، فهي عبارة عن رياضيات بسيطة: time / durration * 100 = % done .


آسف للإجابة necro ، ولكن ربما سوف تحتاج هذا (كما لم أجد حلا للإصدارات ffmpeg الأخيرة.

مع ffmpeg 3.3.4 وجدت أنه يمكن للمرء أن يجد ما يلي:

ffprobe -i video.mp4 -show_streams -hide_banner | grep "nb_frames"

في النهاية ، سيتم إخراج عدد الإطارات. عملت لي على أشرطة الفيديو مع الصوت. إنه يعطي مرتين خط "nb_frames" ، على الرغم من ذلك ، لكن السطر الأول كان العدد الفعلي للإطار على مقاطع الفيديو التي اختبرتها.


جرب هذا:

ffmpeg -i "path to file" -f null /dev/null 2>&1 | grep 'frame=' | cut -f 2 -d ' '

جرّب شيئًا مثل:

ffmpeg -i "path to file" -f null /dev/null

يكتب رقم الإطار إلى stderr ، بحيث يمكنك استرداد الإطار الأخير من هذا.


لا تخزن جميع التنسيقات عدد إطاراتها أو المدة الإجمالية لها - وحتى لو فعلت ذلك ، فقد يكون الملف غير مكتمل - لذلك لا يكشف ffmpeg عن أي منهما بدقة بشكل افتراضي.

بدلاً من ذلك ، حاول البحث عن نهاية الملف وقراءة الوقت ، ثم عد الوقت الحالي أثناء التنقل.

بدلاً من ذلك ، يمكنك تجربة AVFormatContext->nb_index_entries أو المدة المكتشفة ، والتي يجب أن تعمل على الأقل على AVI / MOV ، أو المكتبة FFMS2 ، والتي ربما تكون بطيئة جدًا في الإزعاج من أجل شريط التقدم.


للبناء على جواب ستو. إليك طريقة العثور على معدل عرض الإطارات لمقطع فيديو من هاتفي الجوال. ركضت الأمر التالي لفترة من الوقت. اسمحوا لي أن العد إطار الحصول على ما يصل إلى حوالي 10،000 قبل حصلت على الصبر وضرب ^ C:

$ ffmpeg -i 2013-07-07\ 12.00.59.mp4 -f null /dev/null 2>&1
...
Press [q] to stop, [?] for help
[null @ 0x7fcc80836000] Encoder did not produce proper pts, making some up.
frame= 7989 fps= 92 q=0.0 Lsize=N/A time=00:04:26.30 bitrate=N/A dup=10 drop=0    
video:749kB audio:49828kB subtitle:0 global headers:0kB muxing overhead -100.000042%
Received signal 2: terminating.
$

بعد ذلك ، أمسك بمقطعتين من المعلومات من هذا الخط الذي يبدأ بـ "frame =" ، وعدد الإطارات ، 7989 ، والوقت 00: 04: 26.30. تحتاج أولاً إلى تحويل الوقت إلى ثوان ثم تقسيم عدد الإطارات بالثانية للحصول على "الإطارات في الثانية". "الإطارات في الثانية" هي معدل الإطار الخاص بك.

$ bc -l
0*60*60 + 4*60 + 26.3
266.3

7989/(4*60+26.3)
30.00000000000000000000
$

معدل الإطار الخاص بالفيديو الخاص بي هو 30 إطارًا في الثانية.


يمكنني استخدام php_ffmpeg ، ثم يمكنني الحصول على جميع الأوقات وجميع إطارات الفيلم. كما belows

$input_file='/home/strone/workspace/play/CI/abc.rmvb';
$ffmpegObj = new ffmpeg_movie($input_file);
echo $ffmpegObj->getDuration();
    echo $ffmpegObj->getFrameCount();

ثم التفاصيل على الصفحة.

http://ffmpeg-php.sourceforge.net/doc/api/ffmpeg_movie.php


لينكس

ffmpeg -i "/home/iorigins/Завантаження/123.mov" -f null /dev/null

ياقوت

result = `ffmpeg -i #{path} -f null - 2>&1`
r = result.match("frame=([0-9]+)")
p r[1]




ffmpeg