我刚加入了一个项目,通过udp socket使用ffmpeg / opencv / c ++构建实时视频流应用程序。在服务器端,他们想要将视频大小(640x480)传输到客户端,以减少通过网络的数据传输我将视频大小调整为(320x240)并发送帧。在客户端(客户端),在接收到帧之后,我们将帧放大回到(640x480)。使用H265进行编码/解码。
由于我只是视频编码的初学者,我想了解如何进行下采样&在服务器上对帧进行上采样&客户端,我们可以与视频编码器/解码器合并。
在解码avframe之后,我想到了一个简单的想法 - > Mat框架,我将对此帧进行上采样然后显示它。
我不确定我的想法是对还是错。我想向在这方面有经验的任何人寻求建议。非常感谢你!
static void updateFrameCallback(AVFrame *avframe, void* userdata) {
VideoStreamUDPClient* streamer = static_cast<VideoStreamUDPClient*> (userdata);
TinyClient* client = static_cast<TinyClient*> (streamer->userdata);
//Update Frame
pthread_mutex_lock(&client->mtx_updateFrame);
if (streamer->irect.width == client->frameSize.width
&& streamer->irect.height == client->frameSize.height) {
cvtAVFrameYUV4202Frame(&avframe, client->frame);
printf("TinyClient: Received Full Frame\n");
} else {
Mat block;
cvtAVFrameYUV4202Frame(&avframe, block);
block.copyTo(client->frame(streamer->irect));
}
//How to resize frame before display it!!!
imshow("Frame", client->frame);
waitKey(1);
pthread_mutex_unlock(&client->mtx_updateFrame);
}
答案 0 :(得分:0)
根据我的理解,您只想在解码后调整帧大小。在opencv中你可以这样做
if(...)
{
...
}
else
{
Mat block;
cvtAVFrameYUV4202Frame(&avframe, block);
Mat temp;
resize(block, temp, 640,480)
temp.copyTo(client->frame(streamer->irect));
}
//client->frame will always have 640x480
imshow("Frame" client->frame);
我在视频解码方面没有太多经验,但据我所知,你不能先调整视频(或单帧),而不先解码。