c++ - license - Reproducción de una secuencia de datos avi personalizada con QtMultimedia
qt license (2)
Necesito reproducir un archivo AVI personalizado que contenga una transmisión de video clásica, una transmisión de audio pero también una transmisión de datos personalizada .
La secuencia personalizada contiene datos que son visualizados por algunos widgets personalizados; esos widgets solo necesitan que cada cuadro personalizado se escriba en un búfer en el momento adecuado.
Nuestra aplicación se basa en Qt y ya usa
QMediaPlayer
/
QVideoWidget
para reproducir videos tradicionales, pero la transmisión personalizada adicional hace las cosas más complicadas, porque AFAIK
QMediaPlayer
solo reproduce el video / audio e ignora todo lo demás.
Me gustaría evitar reinventar todo el
qt-multimedia
, pero no estoy seguro de cómo aprovechar al máximo las clases de Qt disponibles.
Mis ideas hasta ahora son:
-
Escriba una clase de reproductor multimedia personalizado que demuestre y decodifique el video usando
ffmpeg
, implemente el tiempo, useQAudioOutput
para reproducir el audio, produzca una secuencia deQVideoFrame
s para reproducir en el video y escriba los datos personalizados en algún búfer para visualización.El problema : para evitar escribir el código para reescalar / convertir los cuadros de video, me gustaría reutilizar
QVideoWidget
, pero parece funcionar solo con elQMediaPlayer
"real". -
Demux el archivo de entrada y alimente
QMediaPlayer
con las secuencias AV. Demux la entrada conffmpeg
(posiblemente dejando la decodificación en el backend Qt), tenga un servicioQIODevice
para recuperar solo las secuencias de video / audio del archivo de entrada y otro para recuperar la secuencia de datos. Reproduzca el video / audio conQMediaPlayer
.+-------+ | QFile | +---^---+ | inherits | +--------------------+ | MyAviDemuxer | | | | holds a queue of | | demuxed packets | +--------------------+ | | readDataPacket readVideoPacket | | +-------v--------+ +--------v-----------+ +-----------+ | MyCustomReader | | MyVideoAudioStream +--inherits--> QIODevice | +----------------+ +--------+-----------+ +-----------+ | setMedia | +-------v-------+ | QMediaPlayer | +---------------+
El problema : sincronice el tiempo de la secuencia de datos con
QMediaPlayer
, maneje los encabezados y metadatos correctamente.
Estoy un poco inclinado a la opción 1, solo porque me da más control, pero me pregunto si me perdí una solución más fácil (incluso solo para Windows).
Entiendo que tiene una estructura de clase bastante personalizada, pero tal vez podría usar algunos consejos de un novato en codificación. Creo que debería usar algunos tipos de datos existentes más básicos junto con sus clases personalizadas.
Solución para: sincronizar la sincronización del flujo de datos con QMediaPlayer:
Intente usar algunos hilos de temporizador (combinación de
Thread
y
timer
).
Haga uno que use cualquiera que sea el índice de flujo de MyVideoAudioStream (usando el tiempo como la variable en el índice) y "Mycustomreader" (usando una matriz de paquetes con el tiempo como la variable en el índice) como su cuerpo.
Agregue al cuerpo algo de lógica que recorra la posición (@param: time) en QMediaPlayer.
A partir de esto, puede analizar el código de ejecución de ambos al mismo tiempo.
A medida que aumenta el tiempo, la posición en QMediaPlayer y el índice de su transmisión aumentarían.
Si no tiene un índice o posición en su transmisión personalizada, le recomiendo que cree uno.
Parece que Qt en realidad ya admite el concepto de flujos de datos hasta cierto punto: http://doc.qt.io/qt-5/qmediastreamscontrol.html#details muestra que se encuentra entre los tipos de flujos seleccionables para un control qmediastreams.
Otros documentos, incluidos
http://doc.qt.io/qt-5/qmediaserviceproviderplugin.html
sugieren que podría crear un
QMediaServiceProviderPlugin
que implemente interfaces QMediaControl de video y audio (posiblemente subclasificando un proveedor de servicios de medios existente), y también cree el suyo propio
QMediaControl
subclase de la interfaz
QMediaControl
para crear un Control para manejar sus datos sin procesar.
Esperemos que la implementación de esta manera le permita utilizar las instalaciones existentes para dividir las secuencias, manejar encabezados y funcionalidades similares.
Desafortunadamente, los detalles de la construcción de un QMediaService parecen estar "fuera del alcance de esta documentación y se debe buscar soporte en las listas de correo relevantes o canales IRC". ( http://doc.qt.io/qt-5/qmediaservice.html#details ). La fuente ( http://code.qt.io/cgit/qt/qtmultimedia.git/tree/src/multimedia ) podría ser útil, sin embargo, además de, tal vez, la fuente en http://code.qt.io/cgit/qt/qtmultimedia.git/tree/src/plugins , que incluye los complementos directshow / gstreamer / coreaudio.
En cualquier caso, trataría de subclasificar y volver a implementar lo menos posible