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

企业网站开发报价表seo黑帽优化

企业网站开发报价表,seo黑帽优化,网站后台怎样批量上传,搜索引擎友好的网站有哪些特点1 前言 上一篇文章<FFmpeg下载安装及Windows开发环境设置>介绍了FFmpeg的下载安装及环境配置&#xff0c;本文介绍最简单的FFmpeg视频解码示例。 2 视频解码过程 本文只讨论视频解码。 FFmpeg视频解码的过程比较简单&#xff0c;实际就4步&#xff1a; 打开媒体流获取…

1 前言

上一篇文章<FFmpeg下载安装及Windows开发环境设置>介绍了FFmpeg的下载安装及环境配置,本文介绍最简单的FFmpeg视频解码示例。

2 视频解码过程

本文只讨论视频解码。
FFmpeg视频解码的过程比较简单,实际就4步:

  1. 打开媒体流获取编码格式;
  2. 循环获取解码帧
  3. 显示图像
  4. 关闭流

实际上前两步即已实现视频解码。

2.1 打开媒体流获取编码格式

1 打开流文件
这个函数avformat_open_input打开一个媒体流并读取其头信息,对于实时流或者不包含头信息的视频流,此函数通过几帧数据分析以获取其信息
此函数支持的媒体流非常广泛,包括本地视频文件、RTSP、TCP码流、UDP码流等等都支持。

m_pFmtCtx = nullptr;
ret = avformat_open_input(&m_pFmtCtx, sVideoUrl.c_str(), nullptr, nullptr);

2 在媒体流中寻找视频流
一个媒体流中可能包含了视频、音频、字幕、文本等多个流,到底哪个是我们要的视频流,需要首先确定,这个实际有两种方法,方法1是遍历媒体中所有的流,检查流类型判断哪个是视频流,找到视频流后获取其解码器:

	m_nIndexVideo = -1;AVCodec* pAVCodec;//method 1for (i = 0; i < m_pFmtCtx->nb_streams; i++){if (m_pFmtCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO){m_nIndexVideo = i;break;}}if (m_nIndexVideo < 0)return false;pAVCodec = (AVCodec*)avcodec_find_decoder(m_pFmtCtx->streams[m_nIndexVideo]->codecpar->codec_id);

方法2就更简单,直接av_find_best_stream按视频格式查找最符合的流,并直接返回视频流序号及相应的解码器:

	m_nIndexVideo = av_find_best_stream(m_pFmtCtx, AVMEDIA_TYPE_VIDEO, -1, -1, (const AVCodec**)&pAVCodec, 0);

此两种方法结果是同样的,选择其中一种方法使用即可。
3 分配解码器
根据视频流解码格式分配及设置解码器,此处得到的解码器m_pAVCodecCtx即可用于后续的连续帧的解码了:

	m_pAVCodecCtx = avcodec_alloc_context3(pAVCodec);if (m_pAVCodecCtx == nullptr)return false;ret = avcodec_parameters_to_context(m_pAVCodecCtx, m_pFmtCtx->streams[m_nIndexVideo]->codecpar);

4 准备解码
调用函数avcodec_open2后,即可开始解码:

	ret = avcodec_open2(m_pAVCodecCtx, pAVCodec, nullptr);

至此,一个媒体流的视频流解码工作就准备好了,可以进行获取和解码视频帧了。

2.2 获取解码帧

获取解码帧的过程是:取一个原始包(AVPacket),用以上的解码器从这个包里解出视频帧(AVFrame),具体过程如下:
1 用函数av_read_frame从流中取出一个帧包,此包为流中的原始数据,未解码的。
前面说过,一个媒体流中可能包含了多个流,所以av_read_frame获取的数据包不一定是我们想要的视频流包,需要根据这个包所在流的序号来判断是不是属于前面确定视频流的包。

while (1)
{ret = av_read_frame(m_pFmtCtx, m_pPkt);if (ret < 0)return nullptr;if (m_pPkt->stream_index == m_nIndexVideo)break;
}

