最近在做直播项目,说说我这几天查资料得到的结果,直播大概分三个麻烦的地方,推流,拉流,聊天室;
最简单的方式就是使用一个第三方的服务商,使用它们的配套sdk(直播神马的 辣鸡。。。)
最复杂的便是全都自己写(在这个开源时代,说说就好了。。。)
由于我在的厂有点奇葩····(自己搭了推流服务器~~好吧,老大你赢了!)
所以我选择这么做:
推流
我选择用的是百度的推流sdk(免费,文档详细···)
拉流
拉流其实就是播放,使用bilibili开源的 ijkplayer播放器 这个播放器是基于 FFmpeg (这个项目基本上是现在直播这边的始祖了~)
聊天室
这块打算用腾讯云或者网易云信(主要看老大意思,要是他选择自己塔服务器我也没辙~~!)
ijkplayer集成
// # required, enough for most devices.
compile 'tv.danmaku.ijk.media:ijkplayer-java:0.7.5'
compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.7.5'
// # Other ABIs: optional
compile 'tv.danmaku.ijk.media:ijkplayer-armv5:0.7.5'
// compile 'tv.danmaku.ijk.media:ijkplayer-arm64:0.7.5' 最低支持21
compile 'tv.danmaku.ijk.media:ijkplayer-x86:0.7.5'
// compile 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.7.5' 最低支持21
// # ExoPlayer as IMediaPlayer: optional, experimental
compile 'tv.danmaku.ijk.media:ijkplayer-exo:0.7.5'
百度推流SDK
下载百度推流的SDK,然后导入so和lib,再加载jni
sourceSets.main {
jni.srcDirs = []
jniLibs.srcDir 'src/main/libs'
}
task nativeLibsToJar(type: Zip, description: "create a jar archive of the native libs") {
destinationDir file("$projectDir/libs")
baseName "Native_Libs2"
extension "jar"
from fileTree(dir: "libs", include: "**/*.so")
into "lib"
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn(nativeLibsToJar)
}
一切看起来很美好,但是:
开始明明好好的,一加载了百度推流的SDK就出毛病了!!!
提示也很奇怪,找不到 xxx.so 文件,首先想到的是不是引用了重复的so,然后去网上查ijkplayer加载so的方法,发现他的so是动态加载的(具体可以看 这里)这种引入的方式导致我们无法对 ijkplayer 的so进行操作(其实ijkplayer 网上有人家编译好的so,这里我就没做尝试了。。。) 后来在 这里 找到了问题关键
做法就很简单了:
在app的build.gradlede 中的 defaultConfig{}里面加上
ndk{
moduleName "libFaceSDK.so" //设置库(so)文件名称
moduleName "libfaceu-library.so" //设置库(so)文件名称
moduleName "libffmpeg.so" //设置库(so)文件名称
moduleName "libidl_license.so" //设置库(so)文件名称
moduleName "libidl_token.so" //设置库(so)文件名称
moduleName "librecorder.so" //设置库(so)文件名称
moduleName "librtmp_jni.so" //设置库(so)文件名称
ldLibs "log"
abiFilters "armeabi-v7a", "x86_64"
}
到此就ok了。