Toybrick

标题: 基于FFmpeg h264_rkmpp 解码应用的提问 [打印本页]

作者: DatranShan    时间: 2021-9-14 11:42
标题: 基于FFmpeg h264_rkmpp 解码应用的提问
本帖最后由 DatranShan 于 2021-9-14 11:49 编辑

老师您好:我们的项目需要在开发咱们的板子解码从VLC推出来的UDP流。遇到了“[h264_rkmpp @ 0x7f64f50b40] Received a errinfo frame.”的问题。我看了前面的一个帖子“https://t.rock-chips.com/forum.php?mod=viewthread&tid=2936”f说是丢包的问题。我打印了avcodec_send_packet     的input_packet 记录 和 avcodec_receive_frame    的记录。frame返回的pkt_size 一直=0,    flags 也一直=0。我以为 avcodec_receive_frame 的返回结果  input_frame 的flags应该是2表示AV_PKT_FLAG_CORRUPT 才对。


一旦受到errinfo frame之后,就会收到一连串的这个消息。avcodec_send_packe也会一直返回 Resource temporarily unavailable   

请您帮我看看,谢谢。


  1. while (1)
  2.     {
  3.         AVPacket *input_packet = av_packet_alloc();
  4.         if (!input_packet)
  5.         {
  6.             qDebug("failed to allocated memory for AVPacket");
  7.             return;
  8.         }

  9.         res_send = av_read_frame(decoder->avfc, input_packet);
  10. //        qDebug("Status while %d av_read_frame %s ===%d", send_packet_count++,av_err2str(res_send),res_send);
  11. //        qDebug("Packet size = %d stream_index = %d", input_packet->size,input_packet->stream_index);
  12.         if (res_send<0 ){
  13.             break;
  14.         }
  15. //        stream_index =0 是音频流,1是视频流
  16.         if(input_packet->stream_index == 1){
  17.             //qDebug("input_packet = %d %d",input_packet->size,input_packet->pos);
  18.             qDebug("Packet size = %d stream_index = %d flags =%d", input_packet->size,input_packet->stream_index,input_packet->flags);

  19.             t.restart();
  20.             int response = avcodec_send_packet(decoder->video_avcc, input_packet);
  21.             if (response < 0) {
  22. //            qDebug("Error while sending packet to decoder: %s", av_err2str(response));
  23.                 qDebug("Error <0 while %d sending packet to decoder: %s", send_packet_count++,av_err2str(response));
  24. //            av_packet_unref(input_packet);

  25. //            break;
  26.             }
  27.             response = 0;
  28.             while (response >= 0)
  29.             {
  30.                 receive_frame_count = 0;
  31. //                AVFrame *input_frame = av_frame_alloc();
  32.                 response = avcodec_receive_frame(decoder->video_avcc, input_frame);
  33.                 qDebug("input_frame pkt_size = %d flags =%d", input_frame->pkt_size,input_frame->flags);
  34.                 qDebug("Error while %d avcodec_receive_frame : %s", receive_frame_count++,av_err2str(response));

  35.                 if (response == AVERROR(EAGAIN) || response == AVERROR_EOF)
  36.                 {
  37. //                qDebug("Error == AVERROR_EOF or AVERROR(EAGAIN) while %d avcodec_receive_frame : %s", receive_frame_count++,av_err2str(ret));
  38.                     break;
  39.                 }
  40.                 else if (response < 0)
  41.                 {
  42. //                qDebug("Error <0 while %d avcodec_receive_frame : %s", receive_frame_count++,av_err2str(ret));
  43. //                qDebug("Error while receiving frame from decoder: %s", av_err2str(response));
  44.                     av_frame_unref(input_frame);
  45.                     break;
  46.                 }

  47.                 else if (response >= 0)
  48.                 {

  49. //                qDebug("Error >= 0 while %d avcodec_receive_frame : %s", receive_frame_count++,av_err2str(ret));

  50.                     //qDebug("DECODER SUCESS %d %d %d",input_frame->format,input_frame->width,
  51.                     //      input_frame->height);

  52.                     // retrieve data from GPU to CPU
  53.                     int err = av_hwframe_transfer_data(
  54.                             pFrameOK,    // The frame that will contain the usable data.
  55.                             input_frame, // Frame returned by avcodec_receive_frame()
  56.                             0);
  57.                     qDebug("pFrameOK size = %d flags =%d", pFrameOK->pkt_size,pFrameOK->flags);


  58.                     int sws_ret = sws_scale(img_convert_ctx,
  59.                                             pFrameOK->data,
  60.                                             pFrameOK->linesize, 0, decoder->video_avcc->height, pFrameRGB->data,
  61.                                             pFrameRGB->linesize);

  62.                     QImage * tmpImg =new QImage ((uchar *)pFrameRGB->data[0], decoder->video_avcc->width, decoder->video_avcc->height, QImage::Format_RGB32);
  63.                     //qDebug()<<QDateTime::currentDateTime().toString("hh:mm:ss zzz");
  64.                     *tmpImg = tmpImg->scaled(1209, 734, Qt::KeepAspectRatioByExpanding, Qt::FastTransformation);
  65.                     //QImage image = tmpImg.copy(); //把图像复制一份 传递给界面显示
  66.                     //QPixmap pixmaptemp = QPixmap::fromImage(tmpImg);
  67.                     //pixmap.scaled(QSize(1209,723), Qt::KeepAspectRatio);
  68.                     int el = t.elapsed();
  69.                     int interval = 1000 / 25 - el > 0 ? 1000 / 25 - el : 0;
  70.                     //qDebug()<<interval;
  71.                     msleep(interval);

  72.                     emit sig_GetOneFrame(*tmpImg); //发送信号
  73.                     delete tmpImg;
  74.                     av_frame_unref(input_frame);
  75.                 }
  76.             }
  77.         }
  78.         av_packet_unref(input_packet);
  79.         av_packet_free(&input_packet);
  80.     }
