OpenCV VideoCapture读取HLS流CAP_PROP_FPS异常问题咨询
问题解答
问题1:生成HLS视频时保证OpenCV正确识别帧率的参数设置
你当前命令的核心问题是使用了-codec copy参数直接拷贝视频流,该模式下所有输出流的编码元数据会直接继承源文件,你额外加的-framerate 15是输入侧参数,不会修改输出流的帧率元数据,最终生成的TS文件avg_frame_rate为0/0就是典型表现。
根据你的需求分两种场景调整参数:
- 可接受重新编码的场景(兼容性最好)
去掉-codec copy,改用libx264转码并强制恒定帧率,参考命令如下:
其中/usr/bin/ffmpeg -i data/import/ParkingLot_20211028155745_snippet.mp4 -c:v libx264 -r 15 -vsync cfr -start_number 0 -hls_time 10 -hls_list_size 0 -f hls data/fileServer/ParkingLot/ParkingLot_20211028155745_snippet.m3u8-r 15强制输出帧率为15,-vsync cfr开启恒定帧率模式,转码后生成的TS流avg_frame_rate会被正确赋值为15/1,OpenCV可直接读取到正确帧率。 - 必须保留原始编码(使用流拷贝)的场景
若源文件本身帧率就是15,不需要转码,可以添加时间基配置修正元数据:
其中/usr/bin/ffmpeg -i data/import/ParkingLot_20211028155745_snippet.mp4 -codec copy -enc_time_base 1/15 -r 15 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls data/fileServer/ParkingLot/ParkingLot_20211028155745_snippet.m3u8-enc_time_base 1/15强制设置编码时间基为15fps对应的值,修复流元数据的帧率字段。
问题2:VideoCapture返回30FPS的原因
返回的30FPS是OpenCV的默认兜底值,不是通过HLS流属性计算得到的结果。
OpenCV的VideoCapture读取HLS流时依赖底层FFmpeg接口读取流元数据的avg_frame_rate字段,当该字段值为0/0无效时,不会主动统计总帧数和总时长计算真实帧率,会直接返回预设的默认值30FPS。
内容的提问来源于stack exchange,提问作者David Sargrad
相关产品推荐
相关产品推荐

