【问题标题】:How to put QUdp packets into AVPacket/FFmpeg如何将 QUdp 数据包放入 AVPacket/FFmpeg
【发布时间】:2014-07-31 01:12:31
【问题描述】:

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

视频数据与来自ffmpeg udp 流的数据相同。

我分割了这个包,选择了视频数据,现在我想把这个视频数据放到AVpacket,解码并显示在窗口中。

所以我有来自 udp 套接字的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 没有正确准备

【问题讨论】:

  • 显示您的代码和您遇到的异常,以便我们为您提供帮助...
  • 您的问题可能不止于此,但 avcodec_decode_video2 不一定是一帧一帧输出。您可能需要在返回一帧之前向它提供几帧(通过发送空数据包进行刷新)。此外,还有一个重要的问题,什么是 avcodec_decode_video2 重新调整?下次提问前请检查错误码。

标签: qt video ffmpeg


【解决方案1】:

为了取回一个,我必须将几个 (10-15) 个数据包放入 avcodec_decode(以此类推,从 frameFinished ==0 开始),然后我得到正确的帧。

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

所以在初始化之后我们要做的最少的工作是

  1. av_init_packet
  2. 用来自套接字的数据填充 packet.data
  3. 设置数据包大小

avcodec_decode 将返回正确的帧

很抱歉,我问了不完整的问题(没有错误代码)。 谢谢

【讨论】:

    猜你喜欢
    • 2016-02-18
    • 2012-04-18
    • 2013-05-06
    • 1970-01-01
    • 2018-05-12
    • 2018-03-27
    • 2021-12-09
    • 1970-01-01
    • 2011-11-14
    相关资源
    最近更新 更多