Python 스 트림 미디어 플레이어 구현(VLC 기반)

인터넷 에서 Python 에 관 한 음성 영상 재생 예 시 는 모두 간단 한 멀티미디어 라 이브 러 리 나 PyGame 같은 게임 라 이브 러 리 에 집중 되 어 있 으 며,어떤 라 이브 러 리 는 사용 이 간단 하지만 기능 이 단일 하고,어떤 라 이브 러 리 는 기능 이 풍부 하 며,지원 하 는 형식 이 많 지만 사용 이 번거롭다.기능 이 풍부 하고 전면적 이 며 사용 이 간단 하 며 스 트 리밍 을 지원 할 수 있 는 라 이브 러 리 가 있 을 까?답 은 있 습 니 다.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 레 지 스 트 를 조회 하 는 방식 으로 경 로 를 검색 하고 VLCdll 동적 라 이브 러 리 를 불 러 온 것 을 알 수 있다.그러나 그 중에서 환경 변 수 를 설정 하 는 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 의 감청 기 는 실제로 매우 많 습 니 다.흔히 볼 수 있 는 것 은 다음 과 같 습 니 다.
  • MediaPlayerNothing Special:vlc 는 빈 상태 입 니 다.명령 을 기다 리 고 있 을 뿐
  • 미디어 플레이어 열기:vlc 에서 미디어 자원 위치 결정 기(MRL)
  • 을 열 고 있 습 니 다.
  • MediaPlayerBuffering(int cache):vlc 가
  • 을 버퍼 링 하고 있 습 니 다.
  • MediaPlayerPlaying:vlc 에서 미디어
  • 을 재생 하고 있 습 니 다.
  • MediaPlayerPaused:vlc 가 일시 정지 상태 에 있 음
  • MediaPlayerStopped:vlc 정지 상태
  • MediaPlayer Forward:vlc 미디어 를 통 해 빨리 들 어가 기(이것 은 영원히 호출 되 지 않 습 니 다)
  • MediaPlayerBackward:vlc 가 빠 른 속도 로 물 러 나 고 있 습 니 다(이것 은 영원히 호출 되 지 않 습 니 다)
  • MediaPlayerEncountered 오류:vlc 에 오류 가 발생 하여
  • 을 계속 할 수 없습니다.
  • MediaPlayerEndReached:vlc 가 현재 재생 목록 의 끝 에 도 착 했 습 니 다
  • MediaPlayerTimeChanged:시간 변화
  • MediaPlayerPosition 변경:진도 변경
  • MediaPlayerSeekable Changed:스 트림 미디어 가 검색 가능 한 상태 가 바 뀌 었 는 지 여부(true 는 검색 가능,false 는 검색 불가)
  • MediaPlayerPausable Changed:미디어 일시 정지 가능 상태 변경 여부(true 는 일시 정지 가능,false 는 일시 정지 불가)
  • MediaPlayerMediaChanged:미디어 변경
  • MediaPlayerTitle Changed:제목 변경(DVD/Blu-ray)
  • MediaPlayerChapterChanged:장절 변경(DVD/Blu-ray)
  • MediaPlayerLengthChanged:(vlc 버 전<2.2.0 에서 Mozilla 에 만 적용)길이 가
  • 변경 되 었 습 니 다.
  • MediaPlayerVout:영상 출력의 수량 이 변경 되 었 습 니 다
  • MediaPlayerMuted:음소 거
  • MediaPlayerUnmuted:음소 거 취소
  • 미디어 플레이어 오디 오 볼 륨:볼 륨 변경
  • 지원 하 는 모든 모니터 를 보 려 면 공식 문서 에 방문 하여 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 기반)에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 파 이 썬 스 트림 미디어 재생 기 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기