[FFmpeg-user] using ffprobe to output input stream data and libavfilter data
Dave Rice
dave at dericed.com
Wed Feb 3 06:46:14 CET 2016
Hi all,
I’d like to use ffprobe to output information about the streams of a source file and libavfilter metadata at the same time. Is this possible?
If I use a filterchain as the input I can get frame metadata from libavfilter such as:
ffprobe -f lavfi -i "movie=example.mkv,signalstats" -show_frames -show_streams -of xml
ffprobe version N-42845-g7ab37ca Copyright (c) 2007-2016 the FFmpeg developers
built with Apple LLVM version 7.0.2 (clang-700.1.81)
configuration: --prefix=/usr/local/Cellar/ffmpeg/HEAD --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-opencl --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-libfreetype --enable-libfaac --enable-libass --enable-ffplay --enable-libopenjpeg --disable-decoder=jpeg2000 --extra-cflags=-I/usr/local/Cellar/openjpeg/1.5.2_1/include/openjpeg-1.5 --enable-nonfree --enable-vda
libavutil 55. 13.100 / 55. 13.100
libavcodec 57. 22.100 / 57. 22.100
libavformat 57. 21.101 / 57. 21.101
libavdevice 57. 0.100 / 57. 0.100
libavfilter 6. 23.100 / 6. 23.100
libavresample 3. 0. 0 / 3. 0. 0
libswscale 4. 0.100 / 4. 0.100
libswresample 2. 0.101 / 2. 0.101
libpostproc 54. 0.100 / 54. 0.100
<?xml version="1.0" encoding="UTF-8"?>
<ffprobe>
Input #0, lavfi, from 'movie=example.mkv,signalstats':
Duration: N/A, start: 0.000000, bitrate: N/A
Stream #0:0: Video: rawvideo (444P / 0x50343434), yuv444p, 720x480 [SAR 1:1 DAR 3:2], 1k tbr, 1k tbn, 1k tbc
<frames>
<frame media_type="video" stream_index="0" key_frame="1" pkt_pts="0" pkt_pts_time="0.000000" pkt_dts="0" pkt_dts_time="0.000000" best_effort_timestamp="0" best_effort_timestamp_time="0.000000" pkt_pos="761" pkt_size="1036800" width="720" height="480" pix_fmt="yuv444p" 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">
<tag key="lavfi.signalstats.YMIN" value="18"/>
<tag key="lavfi.signalstats.YLOW" value="97"/>
<tag key="lavfi.signalstats.YAVG" value="145.97"/>
<tag key="lavfi.signalstats.YHIGH" value="170"/>
<tag key="lavfi.signalstats.YMAX" value="234"/>
<tag key="lavfi.signalstats.UMIN" value="19"/>
<tag key="lavfi.signalstats.ULOW" value="90"/>
<tag key="lavfi.signalstats.UAVG" value="140.07"/>
<tag key="lavfi.signalstats.UHIGH" value="166"/>
<tag key="lavfi.signalstats.UMAX" value="233"/>
<tag key="lavfi.signalstats.VMIN" value="16"/>
<tag key="lavfi.signalstats.VLOW" value="87"/>
<tag key="lavfi.signalstats.VAVG" value="148.122"/>
<tag key="lavfi.signalstats.VHIGH" value="174"/>
<tag key="lavfi.signalstats.VMAX" value="239"/>
<tag key="lavfi.signalstats.SATMIN" value="1"/>
<tag key="lavfi.signalstats.SATLOW" value="25"/>
<tag key="lavfi.signalstats.SATAVG" value="46.8093"/>
<tag key="lavfi.signalstats.SATHIGH" value="60"/>
<tag key="lavfi.signalstats.SATMAX" value="118"/>
<tag key="lavfi.signalstats.HUEMED" value="210"/>
<tag key="lavfi.signalstats.HUEAVG" value="197.44"/>
<tag key="lavfi.signalstats.YDIF" value="0"/>
<tag key="lavfi.signalstats.UDIF" value="0"/>
<tag key="lavfi.signalstats.VDIF" value="0"/>
</frame>
</frames>
<streams>
<stream index="0" codec_name="rawvideo" codec_long_name="raw video" codec_type="video" codec_time_base="1/1000" codec_tag_string="444P" codec_tag="0x50343434" width="720" height="480" coded_width="720" coded_height="480" has_b_frames="0" sample_aspect_ratio="1:1" display_aspect_ratio="3:2" pix_fmt="yuv444p" level="-99" refs="1" r_frame_rate="1000/1" avg_frame_rate="0/0" time_base="1/1000" start_pts="0" start_time="0.000000" nb_read_frames="1">
<disposition default="0" dub="0" original="0" comment="0" lyrics="0" karaoke="0" forced="0" hearing_impaired="0" visual_impaired="0" clean_effects="0" attached_pic="0"/>
</stream>
</streams>
</ffprobe>
Here I get the frame metadata output but the stream metadata reflects the output of the movie filter (rawvideo) rather than information about the streams of the source file.
If I use the source file directly as an input, then I can not apply a filter as ffprobe doesn’t support -vf or -filter_complex.
ffprobe -i movie=example.mkv -vf signalstats -show_frames -show_streams -of xml
ffprobe version N-42845-g7ab37ca Copyright (c) 2007-2016 the FFmpeg developers
built with Apple LLVM version 7.0.2 (clang-700.1.81)
configuration: --prefix=/usr/local/Cellar/ffmpeg/HEAD --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-opencl --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-libfreetype --enable-libfaac --enable-libass --enable-ffplay --enable-libopenjpeg --disable-decoder=jpeg2000 --extra-cflags=-I/usr/local/Cellar/openjpeg/1.5.2_1/include/openjpeg-1.5 --enable-nonfree --enable-vda
libavutil 55. 13.100 / 55. 13.100
libavcodec 57. 22.100 / 57. 22.100
libavformat 57. 21.101 / 57. 21.101
libavdevice 57. 0.100 / 57. 0.100
libavfilter 6. 23.100 / 6. 23.100
libavresample 3. 0. 0 / 3. 0. 0
libswscale 4. 0.100 / 4. 0.100
libswresample 2. 0.101 / 2. 0.101
libpostproc 54. 0.100 / 54. 0.100
Failed to set value 'signalstats' for option 'vf': Option not found
If I try to use both a filterchain as an input and the source file as another input, I have an error as only one input is supported in ffprobe.
ffprobe -i movie=example.mkv -f lavfi movie=example.mkv,signalstats -show_frames -show_streams -of xml
ffprobe version N-42845-g7ab37ca Copyright (c) 2007-2016 the FFmpeg developers
built with Apple LLVM version 7.0.2 (clang-700.1.81)
configuration: --prefix=/usr/local/Cellar/ffmpeg/HEAD --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-opencl --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-libfreetype --enable-libfaac --enable-libass --enable-ffplay --enable-libopenjpeg --disable-decoder=jpeg2000 --extra-cflags=-I/usr/local/Cellar/openjpeg/1.5.2_1/include/openjpeg-1.5 --enable-nonfree --enable-vda
libavutil 55. 13.100 / 55. 13.100
libavcodec 57. 22.100 / 57. 22.100
libavformat 57. 21.101 / 57. 21.101
libavdevice 57. 0.100 / 57. 0.100
libavfilter 6. 23.100 / 6. 23.100
libavresample 3. 0. 0 / 3. 0. 0
libswscale 4. 0.100 / 4. 0.100
libswresample 2. 0.101 / 2. 0.101
libpostproc 54. 0.100 / 54. 0.100
Argument 'movie=example.mkv,signalstats' provided as input filename, but 'movie=example.mkv' was already specified.
Is it feasible (now or with sponsorship) to have a single ffprobe output that contains metadata about both the source file’s streams and the metadata output of filters (such as signalstats, cropdetect) applied to the frames?
Best Regards,
Dave Rice
More information about the ffmpeg-user
mailing list