# BLife_libavstream **Repository Path**: mstart/BLife_libavstream ## Basic Information - **Project Name**: BLife_libavstream - **Description**: iavstream致力于为广大安卓应用开发者提供高效,简洁的免费音视频流化解决方案。 - **Primary Language**: Unknown - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 50 - **Created**: 2016-05-30 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 1 库简介 libavstream为安卓而生,开发者可以在自己的APP内通过简单的引用实现高效的音频、视频和音视频的流化传输。在传输协议方面,目前支持RTMP、RTSP协议的C/S广播模式和MPEG-TS流格式P2P模式;在编码格式方面,视频编码采用H.264,,音频采用AAC。在支持的设备类型方面,涵盖了搭载安卓系统的智能手机、平板电脑、智能电视、智能眼镜以及车载设备等移动终端。下面以BLife为例,详细阐述开发者在开发过程中如何正确的使用libavstream库。 2 开发环境 libavstream库与Android Studio开发环境完美适配,采用基于Gradle的构建方式发布于jcenter仓库中。 项目地址为:https://bintray.com/iavstream/maven/libavstream/ 库地址: http://jcenter.bintray.com/com/iavstream/libavstream/ 目前为1.1.0版本,本项目包含四个文件分别为: 1) libavstream-1.1.0-javadoc.jar 2) libavstream-1.1.0-sources.jar 3) libavstream-1.1.0.aar 4) libavstream-1.1.0.pom 其中文件1)为libavstream库的javadoc文件,可以作为API文档使用。2)为源码文件包,包含了所有源代码。文件3)为我们开发中需要调用的aar库文件,在开发过程中通过gradle实现在线自动构建到我们的应用程序中。4)为项目信息描述文件。 如图1所示,在开发过程中我们在Gradle Scripts下面可以看到两个build.gradle文件,一个是Project的,一个是Module的。其中Project的build.gradle内容应设置如图中所示,主要是将远程仓库源设置为jcenter。 图1 BLife的Project gradle文件配置 如图2所示,另外一个是Module的build.gradle文件内容设置设下,最重要的是需要在dependencies中添加依赖项:com.iavstream:libavstream:1.1.0。在添加之后在构建阶段gradle即可从jcenter仓库中获取libavstream库文件完成我们应用程序的编译和链接等相关工作。 图2 BLife的Module gradle文件配置 3 使用权限 Android定义了一种权限方案来保护设备上的资源和功能,所有应用必须通过在AndroidManifest.xml文件中声明相关使用权限。作为开发者,由于libavstream库是以Service 的形式被用户调用,因此需要在开发者的应用AndroidManifest.xml文件中添加一下声明: 声明完后,就可以在相应的源文件中使用CameraService所提供的的方法实现音视频直播传输了。 至于CameraService所使用的相关权限,在libavstream中已经声明,开发者无需在应用中重复声明,libavstream使用的权限如下: 4 API调用 如上所述,我们通过调用CameraService即可以实现基于设备摄像头和麦克的音视频流化传输服务。实现该流程首先需要进行相关参数的配置工作,主要是对MediaParameter进行赋值。然后再定义ServiceConnection对象,在该对象中实现cameraService对象与开发者应用之间的交互。最后是定义connection()函数和disconnection()函数,实现流化传输服务的开启和关闭。 1) 配置MediaParameter public class MediaParameter { //video public int video_fps=12; //1~15fps default:15fps public int video_width=640; //1280x720,640x480, 320x240 default:640x480 public int video_height=480; public int video_camside=2; //1: front 2:back default:back public int video_bitrate=400000; //200kbps~500kbps default:400kbps public int video_quality=3; // 1:high 2normal 3 low //audio public int audio_samplerate=48000; //96000, 88200, 64000, 48000, 44100, 32000, //24000, 22050, 16000, 12000, 11025, 8000, 0 public int audio_channel=1; //1,2 public int audio_format=1; //1:s16 public int audio_bitrate=64000; //1:64000bps //output format type public int formattype=1; //1:video and audio 2:only video 3:only audio public int streamtype=1; //1:mpeg-ts 2:rtsp //mpegts_address public String tsaddress="10.10.10.154"; public String portname="6666"; //rtsp address public String ipaddress="115.28.82.205"; public String sdpfilename="miphone.sdp"; boolean equals(MediaParameter mp); // compare two parameters String GetMpegTsAddress(int streamtype,String tsaddress,String portname); } MediaParameter定义为一个类,包含了视频相关参数、音频相关参数、输出流的内容类型和传输类型以及目的地址等相关信息。用户的使用方法为示例如下: import com.iavstream.libavstream.MediaParameter; ....... MediaParameter mediaparameter= null; mediaparameter.formattype=1; //音视频同时传输 ....... 2) 定义ServiceConnection import com.iavstream.libavstream.CameraInterface.OnJniStateChangeListener; import com.iavstream.libavstream.CameraService; import com.iavstream.libavstream.CameraTextureView; import com.iavstream.libavstream.MediaParameter; float previewRate = -1f; SurfaceTexture mSurface; private CameraService cameraService; MediaParameter mediaparameter= null; private ServiceConnection sc = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { //connect Service cameraService = ((CameraService.MyBinder) (service)).getService(); if(cameraService != null) { mediaparameter=getMediaParameter(); cameraService.prepare(mediaparameter); cameraService.startpreview(mSurface, previewRate); cameraService.getCameraInterface().setOnJniStateChangeListener( new OnJniStateChangeListener(){ public void OnJniStateChange(int state) { String str = "no error"; switch (state) { case -1: str="分配上下文错误";break; case -2: str="无法连接到服务器,请检查后重试";break; case -3: str="无法连接到服务器,请检查后重试";break; case -4: str="视频编码出错";break; case -5: str="音频编码出错";break; case -6: str="网络质量差,传输中断";break; case -7: str="网络质量差,传输中断";break; case -8: str="网络质量差,传输中断";break; } DisplayToast("错误 :"+str); cameraService.stop(); cameraService = null; } }); } } @Override public void onServiceDisconnected(ComponentName name) { //disconnect Service cameraService.stop(); cameraService = null; } }; 在使用CameraService之前,需要开发者定义ServiceConnection对象并将其实例化,并且重载onServiceConnected和onServiceDisconnected函数,在这两个函数中完成开发者应用与CameraService的交互。下面就使用的方法分别说明: cameraService.prepare(mediaparameter); 该方法用于实现传输参数的配置,mediaparameter为配置好的相关参数,返回值为void; cameraService.startpreview(mSurface, previewRate); 该方法用于启动音视频传输服务,mSurface为SurfaceTexture对象,用于指定视频预览窗口;返回值为void; previewRate为float变量,指定了预览视频窗口的宽高比。 cameraService .getCameraInterface() .setOnJniStateChangeListener( new OnJniStateChangeListener() { public void OnJniStateChange(int state) { String str = "no error"; switch (state) { case -1: str="分配上下文错误";break; case -2: str="无法连接到服务器,请检查后重试";break; case -3: str="无法连接到服务器,请检查后重试";break; case -4: str="视频编码出错";break; case -5: str="音频编码出错";break; case -6: str="网络质量差,传输中断";break; case -7: str="网络质量差,传输中断";break; case -8: str="网络质量差,传输中断";break; } DisplayToast("error :"+str); cameraService.stop(); cameraService = null; } }); CameraService曝露了OnJniStateChangeListener接口,开发者可以根据流媒体引擎的工作状态参数state在应用中作出相应处理。定义完接口之后,cameraService .getCameraInterface() .setOnJniStateChangeListener( OnJniStateChangeListener jnistate)来指定开发者自定义的OnJniStateChangeListener接口。如果出错,就是用cameraService.stop()停止音视频流化传输服务。 public void onServiceDisconnected(ComponentName name); 当Service服务停止连接时,使用cameraService.stop()停止音视频流化传输服务。 3) 定义connection()函数和disconnection()函数 private void connection() { Intent intent = new Intent("com.iavstream.libavstream.CameraService"); getActivity().bindService(intent, sc, Context.BIND_AUTO_CREATE); } private void disconnection() { if(sc != null){ getActivity().unbindService(sc); } } 定义connection()函数绑定"com.iavstream.libavstream.CameraService"服务,同时指定ServiceConnection对象为步骤2中开发者自定义的sc。最后定义了disconnection()来解绑我们的"com.iavstream.libavstream.CameraService"服务。至此,开发者可以使用connection()函数使用iAVStream所提供的的音视频流化技术,使用disconnection() 停止该服务。