Ho bisogno di riprodurre un file AVI personalizzato che contiene un flusso video classico, uno streaming audio ma anche un flusso di dati personalizzato.Riproduzione di un flusso di dati avi personalizzato utilizzando QtMultimedia
Il flusso personalizzato contiene dati visualizzati da alcuni widget personalizzati; questi widget hanno solo bisogno che ciascun frame personalizzato sia scritto in un buffer al momento giusto.
La nostra applicazione è basata su Qt, e usa già QMediaPlayer
/QVideoWidget
per riprodurre i video tradizionali, ma il flusso personalizzato aggiuntivo rende le cose più complicate, perché per quanto ne so QMediaPlayer
riproduce solo il video/audio e ignora tutto il resto.
Vorrei evitare di reinventare l'intero qt-multimedia
, ma non sono sicuro di come sfruttare al meglio le classi Qt disponibili.
Le mie idee finora sono:
Scrivi un supporto personalizzato giocatore classe che demultiplexa e decodifica il video utilizzando
ffmpeg
, implementa i tempi, utilizzaQAudioOutput
per la riproduzione di audio, produce un flusso diQVideoFrame
s da riprodurre sul video e scrivere i dati personalizzati su un buffer per la visualizzazione.Il problema: Al fine di evitare di scrivere il codice per ridimensionare/convertire i fotogrammi video, vorrei riutilizzare
QVideoWidget
, ma sembra funzionare solo con il "vero"QMediaPlayer
.Demi il file di input e feed
QMediaPlayer
con i flussi AV. Demi l'input conffmpeg
(probabilmente lasciando la decodifica al backend Qt), avere unoQIODevice
per recuperare solo i flussi video/audio dal file di input e un altro per recuperare il flusso di dati. Riproduci il video/audio conQMediaPlayer
.+-------+ | QFile | +---^---+ | inherits | +--------------------+ | MyAviDemuxer | | | | holds a queue of | | demuxed packets | +--------------------+ | | readDataPacket readVideoPacket | | +-------v--------+ +--------v-----------+ +-----------+ | MyCustomReader | | MyVideoAudioStream +--inherits--> QIODevice | +----------------+ +--------+-----------+ +-----------+ | setMedia | +-------v-------+ | QMediaPlayer | +---------------+
Il problema: sincronizza la temporizzazione del flusso di dati con
QMediaPlayer
, gestire intestazioni e metadati in modo corretto.
Sono leggermente inclinato all'opzione 1, proprio perché mi dà più controllo, ma mi chiedo se ho perso una soluzione più facile (anche solo per Windows).
Perché, in nome dei stai ancora utilizzando AVI nel 2015? –
@StevenPenny Bozza, motivi legacy e cosa no. Lo cambieremo. La domanda si applica comunque a qualsiasi formato di contenitore multimediale. – sbabbi
Qualsiasi motivo preferisci FFmpeg su GStreamer? – karlphillip