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




codec android (11)

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

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

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

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


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

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

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


يمكنك استخدام ffprobe للحصول على رقم الإطار باستخدام الأوامر التالية

  1. الطريقة الأولى

ffprobe.exe -i video_name -print_format json -loglevel fatal -show_streams -count_frames -select_streams v

التي تقول لطباعة البيانات بتنسيق json

سيخبر select_streams v ffprobe بأن ffprobe فقط بيانات دفق video وإذا قمت بإزالته ، فإنه سيعطيك معلومات audio

وسوف يكون مثل الانتاج

{
    "streams": [
        {
            "index": 0,
            "codec_name": "mpeg4",
            "codec_long_name": "MPEG-4 part 2",
            "profile": "Simple Profile",
            "codec_type": "video",
            "codec_time_base": "1/25",
            "codec_tag_string": "mp4v",
            "codec_tag": "0x7634706d",
            "width": 640,
            "height": 480,
            "coded_width": 640,
            "coded_height": 480,
            "has_b_frames": 1,
            "sample_aspect_ratio": "1:1",
            "display_aspect_ratio": "4:3",
            "pix_fmt": "yuv420p",
            "level": 1,
            "chroma_location": "left",
            "refs": 1,
            "quarter_sample": "0",
            "divx_packed": "0",
            "r_frame_rate": "10/1",
            "avg_frame_rate": "10/1",
            "time_base": "1/3000",
            "start_pts": 0,
            "start_time": "0:00:00.000000",
            "duration_ts": 256500,
            "duration": "0:01:25.500000",
            "bit_rate": "261.816000 Kbit/s",
            "nb_frames": "855",
            "nb_read_frames": "855",
            "disposition": {
                "default": 1,
                "dub": 0,
                "original": 0,
                "comment": 0,
                "lyrics": 0,
                "karaoke": 0,
                "forced": 0,
                "hearing_impaired": 0,
                "visual_impaired": 0,
                "clean_effects": 0,
                "attached_pic": 0
            },
            "tags": {
                "creation_time": "2005-10-17 22:54:33",
                "language": "eng",
                "handler_name": "Apple Video Media Handler",
                "encoder": "3ivx D4 4.5.1"
            }
        }
    ]
}

2. يمكنك استخدامها

ffprobe -v error -show_format -show_streams video_name

والتي ستمنحك بيانات دفق ، إذا كنت تريد معلومات محددة مثل معدل الإطارات ، استخدم الأمر التالي

ffprobe -v error -select_streams v:0 -show_entries stream=avg_frame_rate -of default=noprint_wrappers=1:nokey=1 video_name

التي تعطي رقمًا أساسيًا لمعلومات الفيديو الخاصة بك ، تكون المشكلة عند استخدام هذه الطريقة ، فمن الممكن أن تحصل على N/A كمخرج.

لمزيد من المعلومات ، راجع هذه الصفحة نصائح FFProbe


لينكس

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]

للبناء على جواب ستو. إليك طريقة العثور على معدل عرض الإطارات لمقطع فيديو من هاتفي الجوال. ركضت الأمر التالي لفترة من الوقت. اسمحوا لي أن العد إطار الحصول على ما يصل إلى حوالي 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 إطارًا في الثانية.


الدقة الوحيدة التي تمكنت من القيام بذلك هي ما يلي:

ffprobe -i my_video.mp4 -show_frames 2>&1|grep -c '^\[FRAME'

للتأكد من أن هذا يعمل مع الفيديو:

ffprobe -i my_video.mp4 -show_frames 2>&1 | grep -c media_type=video

جرب هذا:

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

في Unix ، يعمل هذا مثل السحر:

ffmpeg -i 00000.avi -vcodec copy -acodec copy -f null /dev/null 2>&1 | grep 'frame=' | cut -f 2 -d ' '

ملاحظة: يمكن أن يؤثر وجود قائمة تعديل في MP4 / M4V / M4A / MOV على رقم الإطار الخاص بك. انظر تحرير القوائم أدناه.

ffprobe & ffmpeg