复制代码




日志:
  1. mpi: mpp version: 0b701fe author: Lawrence-Tang DEBIAN: prepare for release_20171218-3
  2. mpi: mpp version: 0b701fe author: Lawrence-Tang DEBIAN: prepare for release_20171218-3
  3. hal_h264d_api: hal_h264d_init mpp_buffer_group_get_internal used ion In
  4. mpp_rt: NOT found ion allocator
  5. mpp_rt: found drm allocator
  6. mpi: mpp version: 0b701fe author: Lawrence-Tang DEBIAN: prepare for release_20171218-3
  7. hal_h264d_api: hal_h264d_init mpp_buffer_group_get_internal used ion In
  8. Packet size = 55486 stream_index = 1 flags =1
  9. input_frame pkt_size = -1 flags =0
  10. Error while 0 avcodec_receive_frame : Resource temporarily unavailable
  11. Packet size = 8268 stream_index = 1 flags =0
  12. input_frame pkt_size = -1 flags =0
  13. Error while 0 avcodec_receive_frame : Resource temporarily unavailable
  14. Packet size = 2609 stream_index = 1 flags =0
  15. input_frame pkt_size = -1 flags =0
  16. Error while 0 avcodec_receive_frame : Resource temporarily unavailable
  17. Packet size = 9194 stream_index = 1 flags =0
  18. input_frame pkt_size = -1 flags =0
  19. Error while 0 avcodec_receive_frame : Resource temporarily unavailable
  20. Packet size = 2465 stream_index = 1 flags =0
  21. [h264_rkmpp @ 0x7f34f505c0] Decoder noticed an info change (1920x810), format=0
  22. input_frame pkt_size = -1 flags =0
  23. Error while 0 avcodec_receive_frame : Success
  24. pFrameOK size = -1 flags =0
  25. input_frame pkt_size = -1 flags =0



  26. 。。。。。

复制代码
  1. [h264_rkmpp @ 0x7f34f505c0] Received a errinfo frame.
  2. input_frame pkt_size = -1 flags =0
  3. Error while 0 avcodec_receive_frame : Unknown error occurred
  4. Packet size = 1189 stream_index = 1 flags =0
  5. input_frame pkt_size = -1 flags =0
  6. Error while 0 avcodec_receive_frame : Resource temporarily unavailable
  7. Packet size = 3621 stream_index = 1 flags =0
  8. [h264_rkmpp @ 0x7f34f505c0] Received a errinfo frame.
  9. input_frame pkt_size = -1 flags =0
  10. Error while 0 avcodec_receive_frame : Unknown error occurred
  11. Packet size = 15466 stream_index = 1 flags =0
  12. input_frame pkt_size = -1 flags =0
  13. Error while 0 avcodec_receive_frame : Resource temporarily unavailable
  14. Packet size = 3456 stream_index = 1 flags =0
  15. [h264_rkmpp @ 0x7f34f505c0] Received a errinfo frame.
  16. input_frame pkt_size = -1 flags =0
  17. Error while 0 avcodec_receive_frame : Unknown error occurred
  18. Packet size = 14654 stream_index = 1 flags =0
  19. [h264_rkmpp @ 0x7f34f505c0] Received a errinfo frame.
  20. Error <0 while 4 sending packet to decoder: Unknown error occurred
  21. input_frame pkt_size = -1 flags =0
  22. Error while 0 avcodec_receive_frame : Resource temporarily unavailable
  23. Packet size = 3173 stream_index = 1 flags =0
  24. input_frame pkt_size = -1 flags =0
  25. Error while 0 avcodec_receive_frame : Resource temporarily unavailable
  26. Packet size = 8468 stream_index = 1 flags =0
  27. [h264_rkmpp @ 0x7f34f505c0] Received a errinfo frame.
复制代码





















作者: DatranShan    时间: 2021-9-14 11:44






欢迎光临 Toybrick (https://t.rock-chips.com/) Powered by Discuz! X3.3