import PySimpleGUI as sg
import sys
import json
import os
import requests
import subprocess
import pygame.camera
import pyaudio
import psutil
import time#当 运行地址 os.getcwd()
__DIR__ = os.getcwd();
# 登入页面
logo = sg.Image(__DIR__+"\\bin\\image\\100.png")
my_text = sg.Text('XXX-直播伴侣',key = '_text_', visible = True, font=('宋体', 12), size=(0, 1), pad=((165, 0), (10, 0)),justification='center')
#账户
member_title = sg.Text('账号:',pad=((110, 0), (35, 0)),font=('宋体', 12))
member_name = sg.InputText('',key='name',pad=((0, 0), (35, 0)), size=(25, 1))
#密码
pwd_title = sg.Text('密码:',pad=((110, 0), (10, 0)),font=('宋体', 12))
pwd_name = sg.InputText('',key='pwd', pad=((0, 0), (10, 0)), size=(25, 1),password_char='*')
#  弹框提示
# sg.SystemTray.notify('Notification Title', 'This is the notification` message')hello_button = sg.Button(button_text="登入",        # 按钮显示文本tooltip='登入账号',             # 鼠标滑到按钮时显示的文本border_width=0,             # 按钮边框size=(15, 1),              # 按钮的长度,高度auto_size_button=True,      # 自否自适应button_color=('black', 'white'),  # 按钮字体颜色, 按钮的背景色font=('宋体', 12),        # 设置字体,大小bind_return_key=False,    # 是否绑定按键focus=True,              # 鼠标是否放置在此按钮上pad=((175, 0), (20, 0)),    # 设置元素的间距 (左,右),(上,下)# key='START-EXEC',       # 元素唯一标示visible=True)
layout = [
[logo],[my_text],#提示语句[member_title,member_name],[pwd_title,pwd_name],[hello_button]
]
icon_ = __DIR__+"\\bin\\icon\\favicon.ico"
window = sg.Window('XXX-直播伴侣', layout,grab_anywhere=True,size=(500,340),icon=icon_)API_URL = 'http://xxxxxxx.top/api/v1';#htt
HEADER_UR =  'lxxxxxx';
headers ={
"Accept":"*/*",
"Accept-Encoding":"gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "keep-alive",
"Content-Type": "application/json",
"Host": HEADER_UR,
# "Access-Token":"695s",
# "Origin": "http://pslv4.kvniaudbfiuve12123.xyz",
# "Referer": "http://pslv4.kvniaudbfiuve12123.xyz",
"Content-Type": "application/json"
}# eventdef get_audio_devices():p = pyaudio.PyAudio()devices = []for i in range(p.get_device_count()):# print(p.get_device_info_by_index(i).get('name'))devices.append(p.get_device_info_by_index(i))return devicesdef get_audio_input_devices():devices = []for item in get_audio_devices():if item.get('maxInputChannels') > 0:devices.append(item)return devicesdef kill_process(pid):parent_proc = psutil.Process(pid)for child_proc in parent_proc.children(recursive=True):child_proc.kill()parent_proc.kill()#获取音频设备
Audio_List =[];
# Audio_ =pyaudio.PyAudio()
# print(Audio_.get_default_output_device_info())
# for Audio_id in get_audio_input_devices():
#   Audio_List.append(Audio_id.get('name'))# print(Audio_List) -hide_banner -list_devices  true -f dshow -i 0
cmd = __DIR__+'\\bin\\ffmpeg  -list_devices true -f dshow -i dummy'#['ffmpeg', '-list_devices','true', '-f','dshow','-i','dummy']
process = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, encoding="utf-8",text=True)
record = False
num_line = 0;
for line in process.stdout:# print(',,,,,', num_line)# print(line)if record:if line.startswith("[dshow"):_line = line[index + 2:]if _line.startswith("DirectShow audio"):record = Falseif record and num_line%2 == 0:Audio_List.append(_line[2:len(_line)-2])num_line+=1if line.startswith("[dshow"):index = line.find("]");if index > 0:_line = line[index+2:]if _line.startswith("DirectShow audio"):# print('>>>>>>>', _line)num_line = 0record = Truewhile True:event, value = window.read()if event == sg.WIN_CLOSED: breakif event == '登入':if value['name']=='':my_text.update('   账号不能为空') #修改标题if value['pwd']=='':my_text.update('   密码不能为空') #修改标题#如果都存在进行APP接口登入data ={"username":value['name'],"password":value['pwd'],"group":"pc"}try:print(API_URL + '/site/login.json')mediaGet =requests.post(API_URL + '/site/login.json', json.dumps(data), headers = headers, timeout = 5)# print(mediaGet)mediaGet = mediaGet.json()except Exception as e:#错误提示print(e)sg.popup_error('网络异常, 请稍后重试!',icon=icon_)continueif mediaGet['code']!=200:print(mediaGet['message'])my_text.update(mediaGet['message']) #修改标题continue;if mediaGet['code']==200:sg.SystemTray.notify('登入成功..', '欢迎用户:'+mediaGet['data']['member']['nickname'])#     # print(1)window.close()#获取目前已经存在的分类values = []cate =requests.get(API_URL + '/live/all-cate.json', headers = headers, timeout = 30)for cate_ in cate.json()['data']['list']:values.append(cate_['name'])#获取直媒体设备pygame.camera.init()shexiangtou=pygame.camera.list_cameras()# print(camera_id_list)#开启新的页面layout = [[sg.Text('直播类型:',pad=((0, 0), (0, 0)),font=('宋体', 12)),sg.Listbox(values=values,key='list',size=(30,7))],[sg.Text('视频设备:',pad=((0, 0), (0, 0)),font=('宋体', 12)),sg.Listbox(values=shexiangtou,key='video',size=(30,2))],[sg.Text('音频设备:',pad=((0, 0), (0, 0)),font=('宋体', 12)),sg.Listbox(values=Audio_List,key='audio',size=(30,2))],[sg.Text('开播标题:',pad=((0, 0), (0, 0)),font=('宋体', 12)),sg.InputText('',key='title',size=(80, 1))],[sg.Button(button_text="开始直播",        # 按钮显示文本tooltip='开始直播',             # 鼠标滑到按钮时显示的文本border_width=0,             # 按钮边框size=(15, 1),              # 按钮的长度,高度auto_size_button=True,      # 自否自适应button_color=('black', 'white'),  # 按钮字体颜色, 按钮的背景色font=('宋体', 12),        # 设置字体,大小bind_return_key=False,    # 是否绑定按键focus=True,              # 鼠标是否放置在此按钮上pad=((85, 0), (20, 0)),    # 设置元素的间距 (左,右),(上,下)# key='START-EXEC',       # 元素唯一标示visible=True)]]liveOpen = sg.Window('开始直播', layout,grab_anywhere=True,size=(300,380),icon=icon_)# sg.SystemTray.notify('登入成功..', '欢迎用户:'+mediaGet['data']['member']['nickname'])event, value = liveOpen.read()while True:event, value = liveOpen.read()if event == sg.WIN_CLOSED: breakif event == '开始直播':#进行开始直播#检测未选 进行提示if value['list'] == []:sg.popup_error('请选择直播类型!',icon=icon_) continue;if value['title'] == '':sg.popup_error('请输入开播标题!',icon=icon_) continue;# videoif value['video'] == []:sg.popup_error('请选择设备!',icon=icon_) continue;if value['audio'] == []:sg.popup_error('请选择设备!',icon=icon_) continue;vate_id = '';for cate_ in cate.json()['data']['list']:if value['list'][0] ==cate_['name']:vate_id =cate_['id']#执行查询音频命令# audio_ok = subprocess.run('',encoding="utf-8" , shell=True)#检测是否存在 不存在提示if vate_id!="":#开始请求直播接口data={"cate_id":vate_id,"title":value['title']}headers['x-api-key'] = mediaGet['data']['access_token'];live =requests.post(API_URL + '/live/start-live.json', json.dumps(data), headers = headers, timeout = 30)live =live.json()if live['code']!=200:sg.popup_error(live['message']) continue;#进行推流直播 ffmpeg -f dshow -i video="USB2.0 PC CAMERA" -f dshow -i audio="麦克风 (2- USB2.0 MIC)" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://127.0.0.1:1935/live/123cmd_rtmp = __DIR__+'\\bin\\ffmpeg -f dshow -i video="'+value['video'][0]+'"  -f dshow -i audio="'+value['audio'][0]+'" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv "' + live['data']['detail']['video']+'" -loglevel quiet ';cmd_lx = subprocess.Popen(cmd_rtmp,encoding="utf-8" , shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)# sg.SystemTray.notify('开播成功', '下播请关闭摄像头窗口..')# print(live['data']['detail']['video'])print(cmd_rtmp)liveOpen.disappear() # 窗口隐藏sg.popup('开播成功!下播请关闭摄像头窗口然后等待提示! 请点击ok继续',icon=icon_)time.sleep(10)# cmd_play = __DIR__+'\\bin\\ffplay -f dshow -i video="'+value['video'][0]+'" -loglevel quiet ';cmd_play = __DIR__+'\\bin\\ffplay ' + live['data']['detail']['video'];print(cmd_play)subprocess.run(cmd_play,encoding="utf-8" , shell=True)print(cmd_lx.pid)kill_process(cmd_lx.pid)cmd_lx.kill()# subprocess.Popen.kill(proc1)# cmd_lx.terminate()# Popen.wait()#如果退出运行- 直接进行下播live_id = live['data']['detail']['id']data = {"live_id":live_id}live =requests.post(API_URL + '/live/live-off.json', json.dumps(data), headers = headers, timeout = 30)liveOpen.reappear() #展示窗口sg.popup('下播成功!',icon=icon_)print(live.json())# ffplay -f dshow -i video="USB2.0 PC CAMERA"#调用ffmpeg进行直播推流data# cmd_str =__DIR__+f'\\\bin\\ffmpeg -hide_banner -list_devices  true -f dshow -i 0 -loglevel quiet '# cmd =subprocess.run(cmd_str, encoding="utf-8" , shell=True)# print(cmd)#进行直播接口请求# # print(mediaGet.json())# sg.popup_ok('66')# sg.SystemTray.notify('Notification Title', 'This is the notification` message')#进行检测提示账户密码不能为空if event == 'Clean':my_text.update('')
# window.close()
打包程序pyinstaller  -i "C:/Users/DELL/Desktop/live-exe/bin/icon/favicon.ico" index.py  --distpath "C:/Users/DELL/Desktop/live-exe/" --noconsole --clean

