Cuando uso la biblioteca FFmpeg para decodificar archivos, cada vez que llamo a la función av_read_frame para obtener un cuadro de datos de video, se devuelven los datos en AVPacket.
Cuando uso la biblioteca FFmpeg para decodificar el archivo, cada vez que llamo a la función av_read_frame obtener un cuadro de datos de video Cuando llamo a la función av_read_frame para obtener un cuadro de datos de video, el campo de datos en el AVPacket devuelto siempre está vacío. ¿Por qué? El siguiente es mi código de procesamiento:
C/C++. código
AVPacket pktData; av_init_packet(&pktData);
Blanco (WAIT_TIMEOUT == WaitForSingleObject(m_hExitEvent,0); av_init_packet(&pktData)); WAIT_TIMEOUT == WaitForSingleObject(m_h hExitEvent,0))
{
if (WAIT_OBJECT_0 == WaitForSingleObject(m_hPauseEvent,INFINITE))
{
//Obtener un cuadro de datos
if (av_ read_frame(&m_stFileEncodeInfo.videoFormatCtx,&pktData)>=0)
{ //determinar si es el cuadro de video deseado datos
if (pktData.stream_index == m_ stFileEncodeInfo.nVideoStreamNum)
{ AVFrame *pFrame; pFrame=avcodec_alloc_frame();
//Decodificar if ( avcodec_decode_video(&m_ stFileEncodeInfo.videoCodecCtx,pFrame,&nGopPicture,pktData.data,pktData.size)> 0)
{ if (nGopPicture > 0)
{ //Procesa el YUV decodificado data...}}}
av_free_packet(&pktData); } }
av_free_packet(&pktData); }}}}
Estoy procesando un formato ts Archivo que contiene un audio y un vídeo. Mientras realizaba las pruebas, descubrí que cada llamada a av_read_frame devuelve 0 y pktData.size es de tamaño normal, pero pktData.data siempre está vacío, excepto la primera vez. Pero pktData.data siempre está vacío excepto la primera vez. Cuando esté vacío, llamar al programa avcodec_decode_video informará un error.
¿Ayúdenme a descubrir qué hay de malo en este método de llamada?
Además, quiero preguntarte, siempre que sigas llamando a la función av_read_frame en un bucle, puedes leer el archivo secuencialmente, ¿verdad? No necesita llamar a fread u otras funciones para leer una determinada parte del archivo, luego asignar los datos leídos a pktData.data y volver a llamar a la función av_read_frame, ¿verdad?
Nota: Antes de esto, se llamaba a av_open_input_file, av_find_stream_info y avcodec_find_decoder. Esto significa que se ha obtenido el formato de codificación de audio y vídeo y la información de decodificación.