如何通过ffmpeg获取HLS流的avc1.77.30类型Codec信息?
获取HLS流中AVC1格式的Codec标识
要拿到avc1.77.30这类符合HLS标准的Codec标识,你可以通过两种方式实现:直接解析播放列表提取服务器给出的字段,或者用ffprobe提取编解码参数后拼接成对应格式。
方式1:直接从HLS播放列表提取
既然服务器已经在播放列表的EXT-X-STREAM-INF字段中明确给出了CODECS值,最直接的方法是提取该字段:
用curl+grep提取
curl -s "你的HLS播放列表URL" | grep -oP 'CODECS="\K[^"]+'
执行后会直接输出avc1.77.30,mp4a.40.2。
用ffmpeg提取
如果依赖ffmpeg工具,也可以通过日志提取:
ffmpeg -i "你的HLS播放列表URL" -v trace 2>&1 | grep -oP 'CODECS="\K[^"]+'
方式2:用ffprobe提取参数后拼接
如果需要从TS片段本身获取,需要提取H.264的profile和level,再拼接成avc1格式:
1. 获取基础参数
执行以下命令获取视频流的profile和level:
ffprobe -v error -select_streams v:0 -show_entries stream=profile,level -of compact=p=0:nk=1 -i "你的TS文件或HLS URL"
输出示例:Main,30,对应profile为Main,level为3.0。
2. 映射profile到十进制值
根据H.264的profile对应关系,把名称转换成十进制数值:
- Baseline → 66
- Main → 77
- High → 100
- High 10 → 110
- High 4:2:2 → 122
- High 4:4:4 Predictive → 144
3. 拼接成avc1格式
用avc1.<profile十进制值>.<level>的格式拼接,比如示例中的Main,30就拼成avc1.77.30。
进阶:用JSON格式批量提取
如果需要更结构化的输出,用JSON格式便于脚本处理:
ffprobe -v error -select_streams v:0 -show_entries stream=profile,level -of json -i "你的TS文件或HLS URL"
输出示例:
{ "streams": [ { "profile": "Main", "level": 30 } ] }
为什么默认ffprobe只显示h264?
默认情况下ffprobe只会输出编解码器的通用名称(如h264),不会自动转换成HLS标准要求的avc1.xx.xx格式,必须手动提取profile和level参数进行拼接,或者直接从播放列表获取服务器预定义的标识。
内容的提问来源于stack exchange,提问作者iggy12345
相关产品推荐
相关产品推荐