python ffmpeg直播客户端相关推荐

  1. ffmpeg推流_明白了以下5点思路,你也能用Python实现直播推流效果(技术活)

    今天为大家带来的内容是:明白了以下5点思路,你也能用Python实现直播推流效果(技术活) 本文内容主要介绍了Python实现直播推流效果,主要是通过opencv读取视频对视频分割为帧,本文通过实例代 ...

  2. python实现直播功能_Python实现直播推流效果

    首先给出展示结果,大体就是检测工业板子是否出现.采取检测的方法比较简单,用的OpenCV的模板检测. 大体思路 opencv读取视频 将视频分割为帧 对每一帧进行处理(opencv模板匹配) 在将此帧 ...

  3. NDK RTMP直播客户端三

    在之前完成的实战项目[FFmpeg音视频播放器]属于拉流范畴,接下来将完成推流工作,通过RTMP实现推流,即直播客户端.简单的说,就是将手机采集的音频数据和视频数据,推到服务器端. 接下来的RTMP直 ...

  4. python刷直播人气_表姐直播人气很差?Python一招引爆直播推流效果

    本节介绍了Python完成直播推流作用,主要是经过opencv读取视频对视频分割为帧,本文经过实例代码讲解的非常具体 做任何事情都有一定的思路,写代码更是如此,直播推流的整体思路如下: opencv读 ...

  5. NDK RTMP直播客户端二

    在之前完成的实战项目[FFmpeg音视频播放器]属于拉流范畴,接下来将完成推流工作,通过RTMP实现推流,即直播客户端.简单的说,就是将手机采集的音频数据和视频数据,推到服务器端. 接下来的RTMP直 ...

  6. python实现直播功能rtmo_基于python的直播间接口测试实战 详解结合项目

    基于python的直播间接口测试详解 一.基本用例内容描述 以设置白名单 /advisor/setUserWhiteList.do接口为例,该方法为POST at first,先要导入一些常用到的模块 ...

  7. 【直播资料下载】Python 系列直播——深入Python与日志服务,玩转大规模数据分析处理实战第二讲...

    流畅的Python数据处理及大数据处理ETL Python 系列直播--深入Python与日志服务,玩转大规模数据分析处理实战 直播讲师:丁来强(成喆)--阿里高级技术专家,从事阿里云日志服务相关的产 ...

  8. python编写ftp客户端_用Python写FTP客户端程序

    0 前言: ftp客户端相信大家都用过,那么我们为什么还要用Python写ftp客户端呢? 我想有两个原因: 一是写出更好的ftp客户端应用程序,方便大家使用: 二是定制一些特殊服务,例如每天定时下载 ...

  9. php socket 握手,python Socket之客户端和服务端握手详细介绍

    这篇文章主要为大家详细介绍了python Socket之客户端和服务端握手,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 简单的学习下利用socket来建立客户端和服务端之间的连接并且发送数据 1 ...

