php空间放两个网站,网站下做二级域名,手机 网站制作,模板建站排版跟没缓存好似的视频拼接融合产品的产品与架构设计一 以上是第一期#xff0c;以前思考的时候还是比较着急#xff0c;现在思考的更多了#xff0c;现实世界的拼接更加需要我们沉下心来做#xff0c;尤其是对于更多画面#xff0c;画面更加清晰怎么做
本篇章不在于其他功能#xff0c;在…视频拼接融合产品的产品与架构设计一 以上是第一期以前思考的时候还是比较着急现在思考的更多了现实世界的拼接更加需要我们沉下心来做尤其是对于更多画面画面更加清晰怎么做
本篇章不在于其他功能在于说明选型和效率问题
重中之重-选型
使用什么硬件 我来清除地阐述现在所有的硬件平台绝无虚言 1 nvidia 英伟达的cuda 英伟达的产品好用主要在于cuda生态同时细节处理丰满运用简单他的gpu解码器和编码器和tensor core 分别为不同的芯片可以流水线处理windows下可以使用dlss 进行超分处理可以同时使用cuda技术解码和directx 11 技术解码vulcan技术解码可以在gpu中直接处理所有算法而不用下放到cpu拼接完成编码完成后发出rtsp流后面我会证明为什么要使用cuda。 2 amd amd的显卡解码在windows下可以直接使用directx11至于其他可以使用opencl 去做这一部分需要熟悉opencl的kernel也是可以的效率会稍稍差一些如果是没有什么选择尽量使用nvidia的夏卡 3 intel 显卡 intel的核显很强大编解码非常厉害同时intel出的独立显卡也是很好用的同样可以使用他的独立显卡如出的arc A750 arcA770都是可用的图像处理也没有问题可以选但是慎重 4 瑞芯微3588 瑞芯微3588 可以用解码芯片和编码芯片也很突出有硬件的rga处理 不过技术文档不友好但是还是可以用记住流程使用rga硬件使用opencl都可以的 5 树莓派 可以硬件解码图像处理可以使用opencl 6 华为昇腾Ascend 暂时对图像处理不友好可以使用opencv高版本进行处理npu可以使用 7 其他国产显卡 暂时不要进行研究处理通用性还没有那么好等待各个图像处理和AI处理都可以了再进行下一步
至于国内的显卡我为什么现在不推荐做因为现在还不成熟而对于amd 和 intel 显卡我们要排在英伟达的后面因为英伟达确实通用性非常强。 以上希望其他研究者学者与我联系如果可能我会尽我所能进行测试分析或者纠正我说的错误
分布式架构 下面我就nvidia显卡进行分析说明cuda的效率
cuda nv12 和 bgr 互相转化
为什么要使用bgr 和 nv12 的转化因为我们都知道大名鼎鼎的opencv处理图像和滤波算法以及AI算法推理可以使用bgr方式这样使用cuda转化使用bgr 和 rgb方式进行AI算法推理和普通算法处理图像结束后立即编码
__global__ void BGR2NV12Kernel(const uchar3* srcBGR, unsigned char* dstY, unsigned char* dstUV, int width, int height, int srcStep, int dstYStep, int dstUVStep) {int x blockIdx.x * blockDim.x threadIdx.x;int y blockIdx.y * blockDim.y threadIdx.y;if (x width y height) {int srcIndex y * srcStep x ;int dstYIndex y * dstYStep x;int dstUVIndex y / 2 * dstUVStep x;// BGR to NV12 conversionuchar3 pixel srcBGR[srcIndex];dstY[dstYIndex] 0.299f * pixel.x 0.587f * pixel.y 0.114f * pixel.z; // Y component//以下为uv分量转化}
}结果出来的图像是这样的 考虑x周横向是3个像素修改一下 int srcIndex y * srcStep x *3; 离目标有点远仔细分析cuda代码应该是这样
uchar3* ppixel (uchar3*)((unsigned char*)srcBGR y * srcStep) x;这下正确了cuda的好用就在于像素并行操作 右边是原图左边是cuda转硬件的bgr 到 nv12再次使用 nv12 转成bgr 进行显示耗费时间我们加几行代码进行计算 double startTime cv::getTickCount();// 在这里执行你需要测量耗时的操作// 例如这里模拟一个延时操作// 记录结束时间double endTime cv::getTickCount();//bgr 转nv12bgr_to_nv12_cuda(reinterpret_castuchar3*(gpu_input_image.data), frame-data[0],frame-data[1], w, h, gpu_input_image.step, frame-linesize[0], frame-linesize[1]);//nv12 转 bgrnv12_to_rgb24_cuda(frame-data[0], frame-data[1], memory, m1.step, frame-linesize[0], frame-linesize[1], frame-width, frame-height, 3);// 计算时间差单位为毫秒double elapsedTimeMs (endTime - startTime) / cv::getTickFrequency() * 1000.0;std::cout Elapsed time in milliseconds: elapsedTimeMs std::endl;nvidia 1650 显卡使用cuda 花费0.946 毫秒1毫秒不到完成2次转化图片太小我们加一个2k的图像进行转化如下所示 花费1.27 毫秒性能开始下降比较危险看看是否能够提高 线程块修改 dim3 block(16, 16); dim3 block(32, 32); 基本上提高了一点不大4k画面估计要到2-3毫秒我们再次测试一下 果然到了2.478 毫秒这个时间有些超量希望可以优化到1毫秒多。 对于一秒钟视频25帧画面来说4k画面需要2.5 * 25 62.5 毫秒说实话有点多了。 如果我们使用ffmpeg cpu swscale 后果不堪设想。
总结
总之效率是最重要的还有一点一直是我所思考的如果死磕gpu那么cpu 会浪费所以对gpu 和 cpu 除了要分布式处理还要进行分担所以我决定从多点出发需要进行cpu 前处理插件点gpu处理插件点gpu下拉后插件点 利用cpu 多核处理能力同时分担gpu的任务。
未完待续。。。。。。。