Ticket #1859 (closed enhancement: fixed)
feature request: making skip_stream work with ffprobe
| Reported by: | vineet156 | Owned by: | |
|---|---|---|---|
| Priority: | wish | Component: | FFprobe |
| Version: | git-master | Keywords: | skip_frame |
| Cc: | Blocked By: | ||
| Blocking: | Reproduced by developer: | yes | |
| Analyzed by developer: | yes |
Description
I can extract "video stream" frame information using ffprobe
% ffprobe -select_streams v -show_frames -print_format json 1280x720_Shinkarenko-Gonzalez.mp4 > allframe-info.txt
But if i further add "-skip_frame nokey" to above command
% ffprobe -skip_frame nokey -select_streams v -show_frames -print_format json 1280x720_Shinkarenko-Gonzalez.mp4 > keyframe-info.txt
It doesn't make any difference to the output. What I am trying to is extract keyframe info. I get this data from first command. But then the output file contains detail of all frames and I have to filter out text file. Moreover, I feel that using skip_frame will speed up the result I need.
Attachments
Change History
comment:1 Changed 7 months ago by cehoyos
- Keywords ffprobe, removed
- Priority changed from normal to wish
- Version set to git-master
- Status changed from new to open
- Reproduced by developer set
comment:2 follow-up: ↓ 3 Changed 7 months ago by vineet156
Thanks, but "-skip_frame nokey" does not work even with ffmpeg!
When I run following command:
ffprobe -select_streams v -show_frames -print_format json 1280x720_Shinkarenko-Gonzalez.mp4 > allframe-info.txt
ffprobe version 1.0.git Copyright (c) 2007-2012 the FFmpeg developers
built on Oct 28 2012 09:10:45 with gcc 4.4.5 (Debian 4.4.5-8)
configuration: --prefix=/usr/local --enable-libx264 --enable-libfaac --enable-gpl --enable-shared --enable-nonfree --enable-libvorbis --enable-libvpx --disable-ffserver --disable-doc --enable-bzlib --enable-zlib
libavutil 52. 0.100 / 52. 0.100
libavcodec 54. 69.100 / 54. 69.100
libavformat 54. 34.100 / 54. 34.100
libavdevice 54. 3.100 / 54. 3.100
libavfilter 3. 20.105 / 3. 20.105
libswscale 2. 1.101 / 2. 1.101
libswresample 0. 16.100 / 0. 16.100
libpostproc 52. 1.100 / 52. 1.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1280x720_Shinkarenko-Gonzalez.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
creation_time : 1970-01-01 00:00:00
encoder : Lavf52.94.0
Duration: 00:07:36.22, start: 0.000000, bitrate: 3470 kb/s
Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 3298 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc
Metadata:
creation_time : 1970-01-01 00:00:00
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, s16, 165 kb/s
Metadata:
creation_time : 1970-01-01 00:00:00
handler_name : SoundHandler
My allframe-info.txt has info has 13673 frames info in following json format:
"frames": [
{
"media_type": "video",
"key_frame": 1,
"pkt_pts": 0,
"pkt_pts_time": "0.000000",
"pkt_dts": 0,
"pkt_dts_time": "0.000000",
"pkt_duration": 1001,
"pkt_duration_time": "0.033367",
"pkt_pos": "48",
"width": 1280,
"height": 720,
"pix_fmt": "yuv420p",
"sample_aspect_ratio": "1:1",
"pict_type": "I",
"coded_picture_number": 0,
"display_picture_number": 0,
"interlaced_frame": 0,
"top_field_first": 0,
"repeat_pict": 0,
"reference": 3
},
{
"media_type": "video",
"key_frame": 0,
"pkt_pts": 1001,
"pkt_pts_time": "0.033367",
"pkt_dts": 1001,
"pkt_dts_time": "0.033367",
"pkt_duration": 1001,
"pkt_duration_time": "0.033367",
"pkt_pos": "121676",
"width": 1280,
"height": 720,
"pix_fmt": "yuv420p",
"sample_aspect_ratio": "1:1",
"pict_type": "B",
"coded_picture_number": 2,
"display_picture_number": 0,
"interlaced_frame": 0,
"top_field_first": 0,
"repeat_pict": 0,
"reference": 0
},
....
....
....
]
}
And there are 55 video frames where "key_frame": 1 in the json data file.
By this logic using "-skip_frame nokey" additional parameter to above command, I should get only those 55 keyframes' json info in my text file
so my command line becomes:
ffprobe -skip_frame nokey -select_streams v -show_frames -print_format json 1280x720_Shinkarenko-Gonzalez.mp4 > keyframe-info.txt
ffprobe version 1.0.git Copyright (c) 2007-2012 the FFmpeg developers
built on Oct 28 2012 09:10:45 with gcc 4.4.5 (Debian 4.4.5-8)
configuration: --prefix=/usr/local --enable-libx264 --enable-libfaac --enable-gpl --enable-shared --enable-nonfree --enable-libvorbis --enable-libvpx --disable-ffserver --disable-doc --enable-bzlib --enable-zlib
libavutil 52. 0.100 / 52. 0.100
libavcodec 54. 69.100 / 54. 69.100
libavformat 54. 34.100 / 54. 34.100
libavdevice 54. 3.100 / 54. 3.100
libavfilter 3. 20.105 / 3. 20.105
libswscale 2. 1.101 / 2. 1.101
libswresample 0. 16.100 / 0. 16.100
libpostproc 52. 1.100 / 52. 1.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1280x720_Shinkarenko-Gonzalez.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
creation_time : 1970-01-01 00:00:00
encoder : Lavf52.94.0
Duration: 00:07:36.22, start: 0.000000, bitrate: 3470 kb/s
Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 3298 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc
Metadata:
creation_time : 1970-01-01 00:00:00
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, s16, 165 kb/s
Metadata:
creation_time : 1970-01-01 00:00:00
handler_name : SoundHandler
But my keyframe-info.txt file again contains 13673 frames instead of 55 keyframes
So "skip_frame nokey" is not working. Is this a bug?
comment:3 in reply to: ↑ 2 Changed 7 months ago by cehoyos
Replying to vineet156:
Thanks, but "-skip_frame nokey" does not work even with ffmpeg!
It works fine here, could you elaborate?
(Please provide the ffmpeg command line you tested together with complete, uncut console output.)
comment:4 follow-up: ↓ 5 Changed 7 months ago by vineet156
This is my command line.
ffmpeg -skip_frame nokey -i 1280x720_Shinkarenko-Gonzalez.mp4 -vf showinfo='iskey' -f null -
complete uncut output is attached: output.log
each and every frame is shown via showinfo, while all nonkey frame should have been skipped from input itself. You can see that only 55 frames have "iskey:1" in output.log
comment:5 in reply to: ↑ 4 Changed 7 months ago by cehoyos
Replying to vineet156:
This is my command line.
ffmpeg -skip_frame nokey -i 1280x720_Shinkarenko-Gonzalez.mp4 -vf showinfo='iskey' -f null -
But can't you confirm that there is a tiny, tiny speed difference between the following two commands:
$ time ffmpeg -skip_frame nokey -i 1280x720_Shinkarenko-Gonzalez.mp4 -vf showinfo='iskey' -f null test1
$ time ffmpeg -i 1280x720_Shinkarenko-Gonzalez.mp4 -vf showinfo='iskey' -f null test2
indicating that -skip_frame nokey is working as expected with ffmpeg?
The way I understand your original report is that you want to see the same speed gain with ffprobe than with ffmpeg, if you just don't want to see the output, at least with ffmpeg you can use the select filter.
comment:6 Changed 7 months ago by vineet156
I sent a reply 3 days itself but I received a auto generated reply "delay in mail delivery".
Anyways, I am updating my reply from the website now. here it goes...
=======================================================================
May be there is a negligible time difference. But the reason behind using "skip_frame nokey" was to show only show "iskey:1" frames via select filter (if using ffmpeg)
similarly, with ffprobe if "skip_frame nokey" should only generate those 55 key frame's information in json
So, somewhere it's not working as per the documentation
Just to clarify, I was not looking at speed gain.
All I am trying to do is extract info about each keyframe present in a source video.
I thought using "skip_frame nokey" I'll get just the keyframe information in my output.
Additionally, if I may add, what should be best method to extract the image from each keyframe from my source video?
coz following command generate image for each video frame instead of just keyframes
ffmpeg -skip_frame nokey -i 1280x720_Shinkarenko-Gonzalez.mp4 -f image2 - images/keyframes%03d.jpg
ffmpeg version 1.0.git Copyright (c) 2000-2012 the FFmpeg developers
built on Oct 28 2012 09:10:45 with gcc 4.4.5 (Debian 4.4.5-8)
configuration: --prefix=/usr/local --enable-libx264 --enable-libfaac --enable-gpl --enable-shared --enable-nonfree --enable-libvorbis --enable-libvpx --disable-ffserver --disable-doc --enable-bzlib --enable-zlib
libavutil 52. 0.100 / 52. 0.100
libavcodec 54. 69.100 / 54. 69.100
libavformat 54. 34.100 / 54. 34.100
libavdevice 54. 3.100 / 54. 3.100
libavfilter 3. 20.105 / 3. 20.105
libswscale 2. 1.101 / 2. 1.101
libswresample 0. 16.100 / 0. 16.100
libpostproc 52. 1.100 / 52. 1.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1280x720_Shinkarenko-Gonzalez.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
creation_time : 1970-01-01 00:00:00
encoder : Lavf52.94.0
Duration: 00:07:36.22, start: 0.000000, bitrate: 3470 kb/s
Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 3298 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc
Metadata:
creation_time : 1970-01-01 00:00:00
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, s16, 165 kb/s
Metadata:
creation_time : 1970-01-01 00:00:00
handler_name : SoundHandler
Output #0, image2, to 'images/keyframes%03d.jpg':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf54.34.100
Stream #0:0(und): Video: mjpeg, yuvj420p, 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 90k tbn, 29.97 tbc
Metadata:
creation_time : 1970-01-01 00:00:00
handler_name : VideoHandler
Stream mapping:
Stream #0:0 -> #0:0 (h264 -> mjpeg)
Press [q] to stop, [?] for help
[h264 @ 0xecf420] concealing 3600 DC, 3600 AC, 3600 MV errors in P frame
[h264 @ 0xe8a5a0] concealing 3600 DC, 3600 AC, 3600 MV errors in P frame
[h264 @ 0x1005400] concealing 3600 DC, 3600 AC, 3600 MV errors in P frame
[h264 @ 0xf9de80] concealing 3600 DC, 3600 AC, 3600 MV errors in P frame
[h264 @ 0xf36900] concealing 3600 DC, 3600 AC, 3600 MV errors in P frame
[h264 @ 0xecf420] concealing 3600 DC, 3600 AC, 3600 MV errors in P frame
[h264 @ 0xe8a5a0] concealing 3600 DC, 3600 AC, 3600 MV errors in P frame
[h264 @ 0x1005400] concealing 3600 DC, 3600 AC, 3600 MV errors in P frame
[h264 @ 0xf9de80] concealing 3600 DC, 3600 AC, 3600 MV errors in P frame
.......
.......
.......
I hope you also saw the output.log attachement
comment:7 follow-up: ↓ 8 Changed 7 months ago by vineet156
Hi,
sorry I am being little impatient, but did you receive my reply. My earlier reply via email bounced back after few days with failed mail delivery.
Is the above issue a bug or am I missing something?
Thanks a lot
comment:8 in reply to: ↑ 7 Changed 2 months ago by saste
- Analyzed by developer set
- Status changed from open to closed
- Resolution set to fixed
Replying to vineet156:
Hi,
sorry I am being little impatient, but did you receive my reply. My earlier reply via email bounced back after few days with failed mail delivery.
Is the above issue a bug or am I missing something?
No it was a missing (important) feature.
Should be fixed in:
commit 1019cef329b508f0a9033b355cc18bf8026caf31
Author: Stefano Sabatini <stefasab@gmail.com>
Date: Thu Mar 7 00:47:59 2013 +0100
ffprobe: support codec options
Make ffprobe honour codec options, and support stream specifiers like it
is done in ffplay.
In particular, address Trac ticket #1859.