最新文章

  1. OD基本快捷键及功能
  2. POJ 2828 Buy Tickets 线段树
  3. bootstrap轮播图怎么居中
  4. python数据处理与机器学习
  5. 禁用一个计算机用户,系统小技巧:Windows 10账户删除 禁用与启用
  6. 查看ip地址信息和配置临时ip
  7. windows下编译chromium浏览器的15个流程整理
  8. 武汉理工大学计算机学院2018复试,武汉理工大学2018年自主招生复试揭秘
  9. Jmeter使用方法
  10. 7-3 组个最小数 (20 分)
  11. cntrol层的代码作用
  12. Linux面试题,经典Linux面试题,常见Linux面试题带答案
  13. 锐捷文件描述错误linux,ubuntu下使用锐捷客户端连接校园网-郑州大学Ruijieclient for Linux下载及配置指导...
  14. ug无限的服务器名称,ug无效的服务器名称
  15. 用js(javascript)完成点击一个按钮会使相应的div背景颜色发生改变
  16. springboot整合阿里云OSS存储(对象存储)图文详解-———入门操作指南。
  17. 中国智能POS终端行业市场供需与战略研究报告
  18. getch方法_c语言中getch的用法
  19. matlab蜂窝异构网络基站用户矩阵 依照最近距离配对/快速计算两矩阵彼此距离
  20. eclipse 打开pom.xml文件很慢 设置pom.xml打开方式

热门文章

  1. 开始学习Liux shell洛
  2. chrome 浏览器设置字体大小,方便调试
  3. 玩 High API 系列之:拍照翻译
  4. 3DMAX+VR渲染时自动关闭解决方法
  5. 痞子衡嵌入式:揭秘i.MXRT1170 eFuse空间访问可靠性的保护策略(冗余与ECC)
  6. 51Nod-1574-排列转换
  7. ROBOGUIDE教程:FANUC机器人摆焊焊接功能介绍与虚拟仿真操作方法
  8. 汤姆猫无法访问html,汤姆猫开始,但HTML不加载
  9. 使用YYText-文本蓝色文字点击实现超链接跳转
  10. CAT ——数列和图形