Android中视频直播技术研究:摄像头视频推流

一、前言看到了吧,这里使用手机后置摄像头采集数据,然后推流到服务端,然后本地使用VLC进行观看,因为制作gif的关系,所以画面会有点模糊和卡顿。并不是是本生视频

大家好,关于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方法

Android中视频直播技术研究:摄像头视频推流

=设置时间戳水印效果

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 对象:

Android中视频直播技术研究:摄像头视频推流

原来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

用户评论

Android中视频直播技术研究:摄像头视频推流
掉眼泪

我一直想学习一下 Android 直播视频的技术,这篇文章很详细地介绍了 Camera 视频推流的过程,对我来说非常有用!希望能再分享一些常用的直播库和工具。

    有8位网友表示赞同!

Android中视频直播技术研究:摄像头视频推流
限量版女汉子

这个标题让我有点好奇啊,之前一直在用手机自带的短视频功能做主播,不知道是不是用的 Camera 推流。希望文章能提供一些比较实际的案例,方便我们学习和模仿.

    有12位网友表示赞同!

Android中视频直播技术研究:摄像头视频推流
来瓶年的冰泉

终于找到一篇对 Android 直播视频技术深入讲解的文章!我一直很感兴趣,希望能更详细地了解音频处理的方式,以及如何优化视频编码质量。

    有10位网友表示赞同!

Android中视频直播技术研究:摄像头视频推流
*巴黎铁塔

这篇文章的内容很专业,对于初学者来说可能有点难以理解。能不能稍微简化一下语言和流程图?

    有11位网友表示赞同!

Android中视频直播技术研究:摄像头视频推流
古巷青灯

作为一名 Android 开发者,学习直播技术非常重要!这篇探究让我明白 Camera 视频推流的核心原理,下一步我打算尝试使用 RTMP 推送到主流直播平台。

    有7位网友表示赞同!

Android中视频直播技术研究:摄像头视频推流
何年何念

文章介绍了 Camera 推流的优点和缺点,我很赞同作者的说法,因为在实际应用中往往要权衡视频质量和网络带宽的因素。

    有11位网友表示赞同!

Android中视频直播技术研究:摄像头视频推流
寒山远黛

我想了解一下如何在 Android 应用程序中实现多用户的实时互动功能,例如多人同时直播聊天。这篇文章有没有涉及到这些方面的技术?

    有19位网友表示赞同!

Android中视频直播技术研究:摄像头视频推流
花菲

文章写的比较客观,对 Camera 视频推流的各种技术细节都进行了详细的分析和讲解,能够帮助我更好地理解这个过程。

    有20位网友表示赞同!

Android中视频直播技术研究:摄像头视频推流
剑已封鞘

这篇博文很有深度,对于Android开发中如何克服网络延迟问题,提高直播视频的流畅度进行了深入探究。

    有15位网友表示赞同!

Android中视频直播技术研究:摄像头视频推流
无所谓

我一直想把自己的 App 与流行的直播平台集成,希望能看到一些更具体的代码示例和技术方案,让学习更加容易。

    有15位网友表示赞同!

Android中视频直播技术研究:摄像头视频推流
野兽之美

作者分析了不同 Android 设备硬件配置对 Camera 视频推流的影响,很有建设性,让我明白了如何根据不同设备进行性能优化。

    有16位网友表示赞同!

Android中视频直播技术研究:摄像头视频推流
暮染轻纱

我很期待作者能够后续分享更多关于直播视频处理的知识,例如如何检测和处理网络抖动、画面失真等问题.

    有8位网友表示赞同!

Android中视频直播技术研究:摄像头视频推流
败类

这篇文章给我打开了一扇看新的门,学习了 Android 中 Camera 视频推流的技术后,我可以尝试自己开发一些直播软件了!

    有12位网友表示赞同!

Android中视频直播技术研究:摄像头视频推流
呆檬

作为一名资深 Android 开发者,我感到这篇博文提供的技术细节比较浅显,对于深入研究这个领域可能还不够透彻。

    有14位网友表示赞同!

Android中视频直播技术研究:摄像头视频推流
陌潇潇

希望能有更多关于不同类型的视频码率和分辨率的讨论,以及如何选择合适的方案来保证直播质量

    有6位网友表示赞同!

Android中视频直播技术研究:摄像头视频推流
一笑傾城゛

文章提到了 Android 系统的安全机制对 Camera 视频推流的影响,这方面的内容很重要,需要加强重视。

    有12位网友表示赞同!

Android中视频直播技术研究:摄像头视频推流
旧爱剩女

学习了一下 Android 中直播视频技术,感觉难度还挺大啊!希望文章能提供更多实战经验和案例分析,让我更好地掌握这方面的知识。

    有5位网友表示赞同!

Android中视频直播技术研究:摄像头视频推流
何必锁我心

看了这篇博文,我更想深入研究 Camera 视频推流的技术细节,特别是如何实现实时编码和解码的优化!

    有8位网友表示赞同!

Android中视频直播技术研究:摄像头视频推流
单身i

我认为这篇文章缺乏针对不同应用场景的实际技术方案,例如如何开发手机游戏直播平台或网络教育平台的直播功能?

    有14位网友表示赞同!

Android中视频直播技术研究:摄像头视频推流
可儿

作者分析了 Camera 视频推流和屏幕录像的区别,非常有帮助!我打算利用这些知识来开发一些新的互动应用程序。

    有15位网友表示赞同!

原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/110793.html

Like (0)
小su的头像小su
Previous 2024年8月30日 下午4:38
Next 2024年8月30日 下午4:49

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注