Necesito tener ffmpeg decodificar mi vídeo(por ejemplo, h264) utiliza la aceleración de hardware. Estoy usando la forma habitual de decodificación de imágenes: leer paquetes -> decodificar marco. Y me gustaría tener ffmpeg acelerar la decodificación. Así que hemos construido con --enable-vaapi y --enable-hwaccel=h264. Pero realmente no sé lo que debo hacer a continuación. He intentado utilizar avcodec_find_decoder_by_name("h264_vaapi") pero devuelve nullptr.
De todos modos, yo podría querer usar a los demás de la API y no sólo VA de la API. Cómo se supone que uno debe acelerar ffmpeg decodificación?

P. S. no he encontrado ningún ejemplo en Internet que utiliza ffmpeg con hwaccel.

  • posibles duplicados de el uso de ffmpeg hwaccel de C++
  • respuesta a la mencionada pregunta no resuelve nada. Sólo la creación de hwaccel de códec de contexto no funciona para mí.
  • ¿Qué plataforma está en (es decir, Mac, Windows o Linux; hardware físico o virtual)? ¿Qué tipo de hardware de aceleración de hardware de hacer (pensar) que usted piensa que usted tiene disponible?
  • Mike, tengo ubuntu instalado en el macbook pro(2011) ha GPU de intel
  • ¿Tiene el VAAPI controlador instalado? Hice una búsqueda en mi Ubuntu cuadro con «aptitude search vaapi» y se encuentra GStreamer módulos para VAAPI así como libva-intel-vaapi-controlador. Es que ha instalado en su sistema (con una ‘i’ en la columna de la izquierda)?
  • Mike, sí que me lo creo: me he quedado vainfo y muestra los puntos de entrada para h264 decodificación. También traté de VLC con la aceleración de HARDWARE y disminuye el tiempo de la CPU de manera significativa. ¿Tienes práctico de aplicación de VA-API con ffmpeg?
  • Primero y ante todo, AVHwaccel es nada mas que un esqueleto, así que no esperes fácil implementación con ella. Usted debe buscar en el código fuente de mpv, que es un jugador basado en MPlayer, pero con muchas cosas fijas o limpieza. Tiene un maduro VA-API de decodificación de la característica, y utiliza ffmpeg para que. También puede buscar en VLC de la fuente.

InformationsquelleAutor ixSci | 2014-04-25

