您可以使用 ffmpeg 将视频转换为 HLS 版本,根据 RFC 8216 手动制作 HLS 播放列表(.m3u8)。ffmpeg 不会为您创建主播放列表。HLS 有助于使分辨率适应互联网速度。如果您将它与免费的hls.js javascript媒体播放器结合使用,您可以将其托管在您自己的网站上,以便通过中国的防火墙,并支持自适应分辨率。
这是一个示例 HLS 主播放列表,因此您不一定需要阅读 RFC 8216,该文件将称为 Video.m3u8:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080
Video_1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=9000000,RESOLUTION=2560x1440
Video_1440p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=16000000,RESOLUTION=3840x2160
Video_4k.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2800000,RESOLUTION=1280x720
Video_720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1400000,RESOLUTION=842x480
Video_480p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=640x360
Video_360p.m3u8
带宽以每秒比特数指定,质量顺序无关紧要,因为媒体播放器选择播放哪种分辨率。
您可以在命令提示符下用于 ffmpeg 的命令是:
ffmpeg -hwaccel dxva2 -hide_banner -y -i "C:\input\Video.mp4" -vf scale=1920:1080 -c:a aac -ar 48000 -c:v h264 -profile:v main -crf 20 -r 30 -sc_threshold 0 -g 48 -keyint_min 48 -hls_time 2 -hls_playlist_type vod -b:v 5000k -maxrate 5350k -bufsize 7500k -b:a 192k -hls_segment_filename "C:\output\Video_1080p_%03d.ts" "C:\output\Video_1080p.m3u8" -vf scale=2560:1440 -c:a aac -ar 48000 -c:v h264 -profile:v main -crf 20 -r 30 -sc_threshold 0 -g 48 -keyint_min 48 -hls_time 2 -hls_playlist_type vod -b:v 9000k -maxrate 10350k -bufsize 14500k -b:a 192k -hls_segment_filename "C:\output\Video_1440p_%03d.ts" "C:\output\Video_1440p.m3u8" -vf scale=3840:2160 -c:a aac -ar 48000 -c:v h264 -profile:v main -crf 20 -r 30 -sc_threshold 0 -g 48 -keyint_min 48 -hls_time 2 -hls_playlist_type vod -b:v 16000k -maxrate 20350k -bufsize 26000k -b:a 192k -hls_segment_filename "C:\output\Video_4k_%03d.ts" "C:\output\Video_4k.m3u8" -vf scale=1280:720 -c:a aac -ar 48000 -c:v h264 -profile:v main -crf 20 -r 30 -sc_threshold 0 -g 48 -keyint_min 48 -hls_time 2 -hls_playlist_type vod -b:v 2800k -maxrate 2996k -bufsize 4200k -b:a 128k -hls_segment_filename "C:\output\Video_720p_%03d.ts" "C:\output\Video_720p.m3u8" -vf scale=842:480 -c:a aac -ar 48000 -c:v h264 -profile:v main -crf 20 -r 30 -sc_threshold 0 -g 48 -keyint_min 48 -hls_time 2 -hls_playlist_type vod -b:v 1400k -maxrate 1498k -bufsize 2100k -b:a 128k -hls_segment_filename "C:\output\Video_480p_%03d.ts" "C:\output\Video_480p.m3u8" -vf scale=640:360 -c:a aac -ar 48000 -c:v h264 -profile:v main -crf 20 -r 30 -sc_threshold 0 -g 48 -keyint_min 48 -hls_time 2 -hls_playlist_type vod -b:v 800k -maxrate 865k -bufsize 1200k -b:a 96k -hls_segment_filename "C:\output\Video_360p_%03d.ts" "C:\output\Video_360p.m3u8"
您唯一需要做的是将 C:\input\Video.mp4 替换为您的视频,并将所有 C:\output\Video 替换为视频的输出名称。360p 代表输出视频文件名中指定的分辨率,它不影响实际分辨率,%03d 是一个命令,它被解析为视频片段一个数字,例如 001 到 999。下划线用于可读性。
注释解释: -hwaccel dxva2 表示 ffmpeg 将使用 Directx 进行硬件加速,这在 windows vista 及以上版本中可用。-hls_time 2 将片段时间设置为每个片段 2 秒。aac 和 h264 是在 hls 视频片段中使用的编解码器。
ffmpeg 的此命令会生成 6 个质量级别,但不会创建主播放列表。主播放列表是每个带宽的播放列表(见上文),取决于互联网速度,hls 播放器选择要播放的视频片段的播放列表。