ffmpeg快速解码抽帧,解码关键帧

背景

有很多的视频抽帧的场景,比如视频内容审核,需要对大量的视频来做视频抽帧,虽然视频的解码速度比较快,但是视频量和时长上来后,对整体的资源开销也是非常的大,如果可以在抽帧过程中只解码需要的关键帧,就会节省大量的计算资源。

测试环境

  1. 构建测试片源
    ffmpeg -i src.mp4 -c:v libx264 -preset veryfast -crf 24 -g 500 -keyint_min 250 -r 25 -an -f mp4 test.mp4 -y
  2. 查看片源I帧信息
    ffprobe -i test.mp4 -of compact -show_frames -show_entries frame=key_frame,pkt_pts_time,pict_type,coded_picture_number | grep pict_type=I
frame|key_frame=1|pkt_pts_time=0.000000|pict_type=I|coded_picture_number=0
frame|key_frame=1|pkt_pts_time=20.000000|pict_type=I|coded_picture_number=500
frame|key_frame=1|pkt_pts_time=35.480000|pict_type=I|coded_picture_number=887
frame|key_frame=1|pkt_pts_time=53.720000|pict_type=I|coded_picture_number=1343
frame|key_frame=1|pkt_pts_time=67.520000|pict_type=I|coded_picture_number=1688
frame|key_frame=1|pkt_pts_time=87.200000|pict_type=I|coded_picture_number=2180

正常抽帧

根据IDR的个数,按每15 frame对视频进行抽帧, 统计任务的资源开销
time ffmpeg -i test.mp4 -vf fps=0.0666666 output_vf_%03d.png

# frame=   48 fps=3.3 q=-0.0 Lsize=N/A time=00:12:00.00 bitrate=N/A speed=49.1x    
# video:101033kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown

# 147.58s user 2.22s system 1009% cpu 14.835 total

关键帧快速解码抽帧

只解码关键帧进行快速抽帧
time ffmpeg -skip_frame nokey -i test.mp4 -vsync vfr output_idr_%03d.png

# frame=   48 fps= 33 q=-0.0 Lsize=N/A time=00:11:40.52 bitrate=N/A speed= 488x    
# video:100474kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown

# 6.29s user 0.31s system 427% cpu 1.545 total

分析

上面同样都是抽48帧画面出来,编码帧数量一样,解码导致的差异,导致计算资源开销也不一样;
后续遇到同样的场景,大家也可以参考通过 -skip_frame nokey 来进行快速解码IDR。

猜你喜欢

转载自blog.csdn.net/ternence_hsu/article/details/106560505
今日推荐