developer tip

QtMultimedia를 사용하여 사용자 지정 avi 데이터 스트림 재생

copycodes 2020. 12. 13. 09:51
반응형

QtMultimedia를 사용하여 사용자 지정 avi 데이터 스트림 재생


클래식 비디오 스트림, 오디오 스트림 및 사용자 지정 데이터 스트림 이 포함 된 사용자 지정 AVI 파일을 재생해야 합니다 .

사용자 정의 스트림에는 일부 사용자 정의 위젯에 의해 시각화되는 데이터가 포함됩니다. 이러한 위젯은 각 사용자 정의 프레임 이 적절한 시간에 버퍼에 작성 되기만하면됩니다.

우리의 응용 프로그램은 Qt를 기반으로하고 이미 QMediaPlayer/ QVideoWidget사용 하여 기존 비디오를 재생하지만 AFAIK QMediaPlayer는 비디오 / 오디오 만 재생하고 다른 모든 것을 무시 하기 때문에 추가 사용자 지정 스트림은 상황을 더 복잡하게 만듭니다 .

전체를 재발 명하는 것을 피하고 qt-multimedia싶지만 사용 가능한 Qt 클래스를 최대한 활용하는 방법을 모르겠습니다.


지금까지 내 아이디어는 다음과 같습니다.

  1. 사용하여 비디오를 디 먹싱 및 디코딩하고 ffmpeg, 타이밍을 구현하고 QAudioOutput, 오디오 QVideoFrame재생에 사용하고, 비디오에서 재생할 s 스트림을 생성하고, 시각화를 위해 사용자 지정 데이터를 버퍼에 쓰는 사용자 지정 미디어 플레이어 클래스를 작성합니다.

    문제 : 비디오 프레임의 크기를 조정 / 변환하는 코드를 작성하지 않으려면 재사용 QVideoWidget하고 싶지만 "실제"에서만 작동하는 것 같습니다 QMediaPlayer.

  2. 입력 파일을 Demux하고 QMediaPlayerAV 스트림으로 피드 합니다. 입력을 Demux ffmpeg(디코딩은 Qt 백엔드로 남길 수 있음)하고 하나 QIODevice는 입력 파일에서 비디오 / 오디오 스트림 만 검색하고 다른 하나는 데이터 스트림을 검색합니다. 로 비디오 / 오디오를 재생합니다 QMediaPlayer.

                  +-------+                          
                  | QFile |                          
                  +---^---+                          
                      |                              
                   inherits                          
                      |                              
            +--------------------+
            |    MyAviDemuxer    |
            |                    |
            |  holds a queue of  |
            |  demuxed packets   |
            +--------------------+
            |                    |
      readDataPacket      readVideoPacket
            |                    |
    +-------v--------+  +--------v-----------+            +-----------+
    | MyCustomReader |  | MyVideoAudioStream +--inherits--> QIODevice |
    +----------------+  +--------+-----------+            +-----------+
                                 |       
                              setMedia                  
                                 |                  
                         +-------v-------+           
                         | QMediaPlayer  |           
                         +---------------+           
    

    문제 : 데이터 스트림의 타이밍을와 동기화하고 QMediaPlayer헤더 및 메타 데이터를 올바르게 처리합니다.


더 많은 제어권을 제공하기 때문에 옵션 1을 약간 선호하지만 더 쉬운 솔루션 (Windows 만 해당)을 놓쳤는 지 궁금합니다.


나는 당신이 꽤 커스터마이징 된 클래스 구조를 가지고 있음을 이해하지만 코딩 초보자의 조언을 사용할 수 있습니다. 사용자 정의 클래스와 함께 더 기본적인 기존 데이터 유형을 사용해야한다고 생각합니다.

해결 방법 : 데이터 스트림의 타이밍을 QMediaPlayer와 동기화 :
타이머 스레드를 사용해보십시오 ( Threadtimer의 조합 ). 스트림 인덱스가 MyVideoAudioStream (인덱스의 변수로 시간 사용)과 "Mycustomreader"(인덱스의 변수로 시간이 포함 된 패킷 배열 사용)를 본문으로 사용하는 것을 만듭니다. QMediaPlayer에서 위치 (@param : time)를 순환하는 로직을 본문에 추가합니다. 이로부터 동시에 두 실행 코드를 파싱 할 수 있습니다. 시간이 증가함에 따라 QMediaPlayer의 위치와 스트림의 인덱스가 증가합니다.

사용자 지정 스트림에 인덱스 나 위치가 없으면 새로 만드는 것이 좋습니다.


Qt는 실제로 데이터 스트림의 개념을 어느 정도 지원하는 것 같습니다. http://doc.qt.io/qt-5/qmediastreamscontrol.html#details 는 qmediastreamscontrol에 대해 선택할 수있는 스트림 유형 중 하나임을 보여줍니다.

를 포함하여 다른 문서 http://doc.qt.io/qt-5/qmediaserviceproviderplugin.html은 당신이 만들 수 있음을 시사 QMediaServiceProviderPlugin구현 비디오와 (아마도 기존 미디어 서비스 제공을 서브 클래스에 의해) 오디오 QMediaControl 인터페이스,는 또한 자신 만드는 것이 QMediaControl인터페이스 원시 데이터를 처리하기위한 Control을 만드는 하위 클래스입니다.

이러한 방식으로 구현하면 스트림 분할, 헤더 처리 및 유사한 기능에 기존 기능을 사용할 수 있기를 바랍니다.

불행히도 QMediaService 구축의 세부 사항은 "이 문서의 범위를 벗어난 것으로 보이며 관련 메일 링리스트 또는 IRC 채널에 대한 지원을 찾아야합니다." ( http://doc.qt.io/qt-5/qmediaservice.html#details ). 소스 ( http://code.qt.io/cgit/qt/qtmultimedia.git/tree/src/multimedia )는이 작업을 수행하는 데 유용 할 수 있지만 http : // 의 소스에 추가로 사용할 수 있습니다 . code.qt.io/cgit/qt/qtmultimedia.git/tree/src/plugins , 여기에는 directshow / gstreamer / coreaudio 플러그인이 포함됩니다.

어쨌든 나는 가능한 한 적게 하위 클래스를 만들고 다시 구현하려고 노력할 것입니다.

참고 URL : https://stackoverflow.com/questions/30005349/playing-a-custom-avi-data-stream-using-qtmultimedia

반응형