Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ffprobe reports some wrong meta data but only when input is piped in

I have a video file and I'm using ffprobe to extract meta data from it. If I save the file to disk and runffprobe everything works fine. However, if I pipe the input into ffprobe most meta data is correct, but some fields, such as width, height, display_aspect_ratio are not correct. ffprobe reports these errors when input is a stream (see full outputs below):

[mov,mp4,m4a,3gp,3g2,mj2 @ 0x563c3de3c000] stream 1, offset 0x2c: partial file [mov,mp4,m4a,3gp,3g2,mj2 @ 0x563c3de3c000] Could not find codec parameters for stream 0 (Video: mpeg4 (mp4v / 0x7634706D), none, 1567 kb/s): unspecified size Consider increasing the value for the 'analyzeduration' and 'probesize' options

I tried various settings for analyzeduration and probesize with no change in outcome. I tried piping other even larger MP4 files into ffprobe and the height and width is reported correctly, and I don't get "stream 1, offset 0x2c: partial file" output warning. I think there is may be some issue with this particular file, but if that's the case why does it only cause issues when the file is streamed in?

Any ideas what the issue is and how to get ffprobe to work same with a pipe as for a file input?

With file:

> ffprobe -show_streams camera-test.mp4 
ffprobe version 4.1.6-1~deb10u1 Copyright (c) 2007-2020 the FFmpeg developers
  built with gcc 8 (Debian 8.3.0-6)
  configuration: --prefix=/usr --extra-version='1~deb10u1' --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
  libavutil      56. 22.100 / 56. 22.100
  libavcodec     58. 35.100 / 58. 35.100
  libavformat    58. 20.100 / 58. 20.100
  libavdevice    58.  5.100 / 58.  5.100
  libavfilter     7. 40.101 /  7. 40.101
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  3.100 /  5.  3.100
  libswresample   3.  3.100 /  3.  3.100
  libpostproc    55.  3.100 / 55.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'camera-test.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2mp41
    encoder         : Lavf58.35.101
  Duration: 00:00:05.74, start: 0.000000, bitrate: 1650 kb/s
    Stream #0:0(eng): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 720x1280 [SAR 1:1 DAR 9:16], 1567 kb/s, 30 fps, 30 tbr, 15360 tbn, 30 tbc (default)
    Metadata:
      handler_name    : VideoHandle
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 121 kb/s (default)
    Metadata:
      handler_name    : SoundHandle
[STREAM]
index=0
codec_name=mpeg4
codec_long_name=MPEG-4 part 2
profile=Simple Profile
codec_type=video
codec_time_base=1/30
codec_tag_string=mp4v
codec_tag=0x7634706d
width=720
height=1280
coded_width=720
coded_height=1280
has_b_frames=0
sample_aspect_ratio=1:1
display_aspect_ratio=9:16
pix_fmt=yuv420p
level=1
...

With a pipe:

> ffprobe -show_streams "pipe:0"  <camera-test.mp4 
ffprobe version 4.1.6-1~deb10u1 Copyright (c) 2007-2020 the FFmpeg developers
  built with gcc 8 (Debian 8.3.0-6)
  configuration: --prefix=/usr --extra-version='1~deb10u1' --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
  libavutil      56. 22.100 / 56. 22.100
  libavcodec     58. 35.100 / 58. 35.100
  libavformat    58. 20.100 / 58. 20.100
  libavdevice    58.  5.100 / 58.  5.100
  libavfilter     7. 40.101 /  7. 40.101
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  3.100 /  5.  3.100
  libswresample   3.  3.100 /  3.  3.100
  libpostproc    55.  3.100 / 55.  3.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x563c3de3c000] stream 1, offset 0x2c: partial file
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x563c3de3c000] Could not find codec parameters for stream 0 (Video: mpeg4 (mp4v / 0x7634706D), none, 1567 kb/s): unspecified size
Consider increasing the value for the 'analyzeduration' and 'probesize' options
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'pipe:0':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2mp41
    encoder         : Lavf58.35.101
  Duration: 00:00:05.74, start: 0.000000, bitrate: N/A
    Stream #0:0(eng): Video: mpeg4 (mp4v / 0x7634706D), none, 1567 kb/s, SAR 1:1 DAR 0:0, 30 fps, 30 tbr, 15360 tbn, 15360 tbc (default)
    Metadata:
      handler_name    : VideoHandle
    Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 121 kb/s (default)
    Metadata:
      handler_name    : SoundHandle
[STREAM]
index=0
codec_name=mpeg4
codec_long_name=MPEG-4 part 2
profile=unknown
codec_type=video
codec_time_base=1/30
codec_tag_string=mp4v
codec_tag=0x7634706d
width=0
height=0
coded_width=0
coded_height=0
has_b_frames=0
sample_aspect_ratio=1:1
display_aspect_ratio=0:0
pix_fmt=unknown
level=-99
...

Full diff between the two outputs:

< profile=unknown
---
> profile=Simple Profile
10,13c10,13
< width=0
< height=0
< coded_width=0
< coded_height=0
---
> width=720
> height=1280
> coded_width=720
> coded_height=1280
16,18c16,18
< display_aspect_ratio=0:0
< pix_fmt=unknown
< level=-99
---
> display_aspect_ratio=9:16
> pix_fmt=yuv420p
> level=1
62c62
< profile=unknown
---
> profile=LC
like image 930
spinkus Avatar asked Sep 17 '25 14:09

spinkus


1 Answers

Mp4 encodes this information in the moov box. The moov box can be at the beginning, or the end of the file. For files where the moov is at the beginning, piping will work. For files where it is at the end you will need to probe every byte of the file.

Or you can repackage the file with faststart to force the moov to the front.

like image 178
szatmary Avatar answered Sep 19 '25 04:09

szatmary