当前位置: 首页 > wzjs >正文

网站开发项目报告建筑行业网站模板

网站开发项目报告,建筑行业网站模板,c 网站开发案例大全,京东官方网上商城app下载1、FFmpeg支持多种硬件加速类型,用于编解码视频,以提升性能和效率。以下是FFmpeg支持的主要硬件加速类型: NVIDIA NVENC/NVDEC:利用NVIDIA显卡进行视频编码(NVENC)和解码(NVDEC)。 …

1、FFmpeg支持多种硬件加速类型,用于编解码视频,以提升性能和效率。以下是FFmpeg支持的主要硬件加速类型:

NVIDIA NVENC/NVDEC:利用NVIDIA显卡进行视频编码(NVENC)和解码(NVDEC)。
QSV:利用Intel处理器中的集成图形进行视频加速。
AMD VCE  VDA:利用AMD显卡进行视频编码和解码。
VAAPI:适用于Intel和AMD硬件,通过通用的API接口进行硬件加速。
VDPAU :主要用于NVIDIA显卡的硬件解码加速。
DXVA2 :适用于Windows平台,利用DirectX进行视频加速。
OpenMAX IL :用于移动设备和嵌入式系统的视频加速。
Vulkan:一种跨平台的图形和计算API,也可以用于视频加速

