在GSYVideoPlayer中实现VLC 内核

本文介绍如何为GSYVideoPlayer添加VLC内核支持,以解决不支持h265格式的avi文件播放的问题。通过继承AbstractMediaPlayer创建VLCMediaPlayer,并实现了BasePlayerManager接口。

GSYVideoPlayer 是一个比较火的开源框架。其支持Android 系统中的MediaPlayer内核,ExoPlayer 内核, ijkPlayer 内核。 在我使用的过程中发现不支持h265格式的avi 文件播放,所以我实现了一个VLC内核。

1.继承AbstractMediaPlayer,VLCMediaPlayer.java

public class VLCMediaPlayer extends AbstractMediaPlayer {
    private final LibVLC mLibVLC ;
    private final MediaPlayer mInternalMediaPlayer;
    private String mDataSource;
    private final VLCMediaPlayerListenerHolder mInternalListenerAdapter;
    private final Object mInitLock = new Object();

    private static MediaInfo sMediaInfo;
    private Media mCurrentMedia = null;
    //默认设为1,等开始播放后才能获取到正确的视频宽高
    private int videoWidth=1,videoHeight=1;
    public VLCMediaPlayer() {
        synchronized (mInitLock) {
            ArrayList<String> options = new ArrayList<String>();
            options.add("--avcodec-codec=h265,h264");
            options.add("--rtsp-tcp");
            options.add("--aout=opensles");
            options.add("--audio-time-stretch");
            options.add("-vvv");
            mLibVLC = new LibVLC(SYunApplication.getInstance(),options);
            mInternalMediaPlayer = new MediaPlayer(mLibVLC);
        }
       mInternalListenerAdapter= new VLCMediaPlayerListenerHolder(this);
        attachInternalListeners();
    }

    private void attachInternalListeners() {
        mInternalMediaPlayer.setEventListener(mInternalListenerAdapter);
    }

    @Override
    public void setDisplay(SurfaceHolder sh) {
        Timber.e("call setDisplay ");
    }
@Override
    public void setDataSource(Context context, Uri uri) throws IOException, IllegalArgumentException, SecurityException, IllegalStateException {
        mCurrentMedia = new Media(mLibVLC, uri);
        mInternalMediaPlayer.setMedia(mCurrentMedia);
    }

    @Override
    public void setDataSource(Context context, Uri uri, Map<String, String> headers) throws IOException, IllegalArgumentException, SecurityException, IllegalStateException {
        mCurrentMedia = new Media(mLibVLC, uri);
        mInternalMediaPlayer.setMedia(mCurrentMedia);
    }

    @Override
    public void setDataSource(FileDescriptor fd) throws IOException, IllegalArgumentException, IllegalStateException {
        mCurrentMedia = new Media(mLibVLC, fd);
        mInternalMediaPlayer.setMedia(mCurrentMedia);
    }

 @Override
    public void setDataSource(String path) throws IOException, IllegalArgumentException, SecurityException, IllegalStateException {
        mDataSource=path;
        Timber.e(path);
        if(path.startsWith("http")||path.startsWith("rtsp")){
            mCurrentMedia = new Media(mLibVLC, Uri.parse(mDataSource));
        }else {
            mCurrentMedia = new Media(mLibVLC, path);
        }
        mInternalMediaPlayer.setMedia(mCurrentMedia);
    }

    @Override
    public String getDataSource() {
        return mDataSource;
    }
 @Override
    public void prepareAsync() throws IllegalStateException {
        mCurrentMedia.addOption(":video-paused");
        mInternalMediaPlayer.play();
    }

    @Override
    public void start() throws IllegalStateException {
         Timber.e("start");
        mInternalMediaPlayer.play();
    }

    @Override
    public void stop() throws IllegalStateExc
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值