23

When i run this command i get an error. If i run without the pipe, it works.

With Pipe

cat mymovie.m4v | ffmpeg -i pipe:0 -an -analyzeduration 1000000 -f image2 -vf 
"select='eq(pict_type,PICT_TYPE_I)'" -vsync vfr 'public/files/thumb%04d.png'

Without Pipe (Works)

ffmpeg -i mymovie.m4v -an -analyzeduration 2147483647 -probesize 2147483647 -f image2 -vf 
"select='eq(pict_type,PICT_TYPE_I)'" -vsync vfr 'public/files/thumb%04d.png'

Output

ffmpeg version 2.2 Copyright (c) 2000-2014 the FFmpeg developers
built on Apr 10 2014 17:50:46 with Apple LLVM version 5.1 (clang-503.0.38) 
(based on LLVM 3.4svn)
configuration: --prefix=/usr/local/Cellar/ffmpeg/2.2 
--enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree 
--enable-hardcoded-tables --enable-avresample --enable-vda --cc=clang 
--host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame 
--enable-libxvid --enable-libfreetype --enable-libtheora --enable-libvorbis 
--enable-libvpx --enable-librtmp --enable-libopencore-amrnb --enable-libopencore-amrwb
--enable-libvo-aacenc --enable-libass --enable-ffplay --enable-libspeex 
--enable-libschroedinger --enable-libfdk-aac --enable-libopus --enable-frei0r 
--enable-libopenjpeg --extra-cflags='-

I/usr/local/Cellar/openjpeg/1.5.1_1/include/openjpeg-1.5 '
  libavutil      52. 66.100 / 52. 66.100
  libavcodec     55. 52.102 / 55. 52.102
  libavformat    55. 33.100 / 55. 33.100
  libavdevice    55. 10.100 / 55. 10.100
  libavfilter     4.  2.100 /  4.  2.100
  libavresample   1.  2.  0 /  1.  2.  0
  libswscale      2.  5.102 /  2.  5.102
  libswresample   0. 18.100 /  0. 18.100
  libpostproc    52.  3.100 / 52.  3.100

[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fd87b80f000] stream 0, offset 0x2c: partial file
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fd87b80f000] Could not find codec parameters for stream 0
(Video: h264 (avc1 / 0x31637661), 1280x720, 3310 kb/s): unspecified pixel format

Consider increasing the value for the 'analyzeduration' and 'probesize' options pipe:0: could not find codec parameters

I have tried setting (link)

-analyzeduration100 -probesize 10000000 
-analyzeduration 2147483647 -probesize 2147483647

Still didn't work.

Community
  • 1
  • 1
dre
  • 1,422
  • 3
  • 21
  • 31
  • In my case `-analyzeduration 2147483647 -probesize 2147483647` _did_ work, but you have to place these options before specifying the input file with `-i mymovie.m4v`. – robert May 07 '23 at 14:27

1 Answers1

17

MP4 container is not the best choice for piping. The muxer that made the MP4 file may place certain info at the end of the file. This info is required for proper demuxing, but is not immediately available if using a pipe. However, you have a few options:

Don't use a pipe

I don't know why you need to use a pipe in the first place. Just use the file as a normal input:

ffmpeg -i input.mp4 ...

Don't use MP4

If you must use a pipe then consider using some other container such as .mkv or .ts for your input.

Re-mux your MP4 then pipe

If you must use MP4 then one method is to re-arrange the moov atom so it is at the beginning of the file:

ffmpeg -i input.mp4 -c copy -movflags +faststart output.mp4
llogan
  • 121,796
  • 28
  • 232
  • 243
  • 1
    Another option is to set `-frag_size 1048576`. – Martin Ždila Oct 25 '16 at 14:55
  • Indeed, using WEBM containers instead MP4 fixed the issue in my project. Looks like this is simply because there is some information written at the end of MP4, and ffmpeg needs to read the input till the end to be able to start producing the output. This is why tweaking different options related to buffers sizes will not help once you get an MP4 big enough. – lnstadrum Jan 15 '22 at 10:45
  • I am facing this same problem. I don't have the option to use a file as I want to create a thumbnail from a raw_data (in memory). Any other options? – Sarang Jan 13 '23 at 12:51