先上效果圖:

代碼:
import os, platform
# 設置VLC庫路徑,需在import vlc之前
os.environ['PYTHON_VLC_MODULE_PATH'] = "./VLC"
import vlc
class Player:
'''
args:設置 options
'''
def __init__(self, *args):
if args:
instance = vlc.Instance(*args)
self.media = instance.media_player_new()
else:
self.media = vlc.MediaPlayer()
# 設置待播放的url地址或本地文件路徑,每次調用都會重新加載資源
def set_uri(self, uri):
self.media.set_mrl(uri)
# 播放 成功返回0,失敗返回-1
def play(self, path=None):
if path:
self.set_uri(path)
return self.media.play()
else:
return self.media.play()
# 暫停
def pause(self):
self.media.pause()
# 恢復
def resume(self):
self.media.set_pause(0)
# 停止
def stop(self):
self.media.stop()
# 釋放資源
def release(self):
return self.media.release()
# 是否正在播放
def is_playing(self):
return self.media.is_playing()
# 已播放時間,返回毫秒值
def get_time(self):
return self.media.get_time()
# 拖動指定的毫秒值處播放。成功返回0,失敗返回-1 (需要注意,只有當前多媒體格式或流媒體協議支持才會生效)
def set_time(self, ms):
return self.media.get_time()
# 音視頻總長度,返回毫秒值
def get_length(self):
return self.media.get_length()
# 獲取當前音量(0~100)
def get_volume(self):
return self.media.audio_get_volume()
# 設置音量(0~100)
def set_volume(self, volume):
return self.media.audio_set_volume(volume)
# 返回當前狀態:正在播放;暫停中;其他
def get_state(self):
state = self.media.get_state()
if state == vlc.State.Playing:
return 1
elif state == vlc.State.Paused:
return 0
else:
return -1
# 當前播放進度情況。返回0.0~1.0之間的浮點數
def get_position(self):
return self.media.get_position()
# 拖動當前進度,傳入0.0~1.0之間的浮點數(需要注意,只有當前多媒體格式或流媒體協議支持才會生效)
def set_position(self, float_val):
return self.media.set_position(float_val)
# 獲取當前文件播放速率
def get_rate(self):
return self.media.get_rate()
# 設置播放速率(如:1.2,表示加速1.2倍播放)
def set_rate(self, rate):
return self.media.set_rate(rate)
# 設置寬高比率(如"16:9","4:3")
def set_ratio(self, ratio):
self.media.video_set_scale(0) # 必須設置為0,否則無法修改屏幕寬高
self.media.video_set_aspect_ratio(ratio)
# 設置窗口句柄
def set_window(self, wm_id):
if platform.system() == 'Windows':
self.media.set_hwnd(wm_id)
else:
self.media.set_xwindow(wm_id)
# 注冊監聽器
def add_callback(self, event_type, callback):
self.media.event_manager().event_attach(event_type, callback)
# 移除監聽器
def remove_callback(self, event_type, callback):
self.media.event_manager().event_detach(event_type, callback)
import tkinter as tk
class App(tk.Tk):
def __init__(self):
super().__init__()
self.player = Player()#"--audio-visual=visual","--effect-list=scope", "--effect-fft-window=flattop"
self.title("流媒體播放器")
# self.create_video_view()
# self.create_control_view()
self._canvas = tk.Canvas(self, bg="black")
self._canvas.pack()
self.player.set_window(self._canvas.winfo_id())
self.player.play("rtmp://192.168.1.3:1935/rtmp/test")
def create_video_view(self):
self._canvas = tk.Canvas(self, bg="black")
self._canvas.pack()
self.player.set_window(self._canvas.winfo_id())
# def create_control_view(self):
# frame = tk.Frame(self)
# tk.Button(frame, text="播放", command=lambda: self.click(0)).pack(side=tk.LEFT, padx=5)
# tk.Button(frame, text="暫停", command=lambda: self.click(1)).pack(side=tk.LEFT)
# tk.Button(frame, text="停止", command=lambda: self.click(2)).pack(side=tk.LEFT, padx=5)
# frame.pack()
# def click(self, action):
# if action == 0:
# if self.player.get_state() == 0:
# self.player.resume()
# elif self.player.get_state() == 1:
# pass # 播放新資源
# else:
# self.player.play("rtmp://192.168.1.3:1935/rtmp/test")
# elif action == 1:
# if self.player.get_state() == 1:
# self.player.pause()
# else:
# self.player.stop()
import sys,win32gui
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QPainter, QColor, QFont
from PyQt5 import QtCore
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(776, 519)
self.frame = QFrame(Form)
self.frame.setGeometry(QtCore.QRect(50, 30, 200, 200))
self.frame.setStyleSheet("background-color: rgb(85, 255, 255);")
self.frame.setFrameShape(QFrame.StyledPanel)
self.frame.setFrameShadow(QFrame.Raised)
self.frame.setObjectName("frame")
self.frame_2 = QFrame(Form)
self.frame_2.setGeometry(QtCore.QRect(60, 280, 221, 141))
self.frame_2.setStyleSheet("background-color: rgb(85, 170, 255);")
self.frame_2.setFrameShape(QFrame.StyledPanel)
self.frame_2.setFrameShadow(QFrame.Raised)
self.frame_2.setObjectName("frame_2")
self.frame_3 = QFrame(Form)
self.frame_3.setGeometry(QtCore.QRect(410, 310, 241, 151))
self.frame_3.setStyleSheet("background-color: rgb(255, 170, 255);")
self.frame_3.setFrameShape(QFrame.StyledPanel)
self.frame_3.setFrameShadow(QFrame.Raised)
self.frame_3.setObjectName("frame_3")
self.pushButton_area_show = QPushButton(Form)
self.pushButton_area_show.setText("123")
self.pushButton_area_show.clicked.connect(self.test)
self.pushButton_area_show = QPushButton(Form)
self.pushButton_area_show.setText("456")
self.pushButton_area_show.setGeometry(QtCore.QRect(70, 270, 100, 100))
self.pushButton_area_show.clicked.connect(self.test2)
self.player = Player("--network-caching=0")#"--audio-visual=visual","--effect-list=scope", "--effect-fft-window=flattop"
self.player.set_window(self.frame.winId())
# self.player.play("rtmp://192.168.1.3:1935/rtmp/test")
# self.player.play("rtmp://192.168.1.5:1935/live/test3")
# self.player.play("rtsp://admin:castle12345@192.168.1.120:554/LiveMedia/ch1/Media1")
self.player.play("rtsp://admin:hik12345@192.168.1.64:554/h264/ch01/sub/av_stream")
# calc_hwnd = win32gui.FindWindow(None, u"rtmp://192.168.1.3:1935/rtmp/test")
# print(calc_hwnd)
# _h = self.frame.winId()
# print(_h)
# win32gui.SetParent(calc_hwnd, _h)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
def test(self):
print(1)
self.player.stop()
def test2(self):
print(2)
self.player.play("rtmp://192.168.1.3:1935/rtmp/test")
class App2(QWidget,Ui_Form):
def __init__(self):
super(App2,self).__init__()
self.setupUi(self)
if "__main__" == __name__:
# app = App()
# app.mainloop()
app = QApplication(sys.argv)
ex = App2()
ex.show()
sys.exit(app.exec_())
代碼說明:
# 設置VLC庫路徑,需在import vlc之前
os.environ['PYTHON_VLC_MODULE_PATH'] = "./VLC"
這段代碼是引入VLC,在項目當前目錄下放入VLC

VLC下載地址:https://www.videolan.org/
可刪除部分不必要文件減少項目體積
import vlc
安裝python-vlc
#這個要先安裝python-vlc
pip install python-vlc
Player是封裝的播放器類直接引用
import tkinter as tk
......
這段代碼是給使用tkinter開發
最后是
PyQt5
安裝教程可參考:https://www.cnblogs.com/wohuiyijiu/p/12454130.html
重要的三行代碼(其余都是繪制控件,不做說明):
self.player = Player("--network-caching=0")#"--audio-visual=visual","--effect-list=scope", "--effect-fft-window=flattop"
self.player.set_window(self.frame.winId())
# self.player.play("rtmp://192.168.1.3:1935/rtmp/test")
# self.player.play("rtmp://192.168.1.5:1935/live/test3")
# self.player.play("rtsp://admin:castle12345@192.168.1.120:554/LiveMedia/ch1/Media1")
self.player.play("rtsp://admin:hik12345@192.168.1.64:554/h264/ch01/sub/av_stream")
初始化播放器->設置句柄(設置在哪個frame播放,這里也不一定是frame,只要控件支持獲取句柄應該都能播放)->傳入播放地址播放
代碼沒有整理(界面和操作分離),有很多注釋部分也有參考價值,告辭!
