【发布时间】: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 重新调整?下次提问前请检查错误码。