如何将QUdp数据包放入AVPacket / FFmpeg

时间:2014-06-10 10:04:47

标签: qt video ffmpeg

我想编写一个必须通过QT UdpSocket接收udp数据包的应用程序,数据包包含元数据和视频。

视频数据与ffmpeg udp流相同。

我划分了这些数据包并选择了视频数据,现在我想将这些视频数据放入AVpacket,解码并显示在窗口中。

所以我从udp socket获得Qbytearray并且不知道如何将其转换为AVpacket。 (当我将此Qbytearray写入文件时,我有适当的视频文件,因此数据很好)

每次收到UDP数据包时都会调用 procFrame。在构造函数中,我有编解码器初始化和其他初始化的东西。 Cdatagrams包含一帧视频(关键帧或差分帧)。编解码器是mpeg2

    void myThread::procFrame()
    {
        findex++;
        if(av_read_frame(pFormatCtx,&packet)<0)///now pFormatCtx pointing to file on disk
            qDebug()<<"avreadframe failed";

        Spacket.data = new uint8_t[Cdatagrams.size()];///Spacket is empty packet that I want to fill by Qbytearray Cdatagrams 

        memcpy(Spacket.data,Cdatagrams.data_ptr(),Cdatagrams.size());////here is the problem

        int framecount;
        int frameFinished;

        avcodec_decode_video2(pCodecCtx,pFrame,&frameFinished,&Spacket);
            qDebug()<<  "framefinished " <<frameFinished;

        if (frameFinished)
        {
            img_convert(pFrameRGB,pFrame,pCodecCtx);
            int  y;
            QImage img = QImage(width, height, QImage::Format_RGB888);

            // Write pixel data
            for(y=0; y<height; y++)
                memcpy(img.scanLine(y), pFramew->data[0]+y*pFramew->linesize[0], width*3);

            emit frameReady(img);
        }

    }

在这个版本中我有frameFinished == 0所以Spacket没有做好准备

1 个答案:

答案 0 :(得分:0)

为了得到一个我不得不把几个(10-15)数据包放到avcodec_decode(所以开始frameFinished == 0),然后我得到适当的帧。

解决方案是在memcpy之后设置Spacket.size = CDatagrams.size

因此,在初始化之后,我们必须做的最小工作是

  1. av_init_packet
  2. 使用套接字
  3. 中的数据填充packet.data
  4. set packet.size
  5. avcodec_decode将返回正确的Frame

    对不起,我问了不完整的问题(没有错误代码)。 感谢