1 Comentario

  1. 40

    Después de algunas investigaciones, pude implementar la necesaria HW acelerado de decodificación en OS X (VDA) y Linux (VDPAU). Voy a actualizar la respuesta cuando llego a mis manos en la implementación de Windows también.
    Así que vamos a empezar con el más fácil:

    Mac OS X

    Para obtener la aceleración de HARDWARE de trabajo en Mac OS sólo debes utilizar los siguientes:
    avcodec_find_decoder_by_name("h264_vda");
    Nota, sin embargo, que puede acelerar h264 videos solo en Mac OS con FFmpeg.

    Linux VDPAU

    En Linux las cosas son mucho más complicadas(que se sorprende?). FFmpeg tiene 2 HW aceleradores en Linux: VDPAU(Nvidia) y VAAPI(Intel) y sólo uno HW decodificador: para VDPAU. Y parece perfectamente razonable para el uso vdpau decodificador como en el Mac OS ejemplo anterior:
    avcodec_find_decoder_by_name("h264_vdpau");

    Usted puede ser sorprendido al descubrir que no cambia nada y que no tiene aceleración en todos. Eso es porque es sólo el principio, usted tiene que escribir mucho más código para obtener la aceleración de trabajo. Afortunadamente, usted no tiene que venir para arriba con una solución por sus propios medios: hay al menos 2 buenos ejemplos de cómo lograr que: libavg y FFmpeg sí mismo. libavg ha VDPAUDecoder clase que es perfectamente claro y que he basado mi aplicación. También puede consultar ffmpeg_vdpau.c para conseguir otra aplicación para comparar. En mi opinión el libavg la aplicación sea más fácil de comprender, aunque.

    Las únicas cosas que ambos ejemplos antes mencionados falta es la correcta copia de la decodificado marco para la memoria principal. Ambos ejemplos se utiliza VdpVideoSurfaceGetBitsYCbCr que mató a todo el rendimiento que he ganado en mi máquina. Es por eso que usted podría desear utilizar el siguiente procedimiento para extraer los datos de un GPU:

    Si bien tiene algunos «externo» objetos utilizados dentro de ti debe ser capaz de entender una vez que se hayan implementado las «obtener buffer» de la parte(a la que los ejemplos antes mencionados son de gran ayuda). También he usado BGRA formato más adecuado para mis necesidades tal vez usted se elija otro.

    El problema con todo esto es que usted apenas no puede conseguir trabajo de FFmpeg que usted necesita para comprender al menos lo basico de la VDPAU de la API. Y espero que mi respuesta te ayuda a alguien en la aplicación de la aceleración de HARDWARE en Linux. He pasado mucho tiempo en él a mí mismo antes de que me di cuenta de que no es simple, una línea de ejecución HW acelerado de decodificación en Linux.

    Linux VA-API

    Ya que mi pregunta original era sobre VA-API no puedo dejarlo sin respuesta.
    Primero de todo no hay un decodificador para VA-API en FFmpeg para avcodec_find_decoder_by_name("h264_vaapi") no tiene ningún sentido: es nullptr.
    No sé cuánto más(o tal vez más simple?) es poner en práctica la decodificación a través de VA-API, ya que todos los ejemplos que he visto eran bastante intimidante. Así que opto por no usar VA-API en todo y tuve que implementar la aceleración para una tarjeta Intel. Por suerte para mí, no es un VDPAU biblioteca(conductor?) que funciona a través de VA-API. Así que usted puede utilizar VDPAU en tarjetas Intel!

    Yo he utilizado los siguientes enlace a la configuración de la misma en mi Ubuntu.

    También, es posible que desee comprobar los comentarios a la pregunta original donde @Timothy_G también se ha mencionado que algunos enlaces relacionados con VA-API.

    • aprecio mucho la fuente de ejemplo para Linux y vdpau, en un mundo perfecto, la osx solución que se enumeran funcionaría igual de bien en linux (simplemente la identificación de la intención para la aceleración de hardware sería una maravillosa interfaz).
    • cualquier posibilidad de que usted tiene un ejemplo de agarrar de nuevo un bgra pixel buffer después de aceleración por hardware de descodificación de un fotograma (píxeles formato de vda)
    • usted necesidad de utilizar sws_scale para convertir una trama que se obtiene después de la VDA en el formato que usted necesita.
    • gracias, intentó que la primera, y nos encontramos a: [swscaler @ 0x1033f3800] vda no se admite como entrada el formato de píxel. Se veía aquí de los datos subyacentes leer stackoverflow.com/a/12238071/51700
    • lamentablemente yo no puedo ejecutar el SW he implementado la TAREA de decodificación, así que no se puede comprobar cuál es el problema. Pero he mirado el código y yo no hice nada especial para manejar el marco después de la decodificación: aquí está mi sws contexto de creación: sws_getCachedContext(nullptr, frame->width, frame->height, static_cast<AVPixelFormat>(frame->format), frame->width, frame->height, AV_PIX_FMT_RGB24, SWS_BILINEAR | SWS_ACCURATE_RND, nullptr, nullptr, nullptr);
    • si recuerdo bien yo tenía el mismo problema. Fue porque me han creado sws contexto de una vez en la inicialización. En ese paso, el contexto ha VDA formato de píxel que no tiene sentido sws escarificador. Para tener una correcta píxeles formato que usted necesita para utilizar el cuadro actual formato de píxel para el contexto de creación y usted tendrá derecho después de la decodificación. Espero recordar bien.
    • woohoo, tengo algo de trabajo utilizando el método pero parece que lo uso una vez antes de inicializar… ¡vaya. parches ahora
    • parece como la primera vez o para regresar de avcodec_decode_video2 la pFrame vuelve con un null ->miembro de datos
    • está usted seguro de que son la comprobación de si la trama fue totalmente decodificado? Es el 3er parámetro en avcodec_decode_video2
    • seguro que soy. avcodec_decode_video2(m_pCodecCtx, m_pFrame, &frameFinished,&el paquete); si(frameFinished) { hacer cosas }
    • Corrección: en realidad, ni VAAPI ni VDPAU son exclusivos (al menos para escritorio Gpu — yo no sé acerca de embedded). De hecho VAAPI fue originalmente desarrollada por Intel, pero es compatible con todos los Galio drivers, es decir, al menos Radeon y Nouveau (no oficial del controlador de NVidia, yo no sé acerca de la oficial). Mismo para VDPAU, como se puede ver en el enlace; Intel es no-galio, aunque desde el google parece apoyar de alguna manera también (no se puede confirmar porque no tengo una GPU de Intel).
    • quisiera compartir un enlace o referencia de cómo lograr lo mismo con ffmpeg?
    • ¿a qué te refieres? Esta respuesta es acerca de ffmpeg.
    • ha basado su aplicación en libavg, y usted dijo que era posible hacerlo sin libavg.
    • He basado mi aplicación en lo que me he encontrado en libavg, pero la aplicación en sí no uso nada más allá de la pura ffmpeg. No utilice libavg.
    • queridos @ixSci – puede que le gusta mirar este problema que trata específicamente con nuestro iPhone (no Mac) problema que hemos encontrado … stackoverflow.com/q/54198895/294884 .. gracias por este post

Dejar respuesta

Please enter your comment!
Please enter your name here