b站IJKPlayer试用问题
So包不是自己编译的,编译过程中出现了各种问题(没有linux/pre_event头文件和最开始编译FFmpeg一样的问题,后来看了下就是在编译FFMpeg的时候报了这个错误,因为之前编译FFmpeg的时候就在google上查到是因为版本太新(准确说是编译脚本.sh更不上版本的问题)就手动将里面的ffmpeg换位旧一点的版本,这个错误没了,但是还有其他错误),就放弃了自己编译,选择使用别人编译好了的,链接为:链接:https://pan.baidu.com/s/1w4H0aPrmIfBnzuRNIW-UcA 密码:5hv2。(git上下太慢了,我用代理下的,这个是百度云链接。很讨厌发CSDN赚积分的,居然有个人把这个放上面还说太大了,分了3次(每次下载都是3分,马化腾都没你会想),要3个一起解压才能用,为了赚积分也是费了点脑筋。。。。)
解决了这个问题就开始想怎么把这个放到AS中去,找了很多很多,但是有用的文章几乎没有,最后用的是这个https://blog.csdn.net/hisonedumobile/article/details/53119134#reply#reply的,很感谢这位博主,写的很详细,除了这个我没有看到有这么详细的了,一定注意tool文件夹要放进去,不然会有个报错apply from: new File(rootProject.projectDir, "tools/gradle-on-demand.gradle"); 然后就是在使用的时候的问题了,主要就是IJK里面使用的'com.android.support:appcompat-v7:23.1.0'我这个时间用的是26版本的,这个要根据自己的更改,否则会导致XML布局文件异常,去网上查各种方法都不行,有说该style的主题的,有让改版本的都不行,后来自己去看了看有红色波浪线的那,
发现说的是混合的版本会导致混乱mixed.....lead to crash,然后就去example里面的gradle文件里面改一下就好了,下面两个里面没有什么要改的了。。。。这个颜色怎么改啊,改不回去了。
再此之外还有可能遇到两个@@那里报错,删掉一个也没用,他会自己加上来,解决办法是:在工程根目录下的
gradle.properties里面加上一句android.enableAapt2=false,至于原因,我也不是太清楚。
最后附上我自己移植用的一个算是方便一点的、必要的几个文件压缩包,链接:https://pan.baidu.com/s/1crJITy2UuMDwaXqsIu3N8w 密码:ctyl。使用方法为分别将这三个包Import Module进去,然后在File->projectStructure->app->dependencies->Module dependency里面添加这三个,我这里可以看到最下面有了。
再把那个txt文件复制到build.gradle文件中去,我这里就会出现两个@@那里报错,然后按照上述方法添加一句话,就没有什么要做的了,可以正常使用IJKplayer了。
但是对于我们来说移植是要用的啊,不是移植了就完事了的,接下来就是简单使用这个来拉流、播放视频等等,由于水平限制,这里就很简单很简单的使用了下,这里有一些直播地址,可以试下
rtmp://live.hkstv.hk.lxdns.com/live/hks
http://live-cdn.kksmg.com/channels/tvie/ylpd/flv:sd/live
XML我就不拿出来了,就是一个surfaceview,是一般的surfaceview,不是IJK里面的,我这里叫SV,然后就是activity了:
public class MainActivity extends AppCompatActivity{
private SurfaceView SV;
final String Path = "rtmp://live.hkstv.hk.lxdns.com/live/hks";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
setContentView(R.layout.activity_main);
SV = findViewById(R.id.SV);
IJKVD MyPlay = new IJKVD(SV,Path);
// MyPlay.Start_Play();
}
}
为了好用,IJKVD是我自己封装了一个类:public class IJKVD implements SurfaceHolder.Callback{
IjkMediaPlayer IJKMP;
MediaInfo MI;
public IJKVD(SurfaceView SV,String Path){
IjkMediaPlayer.loadLibrariesOnce(null);
IjkMediaPlayer.native_profileBegin("libijkplayer.so");
SV.getHolder().addCallback(this);
IJKMP = new IjkMediaPlayer();
MI = new MediaInfo();
try {
IJKMP.setDataSource(Path);
} catch (IOException e) {
e.printStackTrace();
}
IJKMP.prepareAsync();
IJKMP.start();
while(MI.mVideoDecoder==null)
MI = IJKMP.getMediaInfo();
SV.setLayoutParams(new ConstraintLayout.LayoutParams(MI.mMeta.mVideoStream.mWidth,MI.mMeta.mVideoStream.mHeight));
}
//开始播放
public void Start_Play(){
IJKMP.start();
MI = IJKMP.getMediaInfo();
}
//暂停播放
public void Pause_Play(){
}
//停止播放,并释放资源
public void Stop_Play(){
}
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
IJKMP.setDisplay(surfaceHolder);
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
}
}
然后就可以显示那个电视的直播啦!下一篇: JavaFX + CSS 开发登陆界面