前几天 项目经理给了一个需求,是一个报警功能,类似直播,可以拍摄身边的景象上传到服务器,当时还以为是录制视频然后回传给服务器,后来上网google了一下 才发现不是这个样子的。
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。
编码和推流,有两种方法来实现:
一、javacv来实现
javacv地址:https://github.com/bytedeco/javacv
demo地址:https://github.com/beautifulSoup/RtmpRecoder/tree/master
二、使用Android自带的编码工具,可实现硬编码,这里有一个开源的封装很完善的库yasea,进行一些简单配置就可以实现编码推流,并且yasea目前已经直接支持摄像头的热切换,和各种滤镜效果。
yasea地址:https://github.com/begeekmyfriend/yasea
非常简单,只要导入library,并添加一些权限就可以了。
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<usespermissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
<net.ossrs.yasea.SrsCameraView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/glsurfaceview_camera"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
//java代码 需要实现接口 implements SrsEncodeHandler.SrsEncodeListener, RtmpHandler.RtmpListener, SrsRecordHandler.SrsRecordListener
SrsCameraView cameraView = (SrsCameraView) findViewById(R.id.glsurfaceview_camera)
mPublisher = new SrsPublisher(cameraView);
//编码状态回调
mPublisher.setEncodeHandler(new SrsEncodeHandler(this));
mPublisher.setRecordHandler(new SrsRecordHandler(this));
//rtmp推流状态回调
mPublisher.setRtmpHandler(new RtmpHandler(this));
//预览分辨率
mPublisher.setPreviewResolution(1280, 720);
//推流分辨率
mPublisher.setOutputResolution(720, 1280);
//传输率
mPublisher.setVideoHDMode();
//开启美颜(其他滤镜效果在MagicFilterType中查看)
mPublisher.switchCameraFilter(MagicFilterType.BEAUTY);
//打开摄像头,开始预览(未推流)
mPublisher.startCamera();
//mPublisher.switchToSoftEncoder();//选择软编码
mPublisher.switchToHardEncoder();//选择硬编码
//开始推流 rtmpUrl(ip换成服务器的部署ip):"rtmp://192.168.31.126/android/teststream"
mPublisher.startPublish(rtmpUrl);
是不是很简单呢?