欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

b站IJKPlayer试用问题

程序员文章站 2024-03-22 23:09:46
...

    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的主题的,有让改版本的都不行,后来自己去看了看有红色波浪线的那,

b站IJKPlayer试用问题

发现说的是混合的版本会导致混乱mixed.....lead to crash,然后就去example里面的gradle文件里面改一下就好了,下面两个里面没有什么要改的了。。。。这个颜色怎么改啊,改不回去了。


b站IJKPlayer试用问题

再此之外还有可能遇到两个@@那里报错,删掉一个也没用,他会自己加上来,解决办法是:在工程根目录下的

gradle.properties里面加上一句android.enableAapt2=false,至于原因,我也不是太清楚。

最后附上我自己移植用的一个算是方便一点的、必要的几个文件压缩包,链接:https://pan.baidu.com/s/1crJITy2UuMDwaXqsIu3N8w 密码:ctyl。使用方法为分别将这三个包Import Module进去,然后在File->projectStructure->app->dependencies->Module dependency里面添加这三个,我这里可以看到最下面有了。

b站IJKPlayer试用问题再把那个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) {

    }
}
    然后就可以显示那个电视的直播啦!


相关标签: IJKPlayer Adroid