如何用ffmpeg/ffprobe获取HLS音视频流的CODECS字符串
如何从ffprobe元数据生成HLS主播放列表的CODECS值
我来帮你解决这个问题——手动生成HLS主播放列表时需要的CODECS值,其实完全可以从你已经拿到的ffprobe元数据里拼接出来,不用额外找工具。下面分步骤拆解:
一、先搞懂CODECS的格式要求
HLS里的CODECS值是视频编码标识符和音频编码标识符的组合,用逗号分隔,格式类似:"avc1.XXXXXX,mp4a.YY.Z"。
二、从你的ffprobe元数据生成对应值
1. 视频流部分(以你提供的H.264为例)
你的视频元数据里有三个关键字段:
codec_tag_string:avc1(这是H.264的标准前缀)profile:High(对应十六进制值64;Baseline是42,Main是4D)level:30(转十六进制是1E)
按照avc1.<profile-hex>00<level-hex>的规则拼接,结果就是:avc1.64001e
2. 音频流部分(以你提供的AAC LC为例)
你的音频元数据关键字段:
codec_tag_string:mp4a(AAC的标准前缀)profile:LC(对应object type值2)
HLS里AAC LC的标准写法是mp4a.40.2(40是固定的描述符,2对应LC profile),所以音频部分就是:mp4a.40.2
3. 组合最终的CODECS值
把视频和音频部分用逗号连起来,加上引号,就是你需要的:"avc1.64001e,mp4a.40.2"
三、用ffprobe自动化生成(避免手动计算)
如果不想手动拼接十六进制,可以用ffprobe配合awk直接输出格式化后的CODECS值:
生成视频编码标识符:
ffprobe -v error -select_streams v:0 -show_entries stream=codec_tag_string,profile,level -of csv=p=0 input.mp4 | awk -F',' '{ profile_map["Baseline"]="42"; profile_map["Main"]="4D"; profile_map["High"]="64"; printf "%s.%s00%X\n", $1, profile_map[$2], $3 }'
生成音频编码标识符:
ffprobe -v error -select_streams a:0 -show_entries stream=codec_tag_string,profile -of csv=p=0 input.mp4 | awk -F',' '{ if ($2 == "LC") printf "%s.40.2\n", $1 }'
把两个命令的结果用逗号拼接,就是完整的CODECS值了。
验证一下
你给出的示例主播放列表里的CODECS值,和我们用你的元数据生成的完全一致,说明这个方法是对的。
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

