python+ffmpeg 获取rtsp码流的I帧间隔

测试的小伙伴们应该了解过,获取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帧间隔就分享到这里了,欢迎大家留言交流!

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值