如何用Python获取HEVC视频时长?OpenCV代码无法获取帧率帧数求助
解决OpenCV无法读取HEVC视频帧率/帧数的问题
你的问题大概率是因为OpenCV默认编译版本未包含HEVC(H.265)解码器,导致无法正确解析视频元数据。下面给你几个可行的解决思路:
1. 先排查视频是否成功打开
先修改你的代码,增加视频打开状态的检查,确认是不是根本没读进视频:
import cv2 def with_opencv(filename): video = cv2.VideoCapture(filename) # 检查视频是否成功打开 if not video.isOpened(): print("无法打开HEVC视频文件,请检查解码器支持") return None frame_count = video.get(cv2.CAP_PROP_FRAME_COUNT) frame_rate = video.get(cv2.CAP_PROP_FPS) # 记得释放资源 video.release() # 检查获取到的参数是否有效(无效时会返回0或负数) if frame_count <= 0 or frame_rate <= 0: print("无法获取有效帧率/帧数,解码器不支持HEVC") return None return frame_count / frame_rate print(with_opencv('vid.hevc'))
2. 重新编译OpenCV以支持HEVC
如果确认是解码器缺失,你可以重新编译OpenCV,编译时启用HEVC相关的解码器选项:
- 编译时添加
-D WITH_GSTREAMER=ON(GStreamer通常自带HEVC解码支持) - 或者添加
-D WITH_OPENH265=ON(需要提前安装openh265库) - 具体编译步骤可参考OpenCV官方文档,不过这个方法需要一定的编译环境和经验。
3. 使用ffmpeg-python替代(更简便)
如果不想折腾编译,直接用ffmpeg-python库更靠谱——FFmpeg对HEVC的支持非常完善,不需要额外配置。
步骤:
- 安装库:
pip install ffmpeg-python
- 示例代码(直接获取视频时长,或通过帧率+帧数计算):
import ffmpeg def get_video_duration(filename): try: # 探测视频元数据 probe = ffmpeg.probe(filename) # 筛选出视频流 video_stream = next(stream for stream in probe['streams'] if stream['codec_type'] == 'video') # 方法1:直接拿视频时长(单位:秒) duration = float(video_stream['duration']) # 方法2:通过帧率和帧数计算 frame_rate = eval(video_stream['r_frame_rate']) # 解析类似"30/1"的帧率字符串 frame_count = int(video_stream['nb_frames']) duration_calc = frame_count / frame_rate print(f"直接获取时长:{duration}秒,计算时长:{duration_calc}秒") return duration except ffmpeg.Error as e: print(f"处理出错:{e.stderr.decode()}") return None except StopIteration: print("视频文件中未找到视频流") return None print(get_video_duration('vid.hevc'))
这个方法几乎能兼容所有主流视频格式,包括HEVC,不用纠结OpenCV的解码器问题。
内容的提问来源于stack exchange,提问作者AmirHossein Asa
相关产品推荐
相关产品推荐

