基于crtmpserver的手机直播系统

2014-12-23 01:15潘晨光
计算机工程与设计 2014年9期
关键词:音视频音频客户端

丁 杰,潘晨光,田 源

(公安部第一研究所 第二技术事业部,北京100048)

0 引 言

随着3G、4G 移动互联网、视频编解码技术的发展,以实时性为核心的手机视频直播系统在应用市场上越来越流行。无论哪种直播系统,基本是由编码器、流传输模块、流媒体服务器、流接收模块、播放器5个部分组成[1]。

其中编码器将视频源和音频源采集的数据进行压缩,以便于网络传输。编码方式可以分为硬件编码和软件编码。硬件编码是采用专用编码芯片进行编码,具有速度快、功耗低的特点,而软件编码采用软件算法进行编码。与硬件编码相比,软件编码灵活性较高,可以支持多种音视频格式。考虑到可扩展性,本文采用软件编码。

流传输和流接收模块设计的时候,要选择流媒体协议,目前较为常用的流媒体协议包括RTSP (real time streaming protocol)、RTMP (routing table maintenance protocol)、MMS (Microsoft media server protocol)等。其中,RTSP全称 “实时流媒体传输协议”,是由RealNetworks公司、哥伦比亚大学和网景公司共同提出的流媒体传输标准[2]。RTMP全称 “路由选择表维护协议”,是由Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输开发的开放协议。

流媒体服务器是直播中最重要的一环。流媒体服务器分为商业服务器和开源免费服务器。典型的商业服务器包括RealNetworks公司的Helix Server,采用RTP/RTSP 协议进行传输,采用RealPlayer作为播放前端。Adobe公司的Flash Media Server,采用RTMP 协议进行传输,采用Flash Player作为播放前端。典型的免费服务器是crtmpserver是Evostream Media Server的社区版本,采用GPLV3授权,是一个高性能的流媒体服务器支持RTSP 与RTMP协议,可以实现直播与点播功能。

本系统通过手机摄像头采集视频信息,并通过移动网络传输到服务器,服务器存储转发视频到PC客户端,实现了终端管理、视频直播、视频存储的功能。本文首先分析了FFMPEG 库、RTSP流媒体协议和CRtmpserver的基本概念和原理,然后重点研究了整个视频直播系统的功能模块的设计和具体实现方法。

1 系统方案

1.1 库和协议介绍

FFmpeg是目前最好的音视频软编解码的完整解决方案。本系统采用FFmpeg进行音视频的编解码及RTSP 流的发送和接收。其中,视频采用H264 进行编解码。音频采用AAC 进行编解码。通过将x264 和fdkaac库编译到FFmpeg,使FFmpeg能够支持H264和AAC编解码。手机端用来采集音视频并传输,因此FFmpeg用来进行编码压缩和传输。在Android 系统上使用的FFmpeg 库使用MinGW 进行交叉编译[3],首先下载X264和fdkaac源代码并进行编译,然后在编译FFmpeg 时,配置文件中要加入”—enable-libx264”和—enable-libfdk-aac”,分别编译出Windows所需要的链接库以及Android所需要的链接库提供给二者调用。

RTSP是一种实时流媒体传输协议,专门用于在IP 网络上传送实时多媒体数据。RTSP 的数据传输时通过TCP或RTP协议 (如图1 所示)。由于RTSP 可以是双向的,因此可以对流媒体提供播放、暂停、快进、慢退等操作[4]。本文选取RTSP 作为流媒体传输协议。与RTMP 相比,RTSP具有更高的实时性。因此要达到延迟1s甚至更短时,只有RTSP可以满足要求。

图1 RTSP控制协议工作方式

选择crtmpserver作为直播服务器不仅是因为其完全免费,更因为其支持多种流媒体技术之间的通讯,具有高性能且并发几千路的连接,占用资源少。是高性能的流媒体服务器,支持RTMP,RTMPE,RTMPS、RTSP 等协议。本文中crtmpserver用来接收Android端推送的RTSP 直播源并根据PC端的请求进行转发。

1.2 方案介绍