2 解码这个包,获取一帧解码图像
采用如下两个函数的组合,用前面获得的解码器m_pAVCodecCtx对这个包进行解码,获得AVFrame。

	avcodec_send_packet(m_pAVCodecCtx, m_pPkt);avcodec_receive_frame(m_pAVCodecCtx, m_pFrame);

此时获得的m_pFrame即为已解码出的一幅视频帧,为一个AVFrame结构,此结构中包含了图像数据、宽高、格式等等信息,可以用于显示、存储等后续工作。

2.3 显示图像帧

有很多软件架构支持直接对AVFrame结构进行显示,如SDL、D3DX等等。
我们这里用最基本的RGB图像方式来显示这个AVFrame,但AVFrame的图像数据大多数是YUV格式,需要做YUV->RGB转换,当然可以自己找公式转换,实际上FFmpeg对此也提供了方便的转换方法sws_scale:

	int ret;int wid, hei;wid = pFrame->width;hei = pFrame->height;if (m_pSwsCtx == nullptr){m_pSwsCtx = sws_getContext(wid, hei, (AVPixelFormat)pFrame->format, wid, hei, AV_PIX_FMT_RGB24, SWS_POINT, nullptr, nullptr, nullptr);}uint8_t* data[1];data[0] = pDib;int lines[1] = { wid * 3 };ret = sws_scale(m_pSwsCtx, pFrame->data, pFrame->linesize, 0, hei, data, lines);

这样转出的pDib就是24位RGB的图像了,之后的显示此处就不再赘述了。

2.4 关闭流

以上打开的流,以及分配的各种资源,最后不用时记得要释放,如

	if (m_pFmtCtx != nullptr){avformat_close_input(&m_pFmtCtx);m_pFmtCtx = nullptr;}if (m_pAVCodecCtx != nullptr){avcodec_close(m_pAVCodecCtx);avcodec_free_context(&m_pAVCodecCtx);m_pAVCodecCtx = nullptr;}

3 示例

下图为程序运行视频解码结果。
在这里插入图片描述
以上代码的完整工程供参考:https://download.csdn.net/download/hangl_ciom/88152736

http://www.hkea.cn/news/935272/

相关文章:

  • 青海建设银行的官方网站自己制作网页的网站
  • 网站建设的图片叠加步骤过程2021年搜索引擎排名
  • 网站链接到邮箱怎么做搜索引擎推广试题
  • 十堰城市建设网站制作自己的网站
  • 传媒网站建设公司深圳百度seo优化
  • 公司需要网站 该怎么做公司推广咨询
  • 高中男女做那个视频网站seo做的好的网站
  • 网站建设 摄影服务上海seo网站排名优化公司
  • 网页设计中html代码seo博客网站
  • 怎样建设小游戏网站google关键词搜索技巧
  • 淘宝 客要推广网站怎么做全媒体广告代理
  • 那个b2b网站可以做外贸武汉全网推广
  • 深圳css3网站开发多少钱如何策划一个营销方案
  • 织梦统计网站访问量代码网络营销公司如何建立
  • 外贸营销型网站建设今日最新重大新闻
  • 个性化定制网站长春网络推广优化
  • 合肥庐阳区疫情最新消息seo优化首页
  • h5网站制作接单最新中高风险地区名单
  • 北京市住房城乡建设委网站公司怎么在网上推广
  • 网站建设首页怎样插入视频百度指数在线查询小程序
  • 青州网站制作哪家好aso优化哪家好
  • wordpress做网站优点郑州网站seo优化
  • 宝安做棋牌网站建设找哪家公司好湖南长沙疫情最新消息
  • 四川专业网站建设中国十大企业培训机构排名
  • 怎么切页面做网站灰色词首页排名接单
  • 网站右侧浮动广告代码百度推广代理公司广州
  • 固原建站公司旺道seo推广系统怎么收费
  • 适合做外链的网站海外广告联盟平台推广
  • 建筑模板规格型号郑州厉害的seo顾问
  • ppt做书模板下载网站有哪些内容国际婚恋网站排名