一、修复bug和更新
程序在运行中难免会出现报错等,在此感谢粉丝朋友们提出的宝贵意见,今天修复两个bug并更新文件:
1、手动能查到节目表,但是程序未能解析出正确的节目表:
其原因是缺少json模块,打包时未将模块导入,因此导致iptv/live/zh_cn.js关键字找到的IP均未正确解析到节目,现已修复。
2、txt转m3u的时候同一个节目名称有多条数据的时候m3u的格式不对:
原代码有问题,已重新修改:
3、增加速度测试
我们可以在上一个版本中增加一个速度测试的开关来筛选更优质的节目
[cc lang=”python”]speed_test = y
speed_test_delay = 10
hd_speed = 0
sd_speed = 2[/cc]
speed_test:默认y,即进行节目速度测试;
speed_test_delay:默认10,即设置超时10秒就跳过,返回0;
hd_speed:默认1,即1080以上节目速度阈值,超过1mpbs的保存结果;
sd_speed:默认2,即1080以下节目速度阈值,即超过2mpbs的保存结果。
可以根据自身需求设置对应的参数,当然筛选要求越多,测试的流程就越长,时间也越长,具体参数没有做详细测试,根据需要来选择吧。
当然这个也不是绝对准确,因为在测试过程中发现有的没测出来分辨率,但是有加载播放速度,经测试是可以正常播放;有的有分辨率,但是速度为0,这种就比较卡顿。
二、配置ffmpeg环境
我们获取到批量的播放链接,需要对播放地址检测视频分辨率和播放速度,我们可以使用cv2来测试分辨率,如前面用cv2来获取组播节目的分辨率来判断IP是否为有效IP,当然也可以使用ffmpeg来测试分辨率和速率,记录一下用ffmpeg获取视频的分辨率和速率的原理方法。
首先需要安装ffmpeg:
1、Ubuntu/Debian等的Linux发行版系统,使用以下命令安装FFmpeg:
[cc lang=”bash”]sudo apt update
sudo apt install ffmpeg[/cc]
2、windows系统直接下载后配置环境变量即可,可选择官网下载:
https://ffmpeg.org/download.html
选择windows平台进行下载,也可以回复文末关键字下载本人网盘ffmpeg资源。
下载完成后需配置环境变量,参照前文:
准备更新:修正部分酒店源udp的正确解析,增加ffmpeg测分辨率分类输出高清标清节目,增加txt转m3u
三、如何应用ffmpeg测试分辨率和速率
以获取http://222.89.16.225:808/hls/80/index.m3u8的分辨率和速率为例
1、测试分辨率:
可以在命令窗口输入以下命令:
ffprobe -print_format json -show_format -show_streams -v quiet http://222.89.16.225:808/hls/80/index.m3u8
我们可以看到输出信息中有width和height两个值,即为该链接的分辨率,因此我们用python执行以上命令,然后用json获取width和height的值即为视频分辨率。
2、测试速率:
获取速率需要用到ffmpeg命令:
ffmpeg -i http://222.89.16.225:808/hls/80/index.m3u8 -t 10 -f null –
我们可以看到输出结果有speed的值,我们用python执行以上命令,然后用正则表达式获取多个speed的值,然后求平均值即为该视频的访问速度。
四、用python测试视频分辨率、速率相关代码:
相关代码来源于之前分享的酒店源直播的tools:
经验∶适合纯小白记录的python自动化运行爬取酒店IPTV直播源
1、获取分辨率代码:
[cc lang=”python”]# 解析IPTV分辨率等信息
def get_ffprobe_info(url):
command = [‘ffprobe’, ‘-print_format’, ‘json’, ‘-show_format’, ‘-show_streams’, ‘-v’, ‘quiet’, url]
try:
# 设置超时时间为10秒
result = subprocess.run(command, capture_output=True, text=True, timeout=10)
output = result.stdout
data = json.loads(output)
# 获取视频流信息
video_streams = data[‘streams’]
width = 0.00
height = 0
frame = 0.00
if len(video_streams) > 0:
stream = video_streams[0]
# 提取宽度和高度
width = stream.get(‘width’)
if width is None:
frame = 0
height = stream.get(‘height’)
if height is None:
height = 0
# 提取帧速率
frame = stream.get(‘r_frame_rate’)
if frame != ‘0/0’ and frame != ”:
frame = eval(frame)
else:
frame = 0.0
if width == 0 or height == 0 or frame == 0.0:
return []
return [width, height, frame]
except KeyError:
# print(‘无法提取视频流信息:找不到 streams 键’)
return []
except json.JSONDecodeError:
# print(‘无法解析 ffprobe 输出为 JSON 格式’)
return []
except subprocess.CalledProcessError as e:
# print(“Error: 视频信息无效,解析失败”)
return []
except subprocess.TimeoutExpired:
# print(“Error: 执行超时”)
return [][/cc]
2、获取播放速率代码
[cc lang=”python”]# 获取IPTV播放速度信息(酒店源m3u等和组播源皆可用)
def get_ffmpeg_speed(url):
try:
# 测试或超时时长/秒
delay = 10
# 构建FFmpeg命令
ffmpeg_command = f”ffmpeg -i {url} -t {delay} -f null -”
# 执行FFmpeg命令并捕获输出
process = subprocess.Popen(ffmpeg_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate(timeout=20)
# 从FFmpeg输出中提取下载速度
output_str = stderr.decode(“utf-8″)
# print(f”{url} output_str: {output_str}”)
match = re.findall(r’speed=(.*?)x’, output_str)
speed_mbps = 0.00
# print(f”{url} match: {match}”)
if match:
# 计算速度数组的平均值
speeds = [float(speed) for speed in match]
avg_speed_mbps = sum(speeds) / len(speeds)
speed_mbps = float(‘{:.2f}’.format(avg_speed_mbps))
speed_mbps = 0.00 if speed_mbps < 0.50 else speed_mbps
print(f”{url} 播放速度: {speed_mbps} Mbps”)
return speed_mbps
except subprocess.CalledProcessError as e:
# print(f”FFmpeg命令执行失败: {e}”)
return 0.00
except re.error as e:
# print(f”正则表达式匹配出现问题: {e}”)
return 0.00
except Exception as e:
# print(f”发生了其他异常: {e}”)
return 0.00[/cc]
五、更新文件下载
相关文件仅供个人测试使用。由于本人非专业代码程序员,只是纯属个人爱好,写的代码东拼西凑,对于专业人员来说不需要,对于不会的人来说就看不懂,所以就不再放源码出来了,只提供exe文件。
扫码关注本公众号,回复本文发布日期:【240519】即可获取下载链接。有任何建议欢迎留言或后台私信。