2

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
spinkus
  • 7,694
  • 4
  • 38
  • 62

1 Answers1

4

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.

szatmary
  • 29,969
  • 8
  • 44
  • 57
  • 1
    Awesome thanks. For others with the same problem this is ffmpeg command to move the moov: `ffmpeg -i camera-test.mp4 -movflags faststart out.mp4`. The following also worked for me and wass much faster: `qt-faststart in.mp4 out.mp4`. – spinkus Jul 18 '20 at 00:14
  • 1
    @spinkus thanks so much for this comment, I was struggling for many hours on this issue. – Jim Blackler May 21 '22 at 08:00