h264解码如何实时h264编码及aac编码

h264解码  时间:2021-08-05  阅读:()

为什么大多数都是h264编码的?

mpeg2已经是好几乎10年前出来的标准了,因为当时硬件的限制,注定mpeg2算法的画质的局限性。

而h264是mpeg组织定下的新业界标准,更受到次世代储存媒体的应用。

而h264本身来说,拥有许多先进技术,具体稍微网上搜一下就可以了。

h264格式用什么样的播放器

h264是视频编码标准,支持h264解码的播放器都可以。

比如vlc的VLC Player,ffmpeg的ffmpeg Player,暴风影音,还有Nero Player等。

如何实时h264编码及aac编码

1. 简单介绍   首先是捕获,这里采用了DirectShow的方式,对它进行了一定程度的封装,包括音视频。

好处是直接使用native api,你可以做想做的任何修改,坏处是,不能跨平台,采集音视频这种应用,linux平台也是需要滴呀。

有跨平台的做法,对视频,可以使用OpenCV,对音频,可以使用OpenAL或PortAudio等,这样就行了。

  编码可以选择的余地比较大,对视频来讲,有H264, MPEG-4, WebM/VP8, Theora等,音频有Speex, AAC, Ogg/Vorbis等,它们都有相应的开源项目方案,我采用的是x264进行H264编码,libfaac进行aac编码,之后是否更改编码方案,等具体项目需求再说了。

这里提一下WebM,Google牵头的项目,完全开放和自由,使用VP8和Vorbis编码,webm(mkv)封装,有多家巨头支持,目的是想要取代当前的H264视频编码,号称比后者更加优秀,我没有测试过实际效果。

不过有商业公司牵头就是不一样,各项支持都很全面,有时间了关注一下。

  2. 逻辑和流程   基本的思想是实现dshow ISampleGrabberCB接口,通过回调来保存每一个buffer。

除了界面线程和dshow自己的线程之外,我们启动了两个线程,AudioEncoderThread和VideoEncoderThread,分别从SampleGrabber中取出数据,调用编码器进行编码,编码后的文件可以直接输出。

看图:   程序是用VS2010构建的,看张工程截图:   Base下面的是对系统API的一些简单封装,主要是线程和锁。

我这里简单也封装的了一下dshow的捕获过程,包括graph builder的创建,filter的连接等。

directshow是出了名的难用,没办法,难用也得用。

因为是VS2010,调用的Windows SDK 7.1中的dshow,没有qedit.h这个文件,而它正式定义ISampleGrabberCB的。

不急,系统中还是有qedit.dll的,我们要做的就是从Windows SDK 6.0中,把它拷过来,然后在stdafx.h中加入这几行代码,就可以了   1 #pragma include_alias( "dxtrans.h", "qedit.h" )   2 #define __IDxtCompositor_INTERFACE_DEFINED__   3 #define __IDxtAlphaSetter_INTERFACE_DEFINED__   4 #define __IDxtJpeg_INTERFACE_DEFINED__   5 #define __IDxtKey_INTERFACE_DEFINED__   6 #include "qedit.h"   3. 音视频编码   相关文件:   Encoder下就是音视频编码相关的代码。

X264Encoder封装了调用x264编码器的操作,FAACEncoder封装了调用libfaac编码器的操作,VideoEncoderThread和AudioEncoderThread负责主要的流程。

下面我把关键代码贴出来,大家可以参考一下。

  A. 视频编码线程   主要流程是首先初始化x264编码器,然后开始循环调用DSVideoGraph,从SampleGrabber中取出视频帧,调用x264进行编码,流程比较简单,调用的频率就是你想要获取的视频帧率。

要注意的一点是,x264进行编码比较耗时,在计算线程Sleep时间时,要把这个过程消耗的时间算上,以免采集的视频帧率错误。

  B. 音频编码线程   主要流程和视频编码线程相同,也是初始化FAAC编码器,然后循环调用DSAudioGraph,从SampleGrabber中取出视频帧,调用faac进行编码。