int CH264CodecConvert::OpenH264Encoder()
{const AVCodec* codec = avcodec_find_encoder(AV_CODEC_ID_H264);//codec = avcodec_find_encoder_by_name("h264_nvenc");if (!codec){fileLogger->error("查找H264编码器失败");return -1;}m_outAvCodecContex = avcodec_alloc_context3(codec);if (!m_outAvCodecContex){fileLogger->error("H264编码器分配上下文失败");return -2;}
// 	m_outAvCodecContex->thread_count = 4;
// 	m_outAvCodecContex->thread_type = FF_THREAD_FRAME;m_outAvCodecContex->width = 1920;m_outAvCodecContex->height = 1080;m_outAvCodecContex->time_base = { 1, 25 };//多少帧一个I帧//m_outAvCodecContex->gop_size = 25;//去掉B帧//m_outAvCodecContex->max_b_frames = 0;//m_outAvCodecContex->pix_fmt = AV_PIX_FMT_YUV420P;//AV_PIX_FMT_CUDA;//从GPU出来的帧没法转成yuv420,因为网上也有说法是GPU出来只出NV12//解码 > cuda > resize > nv12 > 编码 > yuv420//修改编码encctx->pix_fmt = AV_PIX_FMT_NV12,//顺便encctx->sw_pix_fmt = AV_PIX_FMT_YUV420P(个人认为这个是转换后的格式)av_opt_set(m_outAvCodecContex->priv_data, "preset", "ultrafast", 0);
//av_opt_set(m_outAvCodecContex->priv_data, "tune", "fastdecode", 0);
//av_opt_set(m_outAvCodecContex->priv_data, "profile", "high", 0);m_outAvCodecContex->pix_fmt = AV_PIX_FMT_NV12;m_outAvCodecContex->sw_pix_fmt = AV_PIX_FMT_YUV420P;if (avcodec_open2(m_outAvCodecContex, codec, NULL) < 0){fileLogger->error("打开H264编码器失败");return -3;}m_bIsOpenEncoder = true;return 0;
}enum AVPixelFormat CH264CodecConvert::get_hw_format(AVCodecContext *ctx, const enum AVPixelFormat *pix_fmts) {const enum AVPixelFormat *p;for (p = pix_fmts; *p != -1; p++) {if (*p == ePixFmt_)return *p;}fprintf(stderr, "Failed to get HW surface format.\n");return AV_PIX_FMT_NONE;
}int CH264CodecConvert::hw_decoder_init(AVCodecContext *ctx, const enum AVHWDeviceType type) {int err = 0;if ((err = av_hwdevice_ctx_create(&pDeviceCtx, type,nullptr, nullptr, 0)) < 0) {fprintf(stderr, "Failed to create specified HW device.\n");return err;}ctx->hw_device_ctx = av_buffer_ref(pDeviceCtx);return err;
}int CH264CodecConvert::InitHardDecode(const std::string& HWType)
{pCodec_ = avcodec_find_decoder(AV_CODEC_ID_HEVC);if (!pCodec_) {std::cout << "avcodec_find_decoder Failed" << std::endl;return -1;}enum AVHWDeviceType type;type = av_hwdevice_find_type_by_name(HWType.c_str());if (type == AV_HWDEVICE_TYPE_NONE){std::cout << "UnKnown HW Device Type" << std::endl;while ((type = av_hwdevice_iterate_types(type)) != AV_HWDEVICE_TYPE_NONE){std::cout << type << std::endl;}return -1;}for (int i = 0; ; i++){const AVCodecHWConfig *config = avcodec_get_hw_config(pCodec_, i);if (!config){std::cout << "avcodec_get_hw_config Failed" << i << std::endl;return -1;}if (config->methods & AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX &&config->device_type == type){ePixFmt_ = config->pix_fmt;break;}}m_inAvCodecContex = avcodec_alloc_context3(pCodec_);if (!m_inAvCodecContex) {std::cout << "avcodec_alloc_context3 Failed" << std::endl;return -1;}m_inAvCodecContex->thread_count = 4;m_inAvCodecContex->thread_type = FF_THREAD_FRAME;m_inAvCodecContex->get_format = get_hw_format;if (hw_decoder_init(m_inAvCodecContex, type) < 0) {return -1;}if (avcodec_open2(m_inAvCodecContex, pCodec_, nullptr) < 0){std::cout << "avcodec_open2 Failed" << std::endl;return -1;}bHWDecode_ = true;return 0;
}void CH264CodecConvert::TransferCodec(const std::uint8_t* pszData, std::int32_t nDataLen)
{if (!m_bIsOpenDecoder){//cuda dxva2 d3d11va d3d12vaInitHardDecode("d3d12va");m_bIsOpenDecoder = true;}AVFrame* frame = NULL;if (!(frame = av_frame_alloc()))return;AVPacket inpkt;av_init_packet(&inpkt);inpkt.data = (std::uint8_t*)pszData;inpkt.size = nDataLen;// 硬解码AVFrame* tmpFrame = nullptr, *swFrame = nullptr;int nRet = avcodec_send_packet(m_inAvCodecContex, &inpkt); // 将AVPacket发送至解码器中if (!(tmpFrame = av_frame_alloc()) || !(swFrame = av_frame_alloc())){av_frame_free(&frame);return;}while (avcodec_receive_frame(m_inAvCodecContex, tmpFrame) >= 0){if (!m_bIsOpenEncoder)OpenH264Encoder();if (!m_bIsOpenEncoder)continue;// 判断解码帧格式if (tmpFrame->format == ePixFmt_){/* 将GPU中的数据移交到CPU中 */if (av_hwframe_transfer_data(swFrame, tmpFrame, 0) < 0){std::cout << "Error transferring the data to system memory" << std::endl;av_frame_free(&tmpFrame);av_frame_free(&swFrame);av_frame_free(&frame);return;}frame = swFrame;}else{frame = tmpFrame;}AVPacket outpkt;av_init_packet(&outpkt);frame->pts = m_nPTS++;avcodec_send_frame(m_outAvCodecContex, frame);while (avcodec_receive_packet(m_outAvCodecContex, &outpkt) == 0){std::shared_ptr<std::string> packet = std::make_shared<std::string>();packet->append((char*)outpkt.data, outpkt.size);{std::unique_lock<std::mutex> lock(m_mutexQueuePacket);m_queuePacket.push(packet);}av_packet_unref(&outpkt);}}av_packet_unref(&inpkt);av_frame_free(&tmpFrame);av_frame_free(&swFrame);
}

问题记录:

1.

根据文章https://blog.csdn.net/qq_23282479/article/details/118993650

改用了GPU硬解码,出现了这个问题。软解是没问题的

原本是 解码>cuda>yuv420>编码>yuv420

从GPU出来的帧没法转成yuv420,因为网上也有说法是GPU出来只出NV12

解码>cuda>nv12>编码>yuv420

	m_outAvCodecContex->pix_fmt = AV_PIX_FMT_NV12;m_outAvCodecContex->sw_pix_fmt = AV_PIX_FMT_YUV420P;

这样就正常显示了

2.视频出现闪频

m_inAvCodecContex->thread_count = 4;
m_inAvCodecContex->thread_type = FF_THREAD_FRAME;

开启了多线程解码后解决了这个问题


文章转载自:

http://8Y5S0DAM.fLzqq.cn
http://8Wb2db8B.fLzqq.cn
http://UIN4Gno0.fLzqq.cn
http://tMvmMLIg.fLzqq.cn
http://frAStOrU.fLzqq.cn
http://aZwokVkI.fLzqq.cn
http://GiN78KDe.fLzqq.cn
http://hdgbsq4K.fLzqq.cn
http://lN4zBY5P.fLzqq.cn
http://iUpvLh1Z.fLzqq.cn
http://W3ALMSII.fLzqq.cn
http://IZeZzSzD.fLzqq.cn
http://hJxh7iqP.fLzqq.cn
http://Ur8dgUKD.fLzqq.cn
http://4t3X8LLj.fLzqq.cn
http://mUn102zM.fLzqq.cn
http://6d9thf3J.fLzqq.cn
http://V3Ewfs3C.fLzqq.cn
http://GLWl52YH.fLzqq.cn
http://vToz4WgN.fLzqq.cn
http://iAL6eWOd.fLzqq.cn
http://lQdZfAzt.fLzqq.cn
http://C93GWInY.fLzqq.cn
http://CcP0KCzi.fLzqq.cn
http://7i9Yhx9c.fLzqq.cn
http://T15kSJlA.fLzqq.cn
http://uX9cfblP.fLzqq.cn
http://tHBdVzox.fLzqq.cn
http://BglR4Oo2.fLzqq.cn
http://coLtRjc4.fLzqq.cn
http://www.dtcms.com/wzjs/769313.html

相关文章:

  • 建设网站建设投标网1249中官网词做广告的软件app
  • 广州网站建设排名网页制作网站制作步骤
  • 让百度收录网站wordpress腾讯云搭建网站
  • 淘宝是什么语言做的网站八喜网站建设
  • 南昌手机建站模板修改wordpress菜单
  • 网站开发需求分析中性能需求建设五证在那个网站可以查
  • 网站建设案例教程常州网站建设怎么样
  • 大型网站一般用什么语言做的linux的wordpress渗透
  • 三优科技 网站开发怎样做网站宣传自己的宾馆
  • 网站页面布局设计思路免费查公司信息的网站
  • 在线一键扒站源码php十堰做网站最好的公司
  • 成都哪家做网站好软装设计风格
  • 沂水网站开发凡客建站官网登录
  • 英文网站建设980怎样建设和维护网站
  • 织梦旅游网站html网站用什么空间
  • 专业分销网站建设网站板块怎么做
  • 个人类网站有哪些免费ppt模板下载简约风
  • 中国能建官网百度seo是啥意思
  • 电脑上怎么建设网站做百度网站需要钱吗
  • 门户网站建设存在问题与不足长安网站建设方案
  • 初中生电脑作业做网站邯郸公众号小程序制作
  • 网站建设云技术公司推荐教学网站模板下载
  • 网站栏目建设方案证件照制作免费版
  • 做虾皮网站凌云网络科技有限公司
  • 网站php怎么做的知乎网站开发用的语言
  • 设置网站人数报告文学
  • 网站开发类型什么意思社区推广的营销推广方式
  • 重庆梁平网站建设哪家好网站美工要求
  • 普洱建设网站wordpress 购买会员
  • 肇庆企业网站关键词优化教程装修网站开发前的准备工作