大家好,关于Android中视频直播技术研究:摄像头视频推流很多朋友都还不太明白,今天小编就来为大家分享关于的知识,希望对各位有所帮助!
你看,这里我们用手机后置摄像头采集数据,然后推送到服务器,然后用VLC在本地观看。由于gif的制作,图片会有点模糊、卡顿。它不是由本生视频数据采集和流式传输引起的。
2.金山云SDK功能分析
上面的效果我们已经看到了,那么我们来分析一下它的实现原理,因为它只有一个demo和几个jar包,而且文档也很简单:
可以看到,它与Java层的FFmpegWrapper类进行交互,推流、编码等核心功能都在这里实现。而这里你会看到它底层使用了目前开源的视频编解码工具类FFmpeg,以及添加水印等视频功能。处理效果。
还有libksyyuv.so,主要用于YUV数据格式转换。正如上一篇文章介绍的,获取每一帧视频数据后都需要进行格式转换,但这些转换任务放在Java层的效率是一个问题,一般都是在native层处理。
3.金山云SDK核心类
在讲解其原理实现之前,我们先看一下SDK的简单使用。使用方法非常简单。
1. KSYStreamer类:编码和流式传输。
2. KSYBgmPlayer 类:播放背景音乐流,可以在流媒体过程中为视频添加背景音乐。
3. KSYMediaPlayer类:播放流类。该类主要适用于画中画效果。
4. KSYStreamerConfig.Builder 类:设置流式传输的配置信息类。
第一个:KSYStreamerConfig.Builder类
KSYStreamerConfig.Builder 构建器=new KSYStreamerConfig.Builder();
1.setmlUrl方法
=设置推送地址
2.setFrameRate方法
=设置推送帧率
3.setMaxAverageVideoBitrate方法
=设置最高码率,即目标码率
4.setMinAverageVideoBitrate方法
=设置最小码率
5.setInitAverageVideoBitrate方法
=设置初始码率
6.setAudioBitrate方法
=设置音频比特率
7.setVideoResolution方法
=设置推送视频大小:360P/480P/540P/720P
8.setEncodeMethod方法
=设置视频编码方式:硬编码/软编码
9.setSampleAudioRateInHz方法
=设置音频的频率
10.setDefaultLandscape方法
=设置推送视频的方向:横屏/竖屏
11.setFrontCameraMirror方法
=设置相机方向:前/后
第二:KSYStreamer类
KSYStreamer mStreamer=new KSYStreamer(Context context);
mStreamer.setConfig(builder.build());
1.setDisplayPreview方法
=设置预览界面,GLSurfaceView类型
2.setOnStatusListener方法
=设置推送状态回调
3.setOnLogListener方法
=设置日志回调
4.setOnAudioRawDataListener方法
=设置音频原始数据回调
5.setOnPreviewFrameListener方法
=设置每一帧的数据回调
6.enableDebugLog方法
=是否启用日志信息
7.setMuteAudio方法
=设置静音模式
8.setEnableEarMirror方法
=设置耳朵清洁
9.setBeautyFilter方法
=设置过滤器
10.showWaterMarkLogo方法
=设置水印标志图像效果
11.showWaterMarkTime方法
=设置时间戳水印效果
12.隐藏WaterMarkLogo方法
=隐藏水印标志图像
13.隐藏WaterMarkTime方法
=隐藏水印时间戳
14.startStream方法:开始流式传输
15. stopStream方法:停止流式传输
16.setBgmPlayer方法:设置背景音乐
17.startMixMusic方法:设置背景音乐路径
18. stopMixMusic方法:停止背景音乐
19. getRtmpHostIP方法:获取推送IP地址
20. getUploadedKBytes方法
=获取已推送的字节数
21. getEncodedFrames方法:获取编码帧率
22. getCurrentBitrate方法:获取当前码率
23.setPipPlayer方法:设置画中画视频播放功能
23.setPipLocation方法:设置画中画视频位置
三、KSYBgmPlayer类
KSYBgmPlayer mKsyBgmPlayer=KSYBgmPlayer.getInstance();
1.setOnBgmPlayerListener方法
=设置推送背景音乐播放回调
2.setVolume方法:设置音乐音量
3.setMute方法:静音
四、KSYMediaPlayer类
KSYMediaPlayermKsyMediaPlayer=new KSYMediaPlayer.Builder(Context context).build();
1.setOnCompletionListener方法
=设置视频播放回调
2.setOnInfoListener方法
=设置视频播放信息回调
3.setOnSeekCompleteListener方法
=设置视频播放拖动回调
4.setScreenOnWhilePlaying方法
=设置全屏播放
5.setLooping方法:设置循环播放
6.setVolume方法:设置播放音量
7.setPlayerMute方法:设置播放静音
4. 金山云SDK中的核心方法
上面分析完流媒体SDK中的四个重要类,我们来详细分析一下几个重要的常用函数和方法:
1.第一种方法:添加水印效果
在直播的过程中,我们有时会为了宣传自己或者其他效果而给视频添加水印功能。这也是流媒体过程中的一个重要功能。我们通过源码分析一下他是如何添加水印的:showWaterMarkLogo方法和showWaterMarkTime方法:
1》添加时间戳水印效果:showWaterMarkTime
该方法有五个参数:
第一个参数:水印显示的X坐标
第二个参数:水印显示的Y坐标
第三个参数:时间戳其实是一张图片,水印图片经过缩放(L长度*参数)
第四个参数:时间戳水印颜色
第五个参数:水印透明度
接下来看wmiShowTime方法:
这恰好是一个计时器,每1s 执行一次:
正如你在这里看到的,原来时间戳副本变成了图片。在之前的文章中,我们用同样的方式添加了水印。然后调用KSYStreamer中的setWaterMarkTime方法:
我见过这个方法,它做了两件事。其实想想也是有道理的。添加水印需要在两个地方添加:
第一个是在预览界面GLSurfaceView中。这是给主播看的。
第二个是在视频编码推流期间。这是用户拉流时可以看到的。
我们再看一下w 变量:
方法a被调用:
然后调用z方法:
至此,核心方法就到了。这里我们开始计算坐标、图像大小等信息。这里我们看到paramFloat3是根据指定的宽度乘以比例系数,然后根据长宽比计算出图像的高度。这些比例被初始化使用设置:
下面是这些比例,也是我们看到的KSYStreamerConfig.Builder 类的setVideoResolution 方法提供的设置360P/480P/540P/720P。
计算完比率后,开始调用e对象的setWmiTime方法。我们再看一下e 对象:
原来e对象是FFStreamer类型的,而我们在上面分析SDK函数包的时候就知道这个类是和底层的ffmepg函数进行交互的:
至于底层,也可以看到是直接使用ffmpeg编码的,并且添加了水印效果。
分析到此结束。 SDK中添加时间戳水印的原理是,它内部定义了一个定时器,每隔1秒执行一次任务,然后使用Canvas将当前的时间戳副本转换成图片,然后将传入的参数传递进去。这些参数都是比例系数,因此必须小于1。计算坐标和图像大小。最后调用FFStreamer类的setWmiTime方法,底层使用ffmpeg添加水印效果。
经过上面的分析,编码中的水印效果,我们来看看在预览画面中添加水印的效果:
查看y 类型:
看看这个类:
在本类中没有找到t方法,在父类a中也没有找到。 A继承了x,在x类中找到了t()方法:
查看y 类型:
继承KSYImageFilter类,该类是用于创建图像滤镜效果的基础类:
你看,这里计算完数据后,再次调用a方法开始绘制:
果然,这里我们开始调用OpenGL来绘制图形,即水印效果、图像滤镜效果等都是使用OpenGL技术来绘制的,然后回显到界面上,所以这里我们必须使用GLSurfaceView来预览界面。支持OpenGL功能,可以对图像进行二次处理并显示回界面。我们看一下上面第一个类a,它继承了Render类。我们知道这个类与GLSurfaceView密切相关。渲染器类:
还记得在第一篇文章中介绍了基础知识大纲的时候,不懂的同学可以点击这里:基础知识大纲总结有一张图(点击看大图):
这里我们看到Render类有几个回调方法:
1》onSurfaceCreated(GL10 gl, EGLConfig 配置)
2》onSurfaceChanged(GL10 gl, int 宽度, int 高度)
3》onDrawFrame(GL10 gl)
在GLSurfaceView-setRender-onSurfaceCreated回调方法中构造一个SurfaceTexture对象,然后设置到Camera预览中——SurfaceTexture中的回调方法onFrameAvailable可以知道一帧数据已经准备好了——requestRender通知Render绘制数据——在Render中回调方法onDrawFrame 调用SurfaceTexture 的updateTexImage 方法获取一帧数据,然后开始使用GL 进行绘制。
GLSurfaceView和SurfaceView的另一个区别是onDrawFrame在自己单独的线程中进行操作和绘制,而SurfaceView如果要绘制则在主线程中操作。
2》添加logo图片水印效果:showWaterMarkLogo
该方法的参数为:
第一个参数:图片路径
第二个参数:显示的X坐标
第三个参数:显示Y坐标
第四个参数:图片长度比例
第五个参数:图像高度比例
第六个参数:透明度
从这些参数来看,添加水印只是增加了图像高度比例的比例系数,其他效果与水印相同。而且,分析中添加水印的方法也是类似的。要添加时间戳水印效果,首先将时间戳副本转换为图片。那么接下来的过程就是添加图片水印效果:
所以这里就不多介绍了。
2.第二种方法:对每一帧进行相机数据处理
还有相机的每一帧数据的回调,因为我们从SDK中可以看到,相机Camera是内部定义的,所以对于具体的需求,我们需要发布这个接口,看一下源码:
这里的ksyStreamer是h类型:
这里w 是d 类型:
设置回调方法,d类实现Camera.PreviewCallback接口
然后在回调方法中进行处理。首先调用外部回调接口,将数据扔出去,然后对原始数据进行处理进行流式处理。
因此,SDK内部定义了一个Camera,实现了获取每一帧数据的回调接口,然后在回调方法中将数据抛出去。同时对每一帧数据进行二次处理,并使用FFStreamer进行编码。添加水印推流。
5、金山云SDK使用
至此,我们就介绍了金山云SDK推流的原理,因为底层涉及到ffmpeg进行视频编码和水印效果。后续文章会介绍如何操作。让我们简单看一下一个完整的例子:
1.构造KSYStreamerConfig.Builder类
2.构建KSYStreamer类
3.构造KSYMediaPlayer类
4.构造KSYBgmPlayer类
5.添加水印
6.Camear每一帧数据的处理回调方法
六、技术概述
第一个是添加水印效果
添加水印有两种方法。一是推送后给视频添加水印效果。这是为了让用户看到视频,起到宣传作用。这里主要是利用底层ffmepg函数库来添加水印效果。另一种是在预览中添加水印效果。这是给主播看的。它主要是利用GLSurfaceView的OpenGL技术来添加水印,然后对图片进行回显。
第二个是Camera每一帧数据的回调。
Camera 是在SDK 内部定义的,并且不会公开。然而,对于某些需求,我们希望从相机中获取每一帧数据。这时候我们就可以通过KSYStreamer的回调方法来处理每一帧数据了。
我们用一张图看一下该SDK的大致功能结构(点击可看清晰大图):
项目下载地址:
http://download.csdn.net/detail/jianwei0910410003/9590380
七、总结
相关阅读:
Android中视频直播技术研究—基础知识大纲介绍
Android中视频直播技术研究—ByteBuffer类详解
Android中视频直播技术研究—视频直播服务器环境搭建与运行
Android中视频直播技术研究—摄像头数据采集与分析
在手机上阅读文章有点困难。您可以进入网页版:http://www.wjdiankong.cn
原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/110793.html
用户评论
掉眼泪
我一直想学习一下 Android 直播视频的技术,这篇文章很详细地介绍了 Camera 视频推流的过程,对我来说非常有用!希望能再分享一些常用的直播库和工具。
有8位网友表示赞同!
限量版女汉子
这个标题让我有点好奇啊,之前一直在用手机自带的短视频功能做主播,不知道是不是用的 Camera 推流。希望文章能提供一些比较实际的案例,方便我们学习和模仿.
有12位网友表示赞同!
来瓶年的冰泉
终于找到一篇对 Android 直播视频技术深入讲解的文章!我一直很感兴趣,希望能更详细地了解音频处理的方式,以及如何优化视频编码质量。
有10位网友表示赞同!
*巴黎铁塔
这篇文章的内容很专业,对于初学者来说可能有点难以理解。能不能稍微简化一下语言和流程图?
有11位网友表示赞同!
古巷青灯
作为一名 Android 开发者,学习直播技术非常重要!这篇探究让我明白 Camera 视频推流的核心原理,下一步我打算尝试使用 RTMP 推送到主流直播平台。
有7位网友表示赞同!
何年何念
文章介绍了 Camera 推流的优点和缺点,我很赞同作者的说法,因为在实际应用中往往要权衡视频质量和网络带宽的因素。
有11位网友表示赞同!
寒山远黛
我想了解一下如何在 Android 应用程序中实现多用户的实时互动功能,例如多人同时直播聊天。这篇文章有没有涉及到这些方面的技术?
有19位网友表示赞同!
花菲
文章写的比较客观,对 Camera 视频推流的各种技术细节都进行了详细的分析和讲解,能够帮助我更好地理解这个过程。
有20位网友表示赞同!
剑已封鞘
这篇博文很有深度,对于Android开发中如何克服网络延迟问题,提高直播视频的流畅度进行了深入探究。
有15位网友表示赞同!
无所谓
我一直想把自己的 App 与流行的直播平台集成,希望能看到一些更具体的代码示例和技术方案,让学习更加容易。
有15位网友表示赞同!
野兽之美
作者分析了不同 Android 设备硬件配置对 Camera 视频推流的影响,很有建设性,让我明白了如何根据不同设备进行性能优化。
有16位网友表示赞同!
暮染轻纱
我很期待作者能够后续分享更多关于直播视频处理的知识,例如如何检测和处理网络抖动、画面失真等问题.
有8位网友表示赞同!
败类
这篇文章给我打开了一扇看新的门,学习了 Android 中 Camera 视频推流的技术后,我可以尝试自己开发一些直播软件了!
有12位网友表示赞同!
呆檬
作为一名资深 Android 开发者,我感到这篇博文提供的技术细节比较浅显,对于深入研究这个领域可能还不够透彻。
有14位网友表示赞同!
陌潇潇
希望能有更多关于不同类型的视频码率和分辨率的讨论,以及如何选择合适的方案来保证直播质量
有6位网友表示赞同!
一笑傾城゛
文章提到了 Android 系统的安全机制对 Camera 视频推流的影响,这方面的内容很重要,需要加强重视。
有12位网友表示赞同!
旧爱剩女
学习了一下 Android 中直播视频技术,感觉难度还挺大啊!希望文章能提供更多实战经验和案例分析,让我更好地掌握这方面的知识。
有5位网友表示赞同!
何必锁我心
看了这篇博文,我更想深入研究 Camera 视频推流的技术细节,特别是如何实现实时编码和解码的优化!
有8位网友表示赞同!
单身i
我认为这篇文章缺乏针对不同应用场景的实际技术方案,例如如何开发手机游戏直播平台或网络教育平台的直播功能?
有14位网友表示赞同!
可儿
作者分析了 Camera 视频推流和屏幕录像的区别,非常有帮助!我打算利用这些知识来开发一些新的互动应用程序。
有15位网友表示赞同!