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 \ video-2000k-f.mp4 mp4fragment --fragment-duration 4000 video-1500k.mp4 \ video-1500k-f.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?