干货教程:Android采集音视频上传服务器
优采云 发布时间: 2020-09-10 08:50Android捕获音频和视频上传服务器
本文中的相关代码位于:单击以打开链接
尽管我一直在进行音频和视频相关的开发,但从未接触过Android开发。由于一些巧合,我决定在Android上进行音频和视频采集
。
起初我没有接触过Android开发,所以我寻找了一个在线教程,然后我在github上找到了一个与音频和视频采集
相关的演示,并根据自己的理解逐步对其进行了更改演示。由于我们需要使用Android硬代码,因此我们位于Android 5. 0版本之上。
音频和视频捕获和编码基本上基于Webrtc相关部分的代码。用于视频捕获的Camera2和用于视频编码的MediaCodec被编码为H264。在视频捕获和编码之前,它还涉及YUV的旋转。获取旋转角度的方法参考Webrtc的相关代码,通过集成的Libyuv实现旋转。用于音频采集
的AudioRecord,这是为了解释在Webrtc代码中取消了软实现的噪声抑制和回声消除,因为此开销相对较大。使用时并没有排除它,因为我认为拥有某物总比没有好。音频编码我使用AAC,Webrtc是窄带音频编码,没有AAC编码,因此我根据视频编码编写了AAC编码。
后面的部分
用C ++实现,由NDK编译,并由Java层通过JNI调用。编码的音频和视频流被打包到RTP数据包中。 RTP打包主要是指FFmpeg的代码。然后通过专用协议将其上传到服务器。服务器由我自己实现,专用协议格式由我自己确定。除了传输音频和视频RTP数据包外,我还提出了登录请求。消息主体使用Json,并且Json解析是通过集成的JsonCpp实现的。网络传输部分主要依靠我自己打包的跨平台网络中间件k_util,可以在Windows,Linux和Android平台上使用。如果将kqueue封装了,它也可以在IOS平台上使用。
开发中遇到了三个主要困难。首先是多线程。我第一次使用Java。我通常使用C ++。我觉得Java正在削弱线程的概念,但是线程确实存在,所以我经常遇到跨线程访问失败的问题,最后通过了Locked解决方案。第二个是屏幕旋转问题。最初,屏幕旋转会破坏并重新创建View,这显然是不可取的。后来,参考Internet上的方法,屏幕旋转不会破坏View,但是编码视频的方向始终是错误的。请参考Webrtc的相关代码来解决。第三个是本机层回调Java。登录返回结果的分析在本机层中完成,并且需要将结果通知主线程以更新UI。请参考联机方法以实现本机回调Java方法,然后通过Handler通知主线程更新UI。
该代码已在我的中兴刀片A3手机(Android版本7. 0)上通过了测试。
相应服务器的代码在这里:单击以打开链接