[FFmpeg-user] Understanding two pass encoding

Robin Lery robinlery at gmail.com
Sat Aug 8 14:46:13 CEST 2015


Yes, thank you. I understand now. However I tried doing two pass multiple
output with one input like this:

ffmpeg -i mi6.mp4 \
    -codec:v libx264 -tune zerolatency -profile:v main -preset medium -b:v
1000k -maxrate 1000k -bufsize 10000k -s hd720 -threads 0 -pix_fmt yuv420p
-pass 1 -passlogfile unique_id-hd720 -an -f mp4 /dev/null \
    -codec:v libx264 -tune zerolatency -profile:v baseline -level 3.0
-preset medium -b:v 250k -maxrate 250k -bufsize 2500k -vf
scale="trunc(oh*a/2)*2:360" -threads 0 -pix_fmt yuv420p -movflags
+faststart -pass 1 -passlogfile unique_id-360 -an -f mp4 /dev/null && \
    -codec:v libx264 -tune zerolatency -profile:v main -preset medium -b:v
1000k -maxrate 1000k -bufsize 10000k -s hd720 -threads 0 -pix_fmt yuv420p
-pass 2 -passlogfile unique_id-hd720 -codec:a libfdk_aac -movflags
+faststart output/mi6-poty-720.mp4 \
    -codec:v libx264 -tune zerolatency -profile:v baseline -level 3.0
-preset medium -b:v 250k -maxrate 250k -bufsize 2500k -vf
scale="trunc(oh*a/2)*2:360" -threads 0 -pass 2 -passlogfile unique_id-360
-codec:a libfdk_aac -pix_fmt yuv420p -movflags +faststart
output/mi6-poty-360.mp4


When I run this command first I get this:

File '/dev/null' already exists. Overwrite ? [y/N] y

File '/dev/null' already exists. Overwrite ? [y/N] y


Afterward there's two file with the specified name, but the file size is 0.
What's going on?



On Thu, Aug 6, 2015 at 7:56 PM, Moritz Barsnick <barsnick at gmx.net> wrote:

> Hi Robin,
>
> On Thu, Aug 06, 2015 at 19:42:39 +0530, Robin Lery wrote:
> > 2nd pass has more frames than 1st pass
>
> Because you didn't do a first pass. ;-)
>
> > So, my concern is how will ffmpeg know which one is the first pass so
> that
> > it can do its pass 2 encoding?
>
> ffmpeg stores its findings from the first pass in a log file, and
> reuses that during its second pass.
>
> > And since many videos will be uploaded simultaneously I can't keep
> > them all at the /dev/null as it will replace one with another. So how
> > can I manage it?
>
> If your Unix system is set up correctly, /dev/null has plenty of space
> for holding _all_ the first pass videos. ;-) (If you don't get the
> joke: Read up on /dev/null.)
>
> The problem will be that the log files will interfere with each other.
> Please do read ffmpeg's fine documentation on 2-pass encoding:
>
> ‘-pass[:stream_specifier] n (output,per-stream)’
>
>     Select the pass number (1 or 2). It is used to do two-pass video
>     encoding. The statistics of the video are recorded in the first
>     pass into a log file (see also the option -passlogfile), and in the
>     second pass that log file is used to generate the video at the
>     exact requested bitrate. On pass 1, you may just deactivate audio
>     and set output to null, examples for Windows and Unix:
>
>       ffmpeg -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y NUL
>       ffmpeg -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y /dev/null
>
> ‘-passlogfile[:stream_specifier] prefix (output,per-stream)’
>
>     Set two-pass log file name prefix to prefix, the default file name
>     prefix is “ffmpeg2pass”. The complete file name will be
>     ‘PREFIX-N.log’, where N is a number specific to the output stream
>
> This means if you do parallel encoding, you need to give each encode a
> unique file name prefix with "-passlogfile". You can generate unique
> file names (or prefixes) using "mktemp". For a web app like yours, I
> would alternatively probably generate unique temporary directories, and
> operate within them.
>
> HTH,
> Moritz
> _______________________________________________
> ffmpeg-user mailing list
> ffmpeg-user at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-user
>


More information about the ffmpeg-user mailing list