ffmpeg to generate dash and HLS - best practiseAsk Question


Looking for the correct way to encode a given input video in multiple bitrates and then package it for dash and HLS. I thought this is a basic task, but for me it was quite a challenge. So the way I do it is as follows:

First I split my video (mp4) into video and audio (I encode the audio, because I need to make sure that the output codec is aac, which is a requirement for web I think).

ffmpeg -c:v copy -an video_na.mp4 -i source_input.mp4
ffmpeg -c:a aac -ac 2 -async 1 -vn audio.mp4 -i source_input.mp4

Then I encode the video with the following commands:

    ffmpeg.exe -i video_na.mp4 -an -c:v libx264 -crf 18 \
-preset fast -profile:v high -level 4.2 -b:v 2000k -minrate 2000k \
-maxrate 2000k -bufsize 4000k -g 96 -keyint_min 96 -sc_threshold 0 \
-filter:v "scale='trunc(oh*a/2)*2:576'" -movflags +faststart \
-pix_fmt yuv420p -threads 4 -f mp4 video-2000k.mp4

    ffmpeg.exe -i video_na.mp4 -an -c:v libx264 -crf 18 \
-preset fast -profile:v high -level 4.2 -b:v 1500k -minrate 1500k \
-maxrate 1500k -bufsize 3000k -g 96 -keyint_min 96 -sc_threshold 0 \
-filter:v "scale='trunc(oh*a/2)*2:480'" -movflags +faststart \
-pix_fmt yuv420p -threads 4 -f mp4 video-1500k.mp4

After that I fragment the videos (I used the parameter --timescale 10000 but then the result was out of sync). Sidenote: the -g parameter is 4 times 24 (frames). this is important because the fragmentation is 4000 (4 seconds)

mp4fragment --fragment-duration 4000 video-2000k.mp4 \

mp4fragment --fragment-duration 4000 video-1500k.mp4 \

And finally package everything together again for dash (I used to use --use-segment-timeline but then again the result was out-of-sync). I use mp4dash and not mp4box because I want to be able to encrypt everything later on for DRM.

mp4dash --media-prefix=out  \
      video-2000k-f.mp4  \
      video-1500k-f.mp4  \
     --out dash

The result works in Firefox, Chrome, IE Edge via a webserver and via Cloudfront AWS Streaming also on older browsers.

So for me there are still 2 tasks to accomplish. First I need to generate a HLS package for Apple Phone, IPad Users. And second: I need to encrypt everything.

So far my HLS command is:

ffmpeg -y -loglevel info ^
        -i video-2000k.mp4 \
        -i video-1500k.mp4 \
        -i audio.mp4 \
        -profile:v baseline -start_number 0 -hls_time 10 \
        -flags -global_header -hls_list_size 0 -f hls hls/master.m3u8

This basically works, but generates only 1 bandwith without the posibility of multi-streams. I am not certain about that statement, but it looks that way. Has anyone an idea on what I am doing wrong?

标签: ffmpeg hls
© 2014 TuiCode, Inc.