采集音频和摄像头视频并实时H264编码及AAC编码

简介: 采集音频和摄像头视频并实时H264编码及AAC编码

采集音频和摄像头视频并实时H264编码及AAC编码

0. 前言

  我在前两篇文章中写了DirectShow捕获音视频然后生成avi,再进行264编码的方法。那种方法有一些局限性,不适合实时性质的应用,如:视频会议、视频聊天、视频监控等。本文所使用的技术,适用于这种实时性的应用,通过处理采集出来的音视频的每一帧,实现实时编码,实时输出。这是我做直播系列应用的一部分,目前的情况是输入端采用DirectShow技术捕获音视频,然后对视频进行h.264编码,对音频进行aac编码,输出端则是生成文件,接下来还要进一步扩展输入端和输出端,以支持文件、桌面输入,RTSP、RTMP、HTTP等流式协议输出。

 

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中加入这几行代码,就可以了

#pragma include_alias( "dxtrans.h", "qedit.h" )
#define __IDxtCompositor_INTERFACE_DEFINED__
#define __IDxtAlphaSetter_INTERFACE_DEFINED__
#define __IDxtJpeg_INTERFACE_DEFINED__
#define __IDxtKey_INTERFACE_DEFINED__
#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的相关接口

faacEncHandle FAACAPI faacEncOpen(unsigned long sampleRate, unsigned int numChannels,
                  unsigned long *inputSamples, unsigned long *maxOutputBytes);
in
AACAPI faacEncEncode(faacEncHandle hEncoder, int32_t * inputBuffer, unsigned int samplesInput,
            unsigned char *outputBuffer, unsigned int bufferSize);

  faacEncEncode第三个参数指的是传入的sample的个数,这个值要和调用faacEncOpen返回的inputSamples相等。要做到这点,就要在dshow中设置好buffsize,公式是:

BufferSize = aac_frame_len * channels * wBytesPerSample
// aac_frame_len = 1024

 

4. 程序界面

  运行中

   

  捕获完成后生成aac 和 264文件

   

  生成的aac文件用MediaInfo读出来的编码格式

   

  生成的264文件用MediaInfo读出来的编码格式

   

  用mp4box封装一下,把264和aac存放到mp4容器文件中,就可以在播放器中播放了

   

目录
相关文章
|
Cloud Native 数据挖掘 Linux
阿里云Alibaba Cloud Linux系统详解以及CentOS有什么区别?替代CentOS解决方案
Alibaba Cloud Linux和CentOS有什么区别?替代CentOS解决方案
6209 1
阿里云Alibaba Cloud Linux系统详解以及CentOS有什么区别?替代CentOS解决方案
|
Linux iOS开发 MacOS
【MCP教程系列】阿里云百炼MCP全面配置指南:涵盖NPX、UVX、SSE及Streamable HTTP
本文详细介绍如何在阿里云百炼平台及Windows、Linux、MacOS系统中正确配置MCP服务的JSON文件。内容涵盖三种MCP服务配置:npx(基于Stdio)、uvx(Python工具运行)和SSE(服务器发送事件)。同时解析Streamable HTTP作为新一代传输方案的优势与应用,帮助用户掌握每个参数的具体用途及使用方法,解决配置过程中可能遇到的问题,提供完整示例和扩展信息以优化设置体验。
2354 11
|
12月前
|
中间件 编译器 开发工具
如何用易语言进行跨平台的软件开发
如何用易语言进行跨平台的软件开发
|
编解码
FFmpeg开发笔记(三十三)分析ZLMediaKit对H.264流的插帧操作
《FFmpeg开发实战》书中3.4.3节讲解如何将H.264流封装成MP4。H.264流通常以SPS→PPS→IDR帧开始,这一说法通过雷霄骅的H264分析器得到验证。分析器能解析H.264文件但不支持MP4。ZLMediaKit服务器在遇到I帧时会自动插入SPS和PPS配置帧,确保流符合标准格式。若缺少这些帧,客户端拉流时会报错。FFmpeg开发实战:从零基础到短视频上线》书中提供了更多FFmpeg开发细节。
393 0
FFmpeg开发笔记(三十三)分析ZLMediaKit对H.264流的插帧操作
|
JSON 算法 应用服务中间件
嵌入式设备OTA升级的大致过程!
嵌入式设备OTA升级的大致过程!
388 0
|
12月前
|
数据采集 监控 数据挖掘
CDGA|金融科技变革下的数据治理怎么做?
未来,随着技术的不断进步和监管环境的逐步完善,金融科技企业将在数据治理与合规方面取得更大突破,实现稳健发展。数据治理将成为金融科技企业的核心竞争力之一,为金融行业的健康发展保驾护航。
CDGA|金融科技变革下的数据治理怎么做?
|
机器学习/深度学习 人工智能 自然语言处理
【Python机器学习专栏】机器学习前沿与趋势
【4月更文挑战第30天】机器学习快速发展,深度学习、强化学习、联邦学习和自监督学习是前沿技术。未来趋势包括提升模型可解释性、跨模态学习、AI伦理法规及人机协作。Python作为常用工具,简化了机器学习模型的构建。随着技术进步,新应用将持续涌现,关注伦理法律问题和持续学习至关重要。
292 0
|
内存技术
HTTP-FLV详解及分析(二)
HTTP-FLV详解及分析
327 0
|
移动开发 网络协议 应用服务中间件
HTTP-FLV详解及分析(一)
HTTP-FLV详解及分析
733 0
|
传感器 自动驾驶 安全
Apollo激光雷达感知:探索自动驾驶的“眼睛”(文末赠送apollo周边)
Apollo激光雷达感知:探索自动驾驶的“眼睛”(文末赠送apollo周边)
279 0