ffprobe : الاستعلام عن الحاوية

ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 input.mp4
  • هذه طريقة سريعة.
  • لن تقوم جميع التنسيقات بالإبلاغ عن عدد الإطارات ، مما يؤدي إلى إخراج N/A انظر الطرق الأخرى المذكورة أدناه.

ffprobe : فك شفرة وعد عدد الإطارات

ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 input.mkv
  • هذه طريقة بطيئة. نظرًا لأنه يجب فك تشفير الملف بأكمله ، قد يستغرق اكتماله بعض الوقت بناءً على مدة وتعقيد الإدخال.

ffmpeg : فك شفرة العد وعدد الأرتال

إذا لم يكن لديك ffprobe يمكنك استخدام ffmpeg و awk بدلاً من ذلك:

ffmpeg -i input.mkv -map 0:v:0 -c copy -f null - 2>&1 | awk '/frame=/ {print $2}'
  • هذه طريقة بطيئة. نظرًا لأنه يجب فك تشفير الملف بأكمله ، قد يستغرق اكتماله بعض الوقت بناءً على مدة وتعقيد الإدخال.
  • يمكنك حذف 2>&1 | awk '/frame=/{print $2}' 2>&1 | awk '/frame=/{print $2}' إذا لم يكن لديك awk ، مثل Windows ، والإشارة إلى frame= بالقرب من نهاية إخراج وحدة التحكم.

عد الإطارات الرئيسية فقط

إضافة -skip_frame nokey .

  • يعمل لكل من ffprobe و ffmpeg .

تحرير القوائم

تجاهل قائمة تحرير MP4 / M4V / M4A / MOV مع خيار الإدخال -ignore_editlist 1 . الافتراضي هو عدم تجاهل قائمة التعديل.

ماذا تعني خيارات ffprobe

  • -v error هذا يخفي "معلومات" الإخراج (معلومات الإصدار ، إلخ) مما يجعل التحليل أسهل.

  • -count_frames حساب عدد الإطارات لكل بث وإعداد تقرير عنه في قسم البث المقابل.

  • -select_streams v:0 حدد دفق الفيديو فقط.

  • -show_entries stream=nb_frames or -show_entries stream=nb_read_frames إظهار إدخال nb_frames أو nb_read_frames .

  • -of default=nokey=1:noprint_wrappers=1 تعيين تنسيق الإخراج (ويعرف أيضًا باسم "الكاتب") إلى الوضع default ، لا تقم بطباعة مفتاح كل حقل ( nokey=1 ) ، ولا تقم بطباعة رأس الصفحة noprint_wrappers=1 ( noprint_wrappers=1 ). هناك بدائل أقصر مثل -of csv=p=0 .

انظر أيضا

mediainfo

يمكن لأداة mediainfo المعروفة إخراج عدد الإطارات:

mediainfo --Output="Video;%FrameCount%" input.avi

MP4Box

لملفات MP4 / M4V / M4A.

يمكن أن يعرض MP4Box من gpac عدد الإطارات:

MP4Box -info input.mp4

الرجوع إلى سطر " Media Info في إخراج دفق الفيديو المطلوب:

Media Info: Language "Undetermined (und)" - Type "vide:avc1" - 2525 samples

في هذا المثال ، يحتوي دفق الفيديو على 2525 إطارًا.

boxdumper

لملفات MP4 / M4V / M4A / MOV.

boxdumper هي أداة بسيطة من L-smash. سوف يخرج كمية كبيرة من المعلومات. تحت قسم مربع حجم عينة stsz راجع sample_count لمعرفة عدد الإطارات. في هذا المثال ، يشتمل الإدخال على 1900 إطار فيديو:

boxdumper input.mp4
  ...
  [stsz: Sample Size Box]
    position = 342641
    size = 7620
    version = 0
    flags = 0x000000
    sample_size = 0 (variable)
    sample_count = 1900
  • يجب أن تدرك أن الملف قد يحتوي على أكثر من stsz ذرة واحدة.

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

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

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 .


$("video").prop('muted', true); //mute

و

$("video").prop('muted', false); //unmute

شاهد كل الأحداث here

(ملاحظة جانبية: استخدم attr إذا كان في jQuery <1.6)







video ffmpeg