作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想编写一个必须通过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);
}
}
最佳答案
为了取回一个,我不得不将几个(10-15)个数据包放入 avcodec_decode (所以从 frameFinished ==0 开始),然后我得到了正确的帧。
解决方案是在 memcpy 之后设置 Spacket.size = CDatagrams.size
所以在初始化之后,我们要做的最少的工作是
关于qt - 如何将 QUdp 数据包放入 AVPacket/FFmpeg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24138185/
我是一名优秀的程序员,十分优秀!