和视频不同的是,音频的sample的频率是非常快的,所以几乎要不断的进行采集,但前提是SampleGrabber中捕获到新数据了才行,不然你的程序cpu就100%了,下面代码中IsBufferAvailaber()就是做这个检测的。

  调用faac进行编码的时候,有点需要注意,大家特别注意下,不然编码出来的音频会很不正常,搞不好的话会很头疼的。

先看下faac.h的相关接口   1 faacEncHandle FAACAPI faacEncOpen(unsigned long sampleRate, unsigned int numChannels,2 unsigned long *inputSamples, unsigned long *maxOutputBytes);3 4 int FAACAPI faacEncEncode(faacEncHandle hEncoder, int32_t * inputBuffer, unsigned int samplesInput,5 unsigned char *outputBuffer, unsigned int bufferSize);   faacEncEncode第三个参数指的是传入的sample的个数,这个值要和调用faacEncOpen返回的inputSamples相等。

要做到这点,就要在dshow中设置好buffsize,公式是:   BufferSize = aac_frame_len * channels * wBytesPerSample// aac_frame_len = 1024

天上云:香港大带宽物理机服务器572元;20Mbps带宽!三网CN2线路

天上云服务器怎么样?天上云是国人商家,成都天上云网络科技有限公司,专注于香港、美国海外云服务器的产品,有多年的运维维护经验。世界这么大 靠谱最重,我们7*24H为您提供服务,贴心售后服务,安心、省事儿、稳定、靠谱。目前,天上云香港大带宽物理机服务器572元;20Mbps带宽!三网CN2线路,香港沙田数据中心!点击进入:天上云官方网站地址香港沙田数据中心!线路说明 :去程中国电信CN2 +中国联通+...

RAKsmart 年中活动 独立服务器限时$30秒杀 VPS主机低至$1.99

RAKsmart 虽然是美国主机商,但是商家的主要客户群还是在我们国内,于是我们可以看到每次的国内节日促销活动期间商家也会发布促销。包括这次年中大促活动,RAKsmart商家也有发布为期两个月的年终活动,其中有商家擅长的独立服务器和便宜VPS主机。服务器包括站群服务器、特价服务器、高达10G带宽不限制流量的美国服务器。商家优惠活动,可以看到对应商品的优惠,同时也可以使用 优惠码 RAKBL9 同时...

2022年腾讯云新春采购季代金券提前领 领取满减优惠券和域名优惠

2022年春节假期陆续结束,根据惯例在春节之后各大云服务商会继续开始一年的促销活动。今年二月中旬会开启新春采购季的活动,我们已经看到腾讯云商家在春节期间已经有预告活动。当时已经看到有抢先优惠促销活动,目前我们企业和个人可以领取腾讯云代金券满减活动,以及企业用户可以领取域名优惠低至.COM域名1元。 直达链接 - 腾讯云新春采购活动抢先看活动时间:2022年1月20日至2022年2月15日我们可以在...

h264解码为你推荐
apple以旧换新苹果以旧换新真的吗?巴西时区巴西现在和北京时间 的时间差是多少啊?密码设置开机密码怎么设定?diskgenius免费版给我发一个 DISKGenius恢复数据破解版的可以吗,或者其他破解版的也可以,只要能恢复数据,感激不尽,...局域网ip扫描工具局域网的IP段怎么扫描蓝牙开发开发者选项里的蓝牙设置如何设置最好?qsv视频格式转换器手机qsv怎么转换成mp4格式转换器充值卡充值买完充值卡了,怎么充值协亨协亨,话机世界,迪信通哪个买手机更便宜?空间图片空间图片
免费vps服务器 com域名价格 台湾服务器 vpsio godaddy优惠券 灵动鬼影 北京双线机房 php空间推荐 什么是服务器托管 服务器硬件防火墙 彩虹云 百度云加速 数据库空间 华为k3 阿里云邮箱登陆 域名转入 后门 免备案jsp空间 hdroad 标准机柜 更多