pyav-seek

1.seek参数问题
pyav的seek,虽然接口里面写的是时间戳,但通过使用查看,传下标也是可以的。

container = av.open('xxx.avi')
video_stream = next(s for s in container.streams if s.type == "video")
total_frame_count = 0

# Count number of frames in video
for packet in container.demux(video_stream):
    for frame in packet.decode():
        if frame is not None:
            print(frame)
            total_frame_count += 1

# set target frame to middle frame
target_frame = int(total_frame_count / 2.0)
target_timestamp = int(
    (target_frame * av.time_base) / video_stream.average_rate
)

# should seek to nearest keyframe before target_timestamp
# 设置时间戳或下标都可以
container.seek(target_timestamp)

current_frame = None
frame_count = 0

#seek后跳到key frame,此时为了得到target frame,需要继续往后找,代码如下
for packet in container.demux(video_stream):
    for frame in packet.decode():
        if current_frame is None:
            current_frame = timestamp_to_frame(frame.pts, video_stream)
        else:
            current_frame += 1

        # start counting once we reach the target frame
        if current_frame is not None and current_frame >= target_frame:
            frame_count += 1

2.seek 默认是直接跳到key frame
所以如果想获取真正的的target frame,需要继续往后遍历

3.千万不要在遍历中seek
刚才说过,seek后返回的是key frame,这样的结果的会返连续相同的frame,造成视频卡顿

posted @ 2022-11-02 09:31  cnblogs_kk  阅读(454)  评论(0)    收藏  举报