我想编写一个必须通过QT UdpSocket
接收udp数据包的应用程序,数据包包含元数据和视频。
视频数据与ffmpeg udp
流相同。
我划分了这些数据包并选择了视频数据,现在我想将这些视频数据放入AVpacket
,解码并显示在窗口中。
所以我从udp socket获得Qbytearray
并且不知道如何将其转换为AVpacket
。
(当我将此Qbytearray
写入文件时,我有适当的视频文件,因此数据很好)
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没有做好准备
答案 0 :(得分:0)
为了得到一个我不得不把几个(10-15)数据包放到avcodec_decode(所以开始frameFinished == 0),然后我得到适当的帧。
解决方案是在memcpy之后设置Spacket.size = CDatagrams.size
因此,在初始化之后,我们必须做的最小工作是
avcodec_decode将返回正确的Frame
对不起,我问了不完整的问题(没有错误代码)。 感谢