1.
目的:将源文件转换为适合不同网络/设备的多种码率并封装成播放器能识别的切片与清单;核心要求:码流质量、关键帧对齐、低延迟与缓存友好。小分段:影响点包括编码设置、GOP大小、分段时长与封装格式(HLS/DASH/CMAF)。
2.
步骤:1) 用ffprobe检查源:ffprobe -v error -show_format -show_streams source.mp4;2) 确定分辨率与目标码率梯度(例如1080p-5Mbps、720p-3Mbps、480p-1.5Mbps、360p-600kbps);3) 确定GOP(关键帧间隔)例如2秒或与切片时长一致。小分段:记录帧率/色彩空间/音频通道以避免不兼容。
3.
命令示例(批量):ffmpeg -i source.mp4 -c:v libx264 -preset veryfast -g 48 -keyint_min 48 -sc_threshold 0 -b:v 3000k -maxrate 3300k -bufsize 6000k -s 1280x720 -c:a aac -b:a 128k -f mp4 output_720.mp4;重复不同分辨率和码率。小分段:确保-g(GOP)与分片时长一致,关闭场景检测(-sc_threshold 0)以避免错位关键帧。
4.
Shaka示例:packager \ in=output_720.mp4,stream=video,output=720_video.mp4 \ in=output_720.mp4,stream=audio,output=audio.mp4 \ --profile on-demand --segment_duration 4 --fragment_duration 4 \ --hls_master_playlist_output master.m3u8 --mpd_output manifest.mpd;小分段:使用--segment_duration与转码时GOP对齐,生成init段与媒体段,CMAF建议4s或2s切片。
5.
原则:切片短则更灵活(1-2s 适合低延迟),但增加请求与IO压力;4s为兼顾延迟与稳定的常见值。小分段:码率梯度建议按比率下降(例如每档约50-60%带宽),并对关键场景调整最低码率保证稳定播放。
6.
做法:1) 在转码时固定GOP并禁用场景检测;2) 所有码率使用相同帧率与GOP长度;3) 封装时使用相同分片边界;小分段:若跨编码器,则采用强制插入关键帧的pass或二次处理以保证对齐。
7.
结构建议:/master.m3u8、/manifest.mpd、/video/720/seg_0001.m4s 等;设置Cache-Control与正确的Content-Type(application/vnd.apple.mpegurl、application/dash+xml);小分段:为不同分段设置长缓存并对manifest设置较短缓存或使用版本号/时间戳刷新。
8.
播放器配置:设置初始缓冲、最大缓冲长度与启用ABR算法;在清单中提供带宽与分辨率标签;小分段:监控播放端的吞吐、切换频率并根据实际网络调整码率梯度与最小缓冲。
9.
问题:如何选择合适的码率梯度?
回答:基于目标设备与地域带宽分布制定;步骤:1) 统计用户带宽分布;2) 设置顶部码率覆盖高速用户(如5-8Mbps);3) 每档约降到上一档的50-60%;4) 保留低于400-500kbps的最低清晰度为应急。
10.
问题:如何保证不同码率间无缝切换?
回答:保证相同帧率与GOP、对齐分片边界、使用相同封装(CMAF最佳),以及播放器端启用精确对齐切换;若启用了加密,确保密钥和初始化向量在各分辨率一致或使用统一CENC策略。
11.
问题:有哪些验证与调试工具推荐?
回答:使用ffprobe/mediainfo核对流信息,shaka-packager的--dump_stream_info验证封装,Shaka Player或hls.js做本地回放测试,使用CDN日志与M3U8/DASH可视化工具监测段请求与播放成功率。