For future tickets: Please always provide the command line together with complete, uncut console output.
I can confirm that the following command line does not execute faster than without -skip_frame nokey and takes nearly as long as ffmpeg -i Vertical400kbit.sorenson3.mov -f null - (while ffmpeg -skip_frame nokey is significantly faster).
$ ffprobe -skip_frame nokey -select_streams v -show_frames fate-suite/svq3/Vertical400kbit.sorenson3.mov >test ffprobe version N-46093-g14f69a0 Copyright (c) 2007-2012 the FFmpeg developers built on Oct 28 2012 13:17:25 with gcc 4.7 (SUSE Linux) configuration: --enable-gpl --disable-indev=jack libavutil 52. 1.100 / 52. 1.100 libavcodec 54. 69.100 / 54. 69.100 libavformat 54. 35.100 / 54. 35.100 libavdevice 54. 3.100 / 54. 3.100 libavfilter 3. 20.106 / 3. 20.106 libswscale 2. 1.101 / 2. 1.101 libswresample 0. 16.100 / 0. 16.100 libpostproc 52. 1.100 / 52. 1.100 [mov,mp4,m4a,3gp,3g2,mj2 @ 0x1baddc0] max_analyze_duration 5000000 reached at 5000998 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'fate-suite/svq3/Vertical400kbit.sorenson3.mov': Metadata: creation_time : 2001-03-20 16:17:18 title : Vertical Online SV3 Demo title-eng : Vertical Online SV3 Demo artist : Logan Kelsey artist-eng : Logan Kelsey copyright : © Vertical Online 2001 copyright-eng : © Vertical Online 2001 encoder : Sorenson Video 3 encoder-eng : Sorenson Video 3 Duration: 00:00:43.57, start: 0.000000, bitrate: 580 kb/s Stream #0:0(eng): Video: svq3 (SVQ3 / 0x33515653), yuvj420p, 320x240, 391 kb/s, 30.02 fps, 30 tbr, 600 tbn, 600 tbc Metadata: creation_time : 2001-03-20 16:17:18 handler_name : Apple Alias Data Handler Stream #0:1(eng): Audio: adpcm_ima_qt (ima4 / 0x34616D69), 44100 Hz, 1 channels, s16p, 176 kb/s Metadata: creation_time : 2001-03-20 16:17:18 handler_name : Apple Alias Data Handler