open license gratis full descargar creator c++ qt ffmpeg qtmultimedia

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:

  1. Escriba una clase de reproductor multimedia personalizado que demuestre y decodifique el video usando ffmpeg , implemente el tiempo, use QAudioOutput para reproducir el audio, produzca una secuencia de QVideoFrame 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 el QMediaPlayer "real".

  2. Demux el archivo de entrada y alimente QMediaPlayer con las secuencias AV. Demux la entrada con ffmpeg (posiblemente dejando la decodificación en el backend Qt), tenga un servicio QIODevice para recuperar solo las secuencias de video / audio del archivo de entrada y otro para recuperar la secuencia de datos. Reproduzca el video / audio con QMediaPlayer .

    +-------+ | 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