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,造成视频卡顿

浙公网安备 33010602011771号