[直播一揽子]初期调研

别等时光非礼了梦想. 提交于 2020-04-11 10:26:14

这几天在调研直播的技术。虽然现在有很多“开源”的SDK,或者各个厂家的SDK。但是还是想自己去调研一下整个的直播流程/技术,并且通过代码去实现一套这样的功能。

整体规划:

看网上的文章介绍,基本上的流程是这样的:采集,编码,发送,转发,解码。我这次主要研究一下采集,编码,发送这三个客户端采集的步骤。

采集设备:Android手机摄像头采集视频,麦克风采集音频。

编码格式:音频:aac,视频:h264。

发送协议:rtmp协议。

采集方法:

摄像头采集视频的方法有两种:Camera的onPreviewFrame的回调方法,和MediaRecorder的outPut方法。经过对比,发现各有各的优缺点:

Camera的onPreviewFrame方法:

优点:
                可以获取到视频的原始YUV数据。
                使用简单:直接设置一个回调方法就能够获取到预览时的视频数据。
        缺点:
                需要自己将YUV数据编码为h264格式,对编码需要一定的了解。

MediaRecorder的outPut方法:

 优点:
                可以直接获取到编码后的h264格式的视频帧数据。
        缺点:
                获取部分的代码比较麻烦:需要在程序内部架设socket服务来获取h264视频数据。

在各有优缺点的情况下,通过对比其他现有的直播SDK的功能,最终采用了Camera的onPreviewFrame的方法。众所周知,美颜功能已经是目前直播的主要功能点之一。获取到最原始的YUV数据,对于后期加美颜效果是有极大的帮助的。

麦克风采集音频,也有两种方式:AudioRecorder的read,和MediaRecorder的outPut方法。优缺点基本和视频相似。故还是选择AudioRecorder来采集音频,这样就能获取到最原始的PCM数据(也就是去掉wav头信息的原始数据)。

编码格式:

视频的编码格式采用h264,主要从数据的体积大小上考虑。原始的视频帧YUV数据,是没有经过压缩的,相对来说体积较大。数据越大,在网络上传输出错的可能性越大,并且对网络的带宽消耗也越大。而h264则对数据进行了压缩和编码,有了关键帧和非关键帧的概念。而非关键帧相对于关键帧,视频数据小了很多。这样带来的好处就是直播需要在网络上传输的数据就变少,对服务器的带宽消耗也相对变小。

音频的编码格式采用aac,主要还是由于体积问题。同时,aac在压缩编码之后,声音的变化基本听不出来,声音质量高。

传输协议:

目前大多数直播协议都是基于Rtmp协议的。所以我也准备采用这个协议。

选择库:

有了具体的想法之后,就在于代码的实现。而代码实现往往是最难的部分。毕竟空想谁都会,实现起来,就会遇到各种问题。

看到网上很多是基于ffmpeg去实现直播的采集。但是分析了采集的需求之后,其实发现我们只需要三个地方做好,基本上采集就OK了。分别是:h264  的编码实现。aac的编码实现。rtmp的编码实现。而经过查阅资料,发现ffmpeg也是集成了这三个功能,从而实现的直播功能。

为了简单,我决定就从这三个方面入手编写代码。编写代码不代表就是要重新造轮子。毕竟一个人完全从0开始写直播是不太符合目前的状况的:没那个精力。于是,选择库,成了重要的一个步骤。

h264的编码库也不少,最终选择了x264。
aac的编码库,选择了fdkaac。
rtmp的库,选择了rtmpdump。

以上这三种库都是驰骋沙场的老将,应该没有问题。

接下来就是各个击破,一步一步的去完成实现采集所需的功能。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!