Python 스 트림 미디어 플레이어 구현(VLC 기반)
VLC
이 바로 오늘 우리 의 주인공 이다.홈 페이지 주소:클릭홈 페이지 의 소개 에 따 르 면 이것 은 자 유 롭 고 개 원 된 크로스 플랫폼 멀티미디어 플레이어 와 프레임 워 크 로 대부분의 멀티미디어 형식 과 각종 스 트 리밍 협 의 를 전면적으로 지원 한다.로 컬 오디 오 영상 파일 도 재생 할 수 있 고 각종 스 트 리밍 미디어 자원 도 온라인 으로 재생 할 수 있다 는 것 이다.
이것 은 현재 인터넷 에서 가장 전면적 인
VLC
의 Python 언어 바 인 딩 에 관 한 사용 튜 토리 얼 입 니 다.저 는 API 문 서 를 조회 하고 문서 에서 Python 언어 바 인 딩 의 사용 방법 을 직접 추출 했 습 니 다.이 편 은 Windows 플랫폼 을 위주 로 합 니 다.만약 에 독자 친구 가 유용 하 다 고 생각 되면 칭찬 과 지 지 를 누 르 십시오!환경 준비
VLC 설치
VLC
은 실제 적 으로 비교적 유명한 오픈 소스 멀티미디어 재생 기 입 니 다.이 라 이브 러 리 를 사용 하려 면 먼저 컴퓨터 에 VLC
을 설치 해 야 합 니 다.우 리 는 상기 홈 페이지 에서 직접 다운로드 하고 설치 할 수 있 습 니 다.특히 주의해 야 할 것 은 로 컬 에 설 치 된 Python 이 32 비트 라면 32 비트 의 VLC
,64 비트 에서 64 비트 의 VLC
을 다운로드 해 야 합 니 다.Python 버 전과 대응 해 야 합 니 다.그렇지 않 으 면 사용 할 수 없습니다.사실 나 는 이렇게 직접 설치 하 는 것 을 추천 하지 않 는 다.만약 에 우리 가 Python 을 사용 하여
VLC
기반 재생 기 를 개발 하여 발표 하면 사용자 에 게 사용 하기 전에 VLC
재생 기 를 설치 하 라 고 요구 하 는 것 은 황당 하지 않 습 니까?그렇다면 어떻게 VLC
을 Python 프로그램 에 통합 하 느 냐 가 문제 다.이 문제 에 대해 서 는 관련 자 료 를 찾 지 못 했 습 니 다.python-vlc 바 인 딩 된 소스 코드 를 통 해 방법 을 찾 을 수 있 습 니 다.
python-vlc 바 인 딩 설치
VLC
은 순수 C 언어 개발 의 프레임 워 크 입 니 다.Python 이 더 간단 한 호출 을 하려 면 python-vlc 바 인 딩 을 설치 해 야 합 니 다.사실은 vlc.py
모듈 입 니 다.VLC
동적 라 이브 러 리 의 인 터 페 이 스 를 봉 하여 더욱 간단하게 사용 할 수 있 습 니 다.
python -m pip install python-vlc
설 치 를 마 친 후에 우 리 는 site-packages
에서 vlc.py
소스 코드 를 찾 아 VLC
동적 라 이브 러 리 에 대한 로드 코드 를 살 펴 보면 Windows 시스템 에서 vlc.py
은 Windows 레 지 스 트 를 조회 하 는 방식 으로 경 로 를 검색 하고 VLC
의 dll
동적 라 이브 러 리 를 불 러 온 것 을 알 수 있다.그러나 그 중에서 환경 변 수 를 설정 하 는 PYTHON_VLC_MODULE_PATH
의 로드 방식 도 제공 했다.그러면 우 리 는 가능 한 한 vlc.py
소스 코드 를 수정 하지 않 는 전제 에서 VLC
동적 라 이브 러 리 의 통합 을 완성 할 수 있다.자,여기까지 만
VLC
의 녹색 설치 면제 버 전 을 다운로드 하면 됩 니 다.제 Python 환경 이 64 비트 이기 때문에 Windows 64 비트 다운로드 주 소 를 알려 드 립 니 다.나 를 지적 하 다 에서 vlc-3.0.6-win64.7z
을 선택 하면 됩 니 다.다운로드 완료 후 디 렉 터 리 압축 을 풀 고 들 어가 서 내용 과 무관 하 게 삭제 하고 다음 파일 을 보관 합 니 다.
그 중에서
plugins
의 내용 이 매우 많 고 122 M 에 달 합 니 다.우 리 는 실제 상황 에 따라 편집 할 수 있 습 니 다.예 를 들 어 우 리 는 오디 오 재생 기 를 만 들 면 그 중의 video 와 관련 된 폴 더 를 삭제 할 수 있 습 니 다.또한 gui 폴 더 도 포함 되 어 있 습 니 다.우 리 는 스스로 인터페이스 를 만들어 야 하기 때문에 gui 안의 qt 와 관련 된 dll 이 필요 하지 않 습 니 다.간단 한 재생 예제
파 이 썬 프로젝트 를 만 들 고 잘 린
vlc-3.0.6
폴 더 를 프로젝트 루트 디 렉 터 리 로 복사 합 니 다.그리고 python 스 크 립 트 를 만 듭 니 다.vlc.py
을 다시 봉인 합 니 다.
import os, time
# VLC , import vlc
os.environ['PYTHON_VLC_MODULE_PATH'] = "./vlc-3.0.6"
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 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)
호출 코드
def my_call_back(event):
print("call:", player.get_time())
if "__main__" == __name__:
player = Player()
player.add_callback(vlc.EventType.MediaPlayerTimeChanged, my_call_back)
#
player.play("http://hd.yinyuetai.com/uploads/videos/common/"
"22970150925A6BB75E20D95798D129EE.flv?sc\u003d17d6a907580e9892"
"\u0026br\u003d1103\u0026vid\u003d2400382\u0026aid\u003d32"
"\u0026area\u003dML\u0026vst\u003d0")
# mp3
# player.play("D:/abc.mp3")
#
while True:
pass
VLC 모니터위의 코드 에서 우 리 는
MediaPlayerTimeChanged
유형의 감청 기 를 등록 하여 재생 시간 이 변 했 을 때 리 셋 하 는 것 을 볼 수 있 습 니 다.my_call_back
은 계속 리 셋 되 는 것 을 볼 수 있 습 니 다.재생 할 때마다 리 셋 되 기 때 문 입 니 다.상기 감청 기 를 제외 하고
VLC
의 감청 기 는 실제로 매우 많 습 니 다.흔히 볼 수 있 는 것 은 다음 과 같 습 니 다.EventType
형식 을 검색 하 십시오.자막
우리 가 상술 한 봉 인 된
Player
류 에 다음 과 같은 방법 을 추가 합 니 다.
def set_marquee(self):
self.media.video_set_marquee_int(vlc.VideoMarqueeOption.Enable, 1)
self.media.video_set_marquee_int(vlc.VideoMarqueeOption.Size, 28)
self.media.video_set_marquee_int(vlc.VideoMarqueeOption.Color, 0xff0000)
self.media.video_set_marquee_int(vlc.VideoMarqueeOption.Position, vlc.Position.Bottom)
self.media.video_set_marquee_int(vlc.VideoMarqueeOption.Timeout, 0)
self.media.video_set_marquee_int(vlc.VideoMarqueeOption.Refresh, 10000)
def update_text(self, content):
self.media.video_set_marquee_string(vlc.VideoMarqueeOption.Text, content)
호출 코드 만 들 기
video_set_marquee_string
函数不仅支持直接传入字符串,还支持"%Y-%m-%d %H:%M:%S"
这种时间格式,运行上述代码后,会在屏幕下方显示当前时间,且每一秒刷新一次。
关于文本的一些属性设置
- VideoMarqueeOption.Color :文本颜色,值为16进制数
- VideoMarqueeOption.Enable:是否开启文本显示,1表示开启
- VideoMarqueeOption.Opacity:文本透明度,0 透明,255 完全不透明
- VideoMarqueeOption.Position:文本显示的位置
- VideoMarqueeOption.Refresh:字符串刷新的间隔(毫秒)对时间格式字串刷新有用
- VideoMarqueeOption.Size:文字大小,单位像素
- VideoMarqueeOption.Text:要显示的文本内容
- VideoMarqueeOption.Timeout:文本停留时间。0表示永远停留(毫秒值)
- VideoMarqueeOption.marquee_X:设置显示文本的x坐标值
- VideoMarqueeOption.marquee_Y:设置显示文本的y坐标值
上面的示例仅仅显示了一个固定的时间字符串,下面我们看一下如何显示连续的字幕
if "__main__" == __name__:
player = Player("--sub-source=marq")
player.play("http://hd.yinyuetai.com/uploads/videos/common/"
"22970150925A6BB75E20D95798D129EE.flv?sc\u003d17d6a907580e9892"
"\u0026br\u003d1103\u0026vid\u003d2400382\u0026aid\u003d32"
"\u0026area\u003dML\u0026vst\u003d0")
player.set_marquee()
i = 0
while True:
# 2
time.sleep(2)
player.update_text(" "+str(i))
i += 1
VLC 의 옵션 매개 변수 설정
'''
args: options
'''
def __init__(self, *args):
if args:
instance = vlc.Instance(*args)
self.media = instance.media_player_new()
else:
self.media = vlc.MediaPlayer()
우 리 는 포장 할 때 특별히 옵션 매개 변수 설정 을 미리 남 겼 습 니 다.그 위 에 자막 을 추가 할 때 "--sub-source=marq"
매개 변 수 를 사 용 했 습 니 다.실제로 VLC
에는 매우 많은 매개 변수 가 있 습 니 다.각종 매개 변수 에 대한 상세 한 소 개 는 공식 자료 을 볼 수 있 습 니 다.만약 영 어 를 보 는 것 이 너무 피곤 하 다 면,여기에 중국어 판 매개 변수 상세 설명 이 하나 더 있다.
오디 오 시각 화
VLC
의 많은 매개 변수 중에서 매우 유용 한 기능 이 있 는데 그것 이 바로 오디 오의 시각 화 를 나타 내 는 것 이다.여기 서 저희 가 스펙트럼 을 예 로 들 면...
if "__main__" == __name__:
player = Player("--audio-visual=visual", "--effect-list=spectrum", "--effect-fft-window=flattop")
player.play("https://api.mlwei.com/music/api/wy/?key=523077333&cache=1&type=url&id=566442496")
while True:
pass
<문자열>
현재 사용 가능 한 효 과 는 dummy,scope,spectrum(스펙트럼),spectrometer(스펙트럼 기기)와 vuMeter 를 포함한다.
--effect-list=
선택 가능 한 값{none,hann,flattop,Blackmanharris,kaiser}Tkinter 에 동 영상 삽입
위의 테스트 코드 는 모두 명령 행 에서 실 행 됩 니 다.실 행 된 후에 창 렌 더 링 영상 을 시 작 했 지만 일시 정지,빠 른 진입,종료,볼 륨 설정 등 을 할 수 없습니다.이것 은 GUI 프로그램 을 쓰 지 않 았 기 때 문 입 니 다.
--effect-fft-window=
은 Python 의 날 카 로 운 그래 픽 라 이브 러 리 로 서 인터페이스 프로그램 을 신속하게 구축 하 는 데 도움 을 줄 수 있 습 니 다.전체 예제 코드 는 다음 과 같다.
import os, platform
# VLC , import vlc
os.environ['PYTHON_VLC_MODULE_PATH'] = "./vlc-3.0.6"
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()
self.title(" ")
self.create_video_view()
self.create_control_view()
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("http://hd.yinyuetai.com/uploads/videos/common/"
"22970150925A6BB75E20D95798D129EE.flv?sc\u003d17d6a907580e9892"
"\u0026br\u003d1103\u0026vid\u003d2400382\u0026aid\u003d32"
"\u0026area\u003dML\u0026vst\u003d0")
elif action == 1:
if self.player.get_state() == 1:
self.player.pause()
else:
self.player.stop()
if "__main__" == __name__:
app = App()
app.mainloop()
마지막 으로 우리 가
tkinter
을 만 들 때 오디 오 시각 화 파 라 메 터 를 지정 하면 다음 과 같 습 니 다.오디 오 를 재생 할 때 Player
에 오디 오 시각 화 스펙트럼 을 표시 합 니 다.
player = Player("--audio-visual=visual",
"--effect-list=spectrum", "--effect-fft-window=flattop")
크로스 플랫폼만약 에 우리 가 Python 으로 크로스 플랫폼 의 재생 기 를 개발 하고 싶다 면 리 눅 스 시스템 에서
self._canvas
바 이 너 리 파일 을 통합 하 는 것 을 추천 하지 않 습 니 다.우 리 는 두 가지 방향 을 가 질 수 있 습 니 다.Ubuntu 에서 우 리 는 호출 명령 을 통 해 온라인 으로 vlc 를 설치 할 수 있 습 니 다.
sudo apt-get install vlc
또 다른 사 고 는 VLC
소스 코드 를 통합 하여 시스템 의 컴 파일 명령 을 호출 하여 컴 파일 하 는 것 이다.보통 Linux 플랫폼 은 VLC
컴 파일 러 와 gcc
구축 도 구 를 가지 고 있 습 니 다.이 방안 은 맥 os 플랫폼 에 도 적용 된다.오디 오 플레이어 항목
블 로 거 는 VLC 를 기반 으로 작 성 된 간단 한 오디 오 재생 기 를 기반 으로 로 컬 오디 오 파일 과 온라인 스 트림 미디어 재생 을 지원 할 수 있 으 며 온라인 인터페이스 에 서 는 왕 이 클 라 우 드 음악 을 사용 할 수 있 습 니 다.전송 문
tkinter 의 인터페이스 프로그램 개발 에 관심 이 있 는 친구,블 로 거들 의 tkinter 입문 부터 실전 영상 까지 을 볼 수 있 습 니 다.
이 플레이어 프로젝트 를 통 해 tkinter 인터페이스 프로 그래 밍 에 대해 상세 하 게 설명 하고 tkinter 사용 중의 각종 구덩이 와 디 테 일 을 강조 합 니 다.
파 이 썬 스 트림 미디어 재생 기의 실현(VLC 기반)에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 파 이 썬 스 트림 미디어 재생 기 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.