android视频直播的实现(安卓在线直播)
对于直播的播放器,目前大部分的软件都是通过实现ffmpeg来进行录制、转换以及流化音视频的一套解决方案,不过由于编译与开放FFMPEG是基于Linux来编译的,可能会遇到很多的问题,所以做起来也并不是这么容易,所以我们可以通过一些开源的工具接入到我们的视频直播播放器。这个就是ijkplayer,目前花椒、映客的客户端都是通过这个开源的工具来实现直播功能的。我的项目也把exo删除了。对于直播的播放器
对于直播的播放器,目前大部分的软件都是通过实现ffmpeg来进行录制、转换以及流化音视频的一套解决方案,不过由于编译与开放FFMPEG是基于Linux来编译的,可能会遇到很多的问题,所以做起来也并不是这么容易,所以我们可以通过一些开源的工具接入到我们的视频直播播放器。这个就是ijkplayer,目前花椒、映客的客户端都是通过这个开源的工具来实现直播功能的。我的项目也把exo删除了。
对于直播的播放器,目前大部分的软件都是通过实现ffmpeg来进行录制、转换以及流化音视频的一套解决方案,不过由于编译与开放FFMPEG是基于Linux来编译的,可能会遇到很多的问题,所以做起来也并不是这么容易,所以我们可以通过一些开源的工具接入到我们的视频直播播放器。这个就是ijkplayer,目前花椒、映客的客户端都是通过这个开源的工具来实现直播功能的。如果对我的文章感兴趣,欢迎订阅我的头条号:一点热,yeehot.com 上一节,我介绍了如何使用使用Nginx搭建视频直播服务器,那么,今天我们继续回以这个服务器作为推流的接收地址,那么我们开始如何嵌入ijkplayer到我们的应用 快速入口 ijkplayer的github地址为:https://github.com/Bilibili/ijkplayer 我们需要将ijkplayer的源码下载到本地,在下载前,我们需要做一些准备工作 我这里的环境是mac,如果不是MAC的话,也可以运行在Linux下,其实也是一样,windows就需要安装cgwin 1、首先我们需要安装homebrew, git, yasm 这里我就不做详细的介绍,毕竟这个不是今天的重点 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" brew install git brew install yasm 2、配置Android sdk和Android NDK环境变量 我们从Android官网下载相应的SDK和NDK,大家最好就下载最新版本的NDK,我这里是 NDKr12.1.2977051 detected 下载好后大家可以直接输入 vi /etv/profile 或者是 sudo vi ~/.bash_profile source ~/.bash_profile 3、下载ijkplaer 以下这几个过程的时间可能会比较长,大家耐心的等待吧。 git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android cd ijkplayer-android git checkout -B latest k0.6.0 ./init-android.sh cd android/contrib ./compile-ffmpeg.sh clean ./compile-ffmpeg.sh all cd .. ./compile-ijk.sh all 编译的过程会,显示出一大堆的C相关的数据,最后转换成.so文件 最后在Android目录下,会看到很多的架构的文件,点击进去会看到我们需要的.so文件 我们点击Android studio的file->new->import module,然后选择我们刚刚下载的ijkplayer-android项目,选中ijkplayer 然后会出现如下的提示,我这里由于项目已经添加了,所以出现警告,我们不要把example添加进去就好了。我的项目也把exo删除了。 5、修改一下我们的build.gradle,特别要注意黑体字部分 代码如下 android { compileSdkVersion 23 buildToolsVersion "23.0.2" allprojects { repositories { jcenter() } } defaultConfig { applicationId "com.yeehot.lession1" minSdkVersion 9 targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } ext { compileSdkVersion = 23 buildToolsVersion = "23.0.2" minSdkVersion = 9 targetSdkVersion = 23 } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.4.0' compile 'com.android.support:preference-v7:23.4.0' compile 'com.squareup:otto:1.3.8' compile project(':ijkplayer-java') compile project(':ijkplayer-armv7a') } 6、根据需要把sample里面的widget和services部分代码复制到自己的项目中, 我项目复制的代码如下图所示 7、修改AndroidManifest.xml,播放的页面要添加播放的种类,还有添加我们的播放服务MediaPlayerService <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="video/*" /> <data android:mimeType="audio/*" /> <data android:scheme="http" /> <data android:scheme="file" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="video/*" /> </intent-filter> </activity> <service android:name="com.yeehot.lession1.services.MediaPlayerService" android:enabled="false" android:exported="false" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" > </service> </application> </manifest> 8、最后我们可以在我们的播放页面写代码了,推送流我们用上一节服务器的地址rtmp://192.168.3.6/live public class MainActivity extends AppCompatActivity { private String mVideoPath; private Uri mVideoUri; private IjkVideoView mVideoView; private Settings mSettings; private boolean mBackPressed; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 加载静态SO IjkMediaPlayer.loadLibrariesOnce(null); IjkMediaPlayer.native_profileBegin("libijkplayer.so"); mSettings = new Settings(this); // handle arguments //yeehot.com mVideoPath = "rtmp://192.168.3.6/live"; // mMediaController.setSupportActionBar(actionBar); mVideoView = (IjkVideoView) findViewById(R.id.video_view); mVideoView.setOnInfoListener(new IMediaPlayer.OnInfoListener() { @Override public boolean onInfo(IMediaPlayer mp, int what, int extra) { Log.e("直播输出",mp.getDuration()+"-"+what+"-"+extra); return false; } }); // prefer mVideoPath if (mVideoPath != null) mVideoView.setVideoPath(mVideoPath); else if (mVideoUri != null) mVideoView.setVideoURI(mVideoUri); else { // Log.e(TAG, "Null Data Source\n"); finish(); return; } mVideoView.start(); } @Override public void onBackPressed() { mBackPressed = true; super.onBackPressed(); } @Override protected void onStop() { super.onStop(); if (mBackPressed || !mVideoView.isBackgroundPlayEnabled()) { mVideoView.stopPlayback(); mVideoView.release(true); mVideoView.stopBackgroundPlay(); } else { mVideoView.enterBackground(); } IjkMediaPlayer.native_profileEnd(); } } 我们这个main.xml布局为 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.yeehot.lession1.MainActivity" android:background="@android:color/transparent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="你好,yeehot.com。怎么找你?" /> <com.yeehot.lession1.widget.media.IjkVideoView android:id="@+id/video_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center"></com.yeehot.lession1.widget.media.IjkVideoView> </FrameLayout> 最终效果如下 今天就讲到这里,欢迎继续关注我的头条号:一点热,yeehot.com,如果有什么问题,欢迎留言咨询,我看到之后会第一时间回复大家的。也欢迎收藏与转发,如果需要转载到其他网站,请与我联系4、将ijkplayer添加到我们的项目
实际的还需要我们修改,我这里只是简单的加入我们的播放器