gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:29:26 26 4
gpt4 key购买 nike

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

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

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

所以我有Qbytearray来自 udp 套接字,不知道如何将其转换为 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 没有正确准备

最佳答案

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

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

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

  • av_init_packet
  • 用套接字中的数据填充 packet.data
  • 设置数据包大小

  • 并且 avcodec_decode 将返回正确的帧

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

    关于qt - 如何将 QUdp 数据包放入 AVPacket/FFmpeg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24138185/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com