系统分为客户端和服务器。其中客户端包括PC客户端和手机客户端。分别基于Windows操作系统和Android操作系统。其中,手机客户端功能是通过摄像头采集图像信息,通过话筒采集音频信息,图像信息和音频信息通过FFMPEG 编解码库进行编码,图像编码采用X264 编码方式,音频编码采用AAC编码方式。视频经过压缩编码组成RTSP视频流,通过3G 或WIFI网络传输到crtmpserver服务器。PC客户端可以显示手机端列表,且可以播放手机采集的视频。服务器可以存储所有手机客户端采集的视频。且PC客户端可以对这些视频进行查询和点播。

系统方案如图2所示。

图2 系统方案

2 手机客户端

2.1 手机端方案

手机客户端主要是通过摄像头采集视频,通过话筒采集音频,利用FFMPEG 对视频和音频进行压缩编码。再形成RTSP流传送到服务器。手机端方案如图3所示。

图3 手机端方案

2.2 视频获取

目前,Android手机实时抓取视频数据主要有2 种方法。一种是通过Android sdk中的MediaRecorder类来获取摄像头的视频,然后使用LocalSocket类来得到数据流,再通过LocalSocket.getInputStream ()获取MediaRecorder类编码的视频流,但是这样获得的视频流无法分离视频和音频数据,因此灵活性较差。另一种方式是通过Camera的回调函数获取原生数据[5],这里的原生数据是没有编码的YUV 数据,这种方式如果直接发送,数据量就非常大。因此必须要在发送端添加视频编码器。本文采用后一种方式采集视频。

Android手机采集音频也有多种方法,常用的包括Me-diaRecord和AudioRecord。MediaRecord操作比较简单但是不能对音频进行处理。因此采用AudioRecord 进行录音。通过设置AudioRecord的sampleRateInHz来指定音频的采样率 (本文使用44100Hz)。设置channelConfig 来设置声道。本文采用MONO 单声道。通过设置audioFormat来设置采集数据的编码方式 (本文采用PCM 编码)并将采集到的数据保存在一个内存缓冲区byteBuffer中以便于FFmpeg进行编码[6]。

2.3 编码与传输

与RTMP协议需要附加librtmp库的支持不同,FFmpeg本身就可以支持RTSP协议传输。因此,编码压缩和传输都使用FFmpeg来完成。

利用FFmpeg库编码前,先要对其进行初始化,注册所有的编解码器以及文件格式,设置编码器码率、帧率、像素格式等参数,并指定编码器,由于crtmpserver推荐的视频和音频编码为H264和AAC,因此指定编码格式视频为AV_CODEC_ID_H264、音频为AV_CODEC_ID_AAC,打开编码器之后才可以进行编码。通过avformat_alloc_output_context2 函数来设置AVCodecContext结构体,AVCodecContext包含视频的原始宽度和高度、编码后的宽度和高度、编码器类型、比特率等信息,并且该函数也用来设置RTSP 直播地址。通过av_find_stream_info函数来查找对应的编码器。将音频和视频原始数据送入到音频处理线程 (audio thread)和视频处理线程 (video thread)。处理线程用来对采集的视频帧和音频帧进行编码。将编码后的数据发送到队列里,RTSP处理线程从队列里读取数据,并转为RTSP 流发送到服务器 (图4)。

图4 FFmpeg编码传输流程

由于在播放时需要音视频同步,因此,在对音视频进行编码压缩时,要设置音视频的DTS (解码时间戳)和PTS (显示时间戳)信息[7]。其中视频的PTS和DTS信息设置的代码片段如下:

3 服务器端

服务器端负责转发和存储流媒体。只采用crtmpserver实现完整的视频请求、管理的功能较为困难。因此,需要加入Web服务器。Crtmpserver与Web 服务器配合使用。最终实现完善的转发、存储、管理的服务端。

服务器包括流媒体服务器和Web服务器。流媒体服务器采用crtmpserver负责接收手机客户端的视频流并随时等待Windows客户端的RTSP 连接请求。若请求通过,则转发视频流到Windows 客户端。Web 服务器采用nginx,nginx主要用于发布和管理视频信息。是通过nginx的插件nginx-rtmp-module实现的。相比单独采用crtmpserver,这种方式的好处是不仅可以支持通过web方式去查询和下载视频,而且便于对直播流和保存的视频进行管理,且在相同的带宽下可以支持更多的用户观看[8]。其中,crtmpserver与nginx 之间交互是通过配置脚本来的,其中,配置crtmpserver 的proxypublish.lua 脚本,使其支持RTSP流转发:

其中:1935为监听转发视频的端口。

服务器的工作流程如图5 所示。当Android 客户端(Android client)打开摄像头进行直播之前,首先通过http get请求的方式向nginx 申请一个RTSP 直播地址 (Rtsp address)。nginx随机生成地址,存入到redis并返回给Android客户端;Android客户端的到该地址后,则通过该地址将视频流传送到crtmpserver。crtmpserver首先转发到nginx,nginx将视频流存储到硬盘 (storage)中,最终生成flv格式的视频文件。

图5 服务器端处理流程

Windows客户端首先通过http get向nginx服务器请求当前正在直播的手机客户端列表。nginx 将列表返回后,Windows客户端若选中列表中某个手机客户端,则向nginx服务器发送http get请求,nginx通过查询redis得到该手机客户端的直播地址,并返回给windows客户端。Windows客户端通过该地址从crtmpserver上接收直播流。

4 PC客户端

4.1 客户端原理

Windows客户端读取服务器返回的直播列表,在列表中选择某路直播视频,即可接收RTSP 视频流。接收后的处理流程如图6所示。

图6 PC客户端方案

4.2 视频接收与解码

用FFmpeg解码的流程与编码的流程大致相同,首先通过av_register_all()函数完成FFmpeg系统支持的编解码格式注册,然后通过avformat_open_input()打开处于服务器端的RTSP视频流,然后利用av_find_stream_info()找到多媒体文件中的视频流、音频流对应的流索引ID。avcodec_find_decoder ()使用视频流、音频流ID,完成视频编码器与音频编码器的初始化工作,然后音频处理线程 (audio thread)和视频处理线程 (video thread)完成对音频数据和视频数据的解码。

PC端解码流程如图7所示。

图7 PC端解码流程

4.3 视频播放

FFmpeg解码H264得到YUV 格式的视频帧,利用DirectDraw 显示。首先在DirectDraw 中创建YUV 表面,将解码得到的YUV 数据拷贝到YUV 表面,将YUV 表面拷贝到主表面或后备表面进行显示[9]。

FFmpeg解码AAC 得到PCM 格式的音频帧,将音频帧数据送入到DirectSound 的回放缓存中,利用Direct-Sound播放音频。

播放过程中最重要的问题就是音视频同步问题。RTSP流中的包信息中包含DTS (解码时间戳)和PTS (显示时间戳)信息。本文所采用的同步机制为:将音频播放时钟作为同步时钟,控制视频播放时钟同步到音频播放时钟上,即视频的播放完全根据音频的PTS 最后的数据输出来同步。通过设置一个同步阈值,本文采用10 ms作为阈值。当视频播放时钟与音频播放时钟差值在阈值范围内,就认为基本同步[10],否则为失步。当音视频同步时,则播放当前视频帧。

5 实验与分析

根据上述设计,我们在给定方案基础上开发了视频直播原型系统,其中,手机端视频采集一路视频 (如图8 所示),在PC端界面中可以显示直播终端列表和对应的直播视频 (如图9所示)。

原型系统工作流程:

(1)手机端摄像头采集视频,采集的同时传输到服务器。

图8 手机端视频采集界面

(2)服务器进行转发、存储和管理。

(3)PC客户端定时到服务器请求直播设备列表,并显示到界面的列表中 (如图9所示),双击列表中的设备,即可播放该设备当前正在采集的视频。

在原型系统中,我们通过在不同的网络情况下分别直播不同分辨率的视频流来测试本系统原型的实时性。直播视频的分辨率为CIF和480P情况下,音频为单声道,采样率为44.1Khz,采样大小为16bit。表1中显示了在中国联通3G 网络、中国电信3G 网络及无线wifi网络下统计的视频延迟时间,视网络质量情况有偏差,考虑到需要减去视频缓冲所需要的时间,表明本系统满足不同的网络条件,且具有较好的实时性。

图9 PC端视频直播界面

表1 实验结果

6 结束语

随着技术的发展成熟,视频直播的应用将会越来越广泛。本文以RTSP 作为传输协议,利用FFmpeg作为编解码方案,利用稳定高效的crtmpserver服务器和nginx服务器作为服务端。详细讨论了手机端的编码压缩和传输方案,服务器端的转发和存储方案以及PC 端视频接收与播放方案,分析了直播服务器的配置方法及音视频时间同步的策略。并开发出整套手机视频直播系统。设计了相应的测试实验,为实现高可靠、高实时性的视频直播系统,提供了一种较为可行的方法。

[1]Qadeer,Mohammed A Ahmad,Rehan Khan.Real time video streaming over heterogeneous networks [C]//Piscataway,NJ,USA:IEEE Press,2009:1117-1122.

[2]RFC2326.Real time streaming protocol(RTSP)[S].

[3]WANG Ying,WANG Hua.Transplantation of H.264decoder based on FFmpeg on Symbian platform [J].Modern Electronic Technique,2011,34 (11):43-46 (in Chinese). [王莹,王华.Symbian 平台下基于FFmpeg 的H.264 解码器的移植[J].现代电子技术,2011,34 (11):43-46.]

[4]Zelalem Shibeshi,Alfredo Terzoli,Karen Bradshaw.Using an RTSP Proxy to implement the IPTV media function via a streaming server[C]//International Congress on Ultra Modern Telecommunications and Control Systems and Workshops,2010:253-259.

[5]DING Su.Transplantation and application development on Android system [D].Beijing:Beijing University of Posts and Telecommunications,2011:1-11 (in Chinese). [丁粟.基于Android平台的视频监控系统设计 [D].北京:北京邮电大学,2011:1-11.]

[6]Sangchul Lee,Jae Wook Jeon.Evaluating performance of android platform using native C for embedded systems[C]//:In Ternationnal Conference on Control Automation and Systems,2010:1160-1163.

[7]DONG Chunbing.Research and implementation of audio and video synchronization [D].Changchun:Jilin University,2007 (in Chinese).[董春兵.音视频同步的研究与实现 [D].长春:吉林大学,2007.]

[8]HU Hui.Research on the key technologies of multimedia communication terminal based on DaVinci platform [D].Beijing:Beijing University of Posts and Telecommunications,2011:1-8(in Chinese).[胡晖.DaVinci多媒体通信终端关键技术研究[D].北京:北京邮电大学,2011:1-8.]

[9]HE Yuanyuan,HE Kai.The study and implementation of H.264 video decoder based on FFmpeg [D].Chongqing:Chongqing University of Posts and Telecommunications,2012:8519-8522 (in Chinese). [何圆圆,何 凯.基于FFmpeg 的H.264视频解码器的研究与实现 [D].重庆:重庆邮电大学,2012:8519-8522.]

[10]YANG Bei.Design and implementation of audio and video synchronization in streaming media [D].Wuhan:Huazhong University of Science and Technology,2008 (in Chinese).[杨蓓.流媒体系统中音视频同步机制的设计与实现 [D].武汉:华中科技大学,2008.]

猜你喜欢
音视频音频客户端
如何看待传统媒体新闻客户端的“断舍离”?
3KB深圳市一禾音视频科技有限公司
必须了解的音频基础知识 家庭影院入门攻略:音频认证与推荐标准篇
基于Daubechies(dbN)的飞行器音频特征提取
WIFI音视频信号传输的关键问题探究
县级台在突发事件报道中如何应用手机客户端
孵化垂直频道:新闻客户端新策略
高速公路整合移动音视频系统应用
音频分析仪中低失真音频信号的发生方法
Pro Tools音频剪辑及修正