测试的小伙伴们应该了解过,获取I帧间隔的方法:
1. 录制H264码流,然后使用雷神的H264分析工具来查看I帧间隔,这个方法比较直观,可以查看详细的编码信息,但是需要录制码流,用起来不是那么便捷,而且我们这些非研发的小白也不懂这些编码代表啥,我们只是想知道I帧间隔是多少,于是就有了我自创的方法2
2. 使用 python+ffmpeg 获取rtsp码流的I帧间隔,我们知道ffplay可以实时预览rtsp码流,百度一番之后,发现也可以完成I帧间隔的获取。大家可以自行到ffmpeg官网FFMpeg - Download(不知道是不是官网,囧~)去获取ffmpeg的静态编译库
下载下来就是这个样子的 :
当然也有更新的版本,都是一样的:
接下来就是重点了,指令,其实就是跑一下指令而已了:
使用python+ffprobe分析rtsp码流:
ffprobe -select_streams v -show_frames -show_entries frame=pict_type -of csv rtsp://x.x.x.x
ffprobe version N-91961-g5109c38162 Copyright (c) 2007-2018 the FFmpeg developers
built with gcc 8.2.1 (GCC) 20180813
configuration: --disable-static --enable-shared --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth
libavutil 56. 19.101 / 56. 19.101
libavcodec 58. 30.100 / 58. 30.100
libavformat 58. 18.101 / 58. 18.101
libavdevice 58. 4.103 / 58. 4.103
libavfilter 7. 32.100 / 7. 32.100
libswscale 5. 2.100 / 5. 2.100
libswresample 3. 2.100 / 3. 2.100
libpostproc 55. 2.100 / 55. 2.100
[udp @ 0000023842c36dc0] 'circular_buffer_size' option was set but it is not supported on this build (pthread support is required)
[udp @ 0000023842c4cbc0] 'circular_buffer_size' option was set but it is not supported on this build (pthread support is required)
[udp @ 0000023842c5d440] 'circular_buffer_size' option was set but it is not supported on this build (pthread support is required)
[udp @ 0000023842c6d700] 'circular_buffer_size' option was set but it is not supported on this build (pthread support is required)
Input #0, rtsp, from 'rtsp://192.168.12.105/2':
Metadata:
title : 10
Duration: N/A, start: 0.000000, bitrate: N/A
Stream #0:0: Video: h264 (High), yuvj420p(pc, bt709, progressive), 640x360 [SAR 1:1 DAR 16:9], 30 fps, 30 tbr, 90k tbn, 60 tbc
Stream #0:1: Audio: aac (LC), 48000 Hz, stereo, fltp
b'frame,I\r\n'
b'frame,P\r\n'
b'frame,P\r\n'
b'frame,P\r\n'
b'frame,P\r\n'
b'frame,P\r\n'
b'frame,P\r\n'
b'frame,P\r\n'
b'frame,P\r\n'
b'frame,P\r\n'
b'frame,P\r\n'
b'frame,P\r\n'
b'frame,P\r\n'
b'frame,P\r\n'
b'frame,P\r\n'
b'frame,P\r\n'
b'frame,P\r\n'
b'frame,P\r\n'
b'frame,P\r\n'
b'frame,P\r\n'
b'frame,P\r\n'
b'frame,P\r\n'
b'frame,P\r\n'
b'frame,P\r\n'
b'frame,P\r\n'
b'frame,P\r\n'
b'frame,P\r\n'
b'frame,P\r\n'
b'frame,P\r\n'
b'frame,P\r\n'
b'frame,I\r\n'
iframe_interval: 30****************************************************************************************************
可以看到分析出来的I帧间隔就是30了,非常的方便
python脚本如下,大家将就着看,水平有限,欢迎吐槽:
import os,subprocess,time
def check_iframestr(outstr):
lst=outstr.split("\n")
t1=0
t2=0
for index,item in enumerate(lst):
if item.find('I')!=-1:
if t1!=0:
t2=index
break
if t1==0:
t1=index
return abs(t1-t2)
def Get_Ikey_frame(ip,delaytime=5,ffmepgdir=r"D:\FFMPEG\ffmpeg-20180916-5109c38-win64-shared\bin"):
path1=os.getcwd()
os.chdir(ffmepgdir)
cmd="ffprobe -select_streams v -show_frames -show_entries frame=pict_type -of csv rtsp://"+ip
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
outstr=""
flag=False
for i in range(1200):
for str1 in iter(p.stdout.readline, ''):
outstr=outstr+str1.decode("utf-8")
print(str1)
if outstr.count("frame,I")>=2:
flag=True
if check_iframestr(outstr)>1:
break
if flag:
break
p.kill()
os.chdir(path1)
print("iframe_interval: "+str(check_iframestr(outstr))+"*"*100)
return check_iframestr(outstr)
while 1:
Get_Ikey_frame("192.168.12.105")
Get_Ikey_frame("192.168.12.105/2")
好了,使用python+ffmpeg 获取rtsp码流的I帧间隔就分享到这里了,欢迎大家留言交流!