寻找以多个比特率对给定输入视频进行编码的正确方法,然后将其打包为破折号和HLS。我认为这是一项基本任务,但对我来说这是一项相当大的挑战。所以我这样做的方式如下:
首先,我将视频(mp4)分割为视频和音频(我对音频进行编码,因为我需要确保输出编解码器是aac,这是我认为的Web要求)。
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
然后我使用以下命令对视频进行编码:
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
之后我将视频分段(我使用了参数--timescale 10000但结果却不同步)。 旁注:-g参数是24(帧)的4倍。这很重要,因为碎片是4000(4秒)
mp4fragment --fragment-duration 4000 video-2000k.mp4 \
video-2000k-f.mp4
mp4fragment --fragment-duration 4000 video-1500k.mp4 \
video-1500k-f.mp4
最后再将所有内容打包在一起用于破折号(我曾经使用过--use-segment-timeline但是结果再次结果是不同步的)。 我使用mp4dash而不是mp4box,因为我希望以后可以为DRM加密所有内容。
mp4dash --media-prefix=out \
video-2000k-f.mp4 \
video-1500k-f.mp4 \
--out dash
结果可通过网络服务器在Firefox,Chrome,IE Edge中使用,也可在旧版浏览器上通过Cloudfront AWS Streaming使用。
所以对我来说还有两个任务需要完成。 首先,我需要为Apple Phone,IPad用户生成一个HLS包。 第二:我需要加密一切。
到目前为止,我的HLS命令是:
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
这基本上有效,但只产生1个带宽而没有多流的可能性。 我不确定这个陈述,但看起来就是这样。 有谁知道我做错了什么?