在客户端

时间:2018-01-18 11:25:38

标签: opencv

我刚加入了一个项目,通过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);
}

1 个答案:

答案 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);

我在视频解码方面没有太多经验,但据我所知,你不能先调整视频(或单帧),而不先解码。