QMediaPlayer. 여러 오디오로 비디오를 재생하는 방법은 무엇입니까?

voron.run

두 개의 오디오 트랙이있는 비디오 파일이 있습니다.

  Duration: 01:05:09.12, start: 0.000000, bitrate: 2781 kb/s
    Stream #0:0: Video: mpeg4 (Advanced Simple Profile) (XVID / 0x44495658), yuv420p, 720x400 [SAR 1:1 DAR 9:5], 1998 kb/s, 25 fps, 25 tbr, 25 tbn, 25 tbc
    Stream #0:1: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, 5.1(side), fltp, 384 kb/s
    Stream #0:2: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, 5.1(side), fltp, 384 kb/s

이 코드로 재생 :

self.player = QMediaPlayer()
self.player.setMedia(QMediaContent(QUrl.fromLocalFile(fileName)))
self.player.play()

비디오 및 첫 번째 오디오 트랙이 재생됩니다. 두 번째 오디오 트랙으로 전환해야합니까?

Eyllanesc

@musicamante가 의견에서 지적했듯이 해결책은 QMediaStreamsControl에 액세스하는 것이지만 PyQt5는이를 노출하지 않습니다.

대신 PySide2가이를 노출하고 해결책은 shiboken2를 사용하여 캐스트하는 것입니다.

import os

from PySide2 import QtCore, QtWidgets, QtMultimedia, QtMultimediaWidgets

import shiboken2


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        video_widget = QtMultimediaWidgets.QVideoWidget()
        self.player = QtMultimedia.QMediaPlayer(
            self, QtMultimedia.QMediaPlayer.VideoSurface
        )
        file = os.path.join(os.path.dirname(os.path.realpath(__file__)), "test5.mkv")
        self.player.setMedia(
            QtMultimedia.QMediaContent(QtCore.QUrl.fromLocalFile(file))
        )
        self.player.setVideoOutput(video_widget)
        self.player.play()
        self.setCentralWidget(video_widget)

        control = self.player.service().requestControl(
            "org.qt-project.qt.mediastreamscontrol/5.0"
        )
        qptr = shiboken2.getCppPointer(control)[0]
        self.qcontrol = shiboken2.wrapInstance(qptr, QtMultimedia.QMediaStreamsControl)
        self.resize(640, 480)

    def contextMenuEvent(self, event):
        menu = QtWidgets.QMenu()
        group = QtWidgets.QActionGroup(menu)
        group.setExclusive(True)
        index = 0
        for i in range(self.qcontrol.streamCount()):
            t = self.qcontrol.streamType(i)
            if t == QtMultimedia.QMediaStreamsControl.AudioStream:
                action = menu.addAction("Audio-{}".format(index))
                action.setCheckable(True)
                if self.qcontrol.isActive(i):
                    action.setChecked(True)
                action.setData(i)
                menu.addAction(action)
                index += 1
        action = menu.exec_(self.mapToGlobal(event.pos()))
        if action is not None:
            i = action.data()
            self.qcontrol.setActive(i, True)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

pyqt5의 경우 다음 코드와 함께 sip를 사용해야합니다.

import os

from PyQt5 import QtCore, QtWidgets, QtMultimedia, QtMultimediaWidgets

import sip


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        video_widget = QtMultimediaWidgets.QVideoWidget()
        self.player = QtMultimedia.QMediaPlayer(
            self, QtMultimedia.QMediaPlayer.VideoSurface
        )
        file = os.path.join(os.path.dirname(os.path.realpath(__file__)), "test5.mkv")
        self.player.setMedia(
            QtMultimedia.QMediaContent(QtCore.QUrl.fromLocalFile(file))
        )
        self.player.setVideoOutput(video_widget)
        self.player.play()
        self.setCentralWidget(video_widget)

        control = self.player.service().requestControl(
            "org.qt-project.qt.mediastreamscontrol/5.0"
        )
        self.qcontrol = sip.cast(control, QtMultimedia.QMediaStreamsControl)
        self.resize(640, 480)

    def contextMenuEvent(self, event):
        menu = QtWidgets.QMenu()
        group = QtWidgets.QActionGroup(menu)
        group.setExclusive(True)
        index = 0
        for i in range(self.qcontrol.streamCount()):
            t = self.qcontrol.streamType(i)
            if t == QtMultimedia.QMediaStreamsControl.AudioStream:
                action = menu.addAction("Audio-{}".format(index))
                action.setCheckable(True)
                if self.qcontrol.isActive(i):
                    action.setChecked(True)
                action.setData(i)
                menu.addAction(action)
                index += 1
        action = menu.exec_(self.mapToGlobal(event.pos()))
        if action is not None:
            i = action.data()
            self.qcontrol.setActive(i, True)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

그러나 QMediaStreamsControl이 지적했듯이 PyQt5에서는 사용할 수 없으므로 해결책은 노출하는 것이며이를 위해 다음을 수행해야합니다.

  1. PyQt5 소스 코드 다운로드 : https://pypi.python.org/packages/source/P/PyQt5/PyQt5-5.14.2.tar.gz
  2. PyQt5 소스 코드의 "sip / QtMultimedia"폴더에 qmediastreamscontrol.sip 파일을 생성합니다.

    qmediastreamscontrol.sip

    class QMediaStreamsControl : QMediaControl
    {
    %TypeHeaderCode
    #include <qmediastreamscontrol.h>
    %End
    
    public:
        enum StreamType { 
            UnknownStream, 
            VideoStream, 
            AudioStream, 
            SubPictureStream, 
            DataStream 
        };
    
        virtual ~QMediaStreamsControl();
        virtual int streamCount() = 0;
        virtual QMediaStreamsControl::StreamType streamType(int streamNumber) = 0;
        virtual QVariant metaData(int streamNumber, const QString &key) = 0;
        virtual bool isActive(int streamNumber) = 0;
        virtual void setActive(int streamNumber, bool state) = 0;
    
    signals:
        void streamsChanged();
        void activeStreamsChanged();
    
    protected:
    %If (Qt_5_6_1 -)
        explicit QMediaStreamsControl(QObject *parent /TransferThis/ = 0);
    %End
    %If (- Qt_5_6_1)
        QMediaStreamsControl(QObject *parent /TransferThis/ = 0);
    %End
    };
    
  3. %Include qmediastreamscontrol.sipsip / QtMultimedia / QtMultimediamod.sip 파일 끝에 추가

  4. 수정 된 소스 코드를 사용하여 PyQt5를 컴파일하고 설치합니다.

결론적으로:

  • pyside2를 사용하는 경우 솔루션은 간단합니다.

  • pyqt5를 사용하는 경우 소스 코드를 수정하고 컴파일하고 설치해야합니다. @musicamante 보고서 클래스를 통해 QMediaStreamsControl이 pyqt5의 향후 릴리스에 노출되기를 바랍니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

QMediaPlayer. 여러 오디오로 비디오를 재생하는 방법은 무엇입니까?

분류에서Dev

여러 비디오 스트림으로 비디오를 재생하는 방법은 무엇입니까?

분류에서Dev

비디오 5.12 qt qml을 사용하여 비디오를 재생하는 방법은 무엇입니까?

분류에서Dev

React Native에서 React Native 비디오로 여러 비디오를 표시하는 방법은 무엇입니까?

분류에서Dev

서로를 멈추는 여러 오디오 재생 버튼을 추가하는 방법은 무엇입니까?

분류에서Dev

여러 비디오를 나란히 동기화하여 재생하는 방법은 무엇입니까?

분류에서Dev

다른 오디오 트랙으로 비디오를 재생하는 방법은 무엇입니까?

분류에서Dev

PHP를 사용하여 비디오를 여러 패킷으로 분할하는 방법은 무엇입니까?

분류에서Dev

JavaScript를 사용하여 Dailymotion에서 비디오를 재생하는 방법은 무엇입니까?

분류에서Dev

iOS에서 OpenGL을 사용하여 비디오를 재생하는 방법은 무엇입니까?

분류에서Dev

Android 프로젝트에서 여러 이미지 / 비디오를 선택하는 방법은 무엇입니까?

분류에서Dev

여러 라이브 스트림 오디오 재생을 방지하는 방법은 무엇입니까?

분류에서Dev

비디오 파일에서 여러 오디오 트랙을 혼합하고 재생하는 방법은 무엇입니까?

분류에서Dev

amr 오디오를 재생하는 방법, QMediaPlayer가 지원하지 않습니까?

분류에서Dev

오디오 파일을 재생하기 위해 오디오 경로를 얻는 방법은 무엇입니까?

분류에서Dev

youtube-dl로 여러 비디오 재생 목록을 다운로드하고 반복적 인 재확인을 피하는 방법은 무엇입니까?

분류에서Dev

다른 오프셋에서 ffmpeg를 사용하여 오디오와 비디오를 하나의 파일로 결합하는 방법은 무엇입니까?

분류에서Dev

ffmpeg를 사용하여 두 개의 서로 다른 비디오로 하나의 비디오를 오버레이하는 방법은 무엇입니까?

분류에서Dev

js 오디오 API로 여러 오디오를 재생하는 방법

분류에서Dev

VB.Net을 사용하여 다음 오디오를 재생하는 방법은 무엇입니까?

분류에서Dev

iBeacon 감지 후 비디오를 재생하는 방법은 무엇입니까?

분류에서Dev

Xuggler를 사용하여 비디오를 오디오로 채우기 위해 짧은 배열의 길이를 찾는 방법은 무엇입니까?

분류에서Dev

여러 오디오 장치를 서라운드로 사용하는 방법은 무엇입니까?

분류에서Dev

URLSession을 사용하여 비디오를 다운로드하고 appcelerator titanium에서 저장하고 재생하는 방법은 무엇입니까?

분류에서Dev

iOS에서 AVAsset을 사용하여 여러 비디오를 병합하는 방법은 무엇입니까?

분류에서Dev

여러 비디오 파일을 오버레이하고 모든 오디오를 ffmpeg와 병합하는 방법은 무엇입니까?

분류에서Dev

Android에서 .mov 포 메이트로 uri를 사용하여 온라인 비디오를 재생하는 방법은 무엇입니까?

분류에서Dev

PHP를 사용하여 다른 웹 사이트의 비디오를 내 웹 사이트로 재생하는 방법은 무엇입니까?

분류에서Dev

오디오 및 비디오 필터를 사용하여 웹 페이지에 비디오를 표시하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    QMediaPlayer. 여러 오디오로 비디오를 재생하는 방법은 무엇입니까?

  2. 2

    여러 비디오 스트림으로 비디오를 재생하는 방법은 무엇입니까?

  3. 3

    비디오 5.12 qt qml을 사용하여 비디오를 재생하는 방법은 무엇입니까?

  4. 4

    React Native에서 React Native 비디오로 여러 비디오를 표시하는 방법은 무엇입니까?

  5. 5

    서로를 멈추는 여러 오디오 재생 버튼을 추가하는 방법은 무엇입니까?

  6. 6

    여러 비디오를 나란히 동기화하여 재생하는 방법은 무엇입니까?

  7. 7

    다른 오디오 트랙으로 비디오를 재생하는 방법은 무엇입니까?

  8. 8

    PHP를 사용하여 비디오를 여러 패킷으로 분할하는 방법은 무엇입니까?

  9. 9

    JavaScript를 사용하여 Dailymotion에서 비디오를 재생하는 방법은 무엇입니까?

  10. 10

    iOS에서 OpenGL을 사용하여 비디오를 재생하는 방법은 무엇입니까?

  11. 11

    Android 프로젝트에서 여러 이미지 / 비디오를 선택하는 방법은 무엇입니까?

  12. 12

    여러 라이브 스트림 오디오 재생을 방지하는 방법은 무엇입니까?

  13. 13

    비디오 파일에서 여러 오디오 트랙을 혼합하고 재생하는 방법은 무엇입니까?

  14. 14

    amr 오디오를 재생하는 방법, QMediaPlayer가 지원하지 않습니까?

  15. 15

    오디오 파일을 재생하기 위해 오디오 경로를 얻는 방법은 무엇입니까?

  16. 16

    youtube-dl로 여러 비디오 재생 목록을 다운로드하고 반복적 인 재확인을 피하는 방법은 무엇입니까?

  17. 17

    다른 오프셋에서 ffmpeg를 사용하여 오디오와 비디오를 하나의 파일로 결합하는 방법은 무엇입니까?

  18. 18

    ffmpeg를 사용하여 두 개의 서로 다른 비디오로 하나의 비디오를 오버레이하는 방법은 무엇입니까?

  19. 19

    js 오디오 API로 여러 오디오를 재생하는 방법

  20. 20

    VB.Net을 사용하여 다음 오디오를 재생하는 방법은 무엇입니까?

  21. 21

    iBeacon 감지 후 비디오를 재생하는 방법은 무엇입니까?

  22. 22

    Xuggler를 사용하여 비디오를 오디오로 채우기 위해 짧은 배열의 길이를 찾는 방법은 무엇입니까?

  23. 23

    여러 오디오 장치를 서라운드로 사용하는 방법은 무엇입니까?

  24. 24

    URLSession을 사용하여 비디오를 다운로드하고 appcelerator titanium에서 저장하고 재생하는 방법은 무엇입니까?

  25. 25

    iOS에서 AVAsset을 사용하여 여러 비디오를 병합하는 방법은 무엇입니까?

  26. 26

    여러 비디오 파일을 오버레이하고 모든 오디오를 ffmpeg와 병합하는 방법은 무엇입니까?

  27. 27

    Android에서 .mov 포 메이트로 uri를 사용하여 온라인 비디오를 재생하는 방법은 무엇입니까?

  28. 28

    PHP를 사용하여 다른 웹 사이트의 비디오를 내 웹 사이트로 재생하는 방법은 무엇입니까?

  29. 29

    오디오 및 비디오 필터를 사용하여 웹 페이지에 비디오를 표시하는 방법은 무엇입니까?

뜨겁다태그

보관