vlc-android的视频播放部分的解析

本文深入探讨了视频播放过程中的关键组件和技术,包括LibVLC类的音频和字幕控制,MediaDatabase类的视频信息管理和MediaLibrary类的音频、视频列表查找。详细介绍了EventHandler类在状态变化时的回调机制及消息处理流程,特别关注了视频播放时的事件响应和状态改变处理,以及如何通过IVideoPlayer接口实现SurfaceView的大小调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个视频文件通常有一个视频轨,多个音频轨,多个字幕轨;
多个音频轨 国语音轨,英语音轨,粤语音轨之类的
多个字幕轨 英语字幕轨 中文字幕轨 日文字幕轨之类的
播放视频的时候可以切换音频轨和切换字幕轨
LibVLC类主要负责控制音频和视频的播放暂停等,还负责音频轨和字幕轨的切换
播放视频是在surfaceview上进行的,可以设置媒体列表后进行上一首,下一首

MediaDatabase类主要负责视频播放保存和获取视频信息(播放时间),还有
保存和获取搜索到的音频列表和视频列表

MediaLibrary类就是负责查找设备上音频和视频列表,返回视频列表和音频列表

EventHandler也是一个很重要的类,是一个单例模式的,用户如果需要监听LibVLC播放音视频
的状态,就调用addHandler(Handler)方法进行注册,EventHandler里面有一个callback函数,
他是由LibVLCnative层调用通知用户状态发生变化

这个Handler里面处理的消息有
public static final int MediaParsedChanged = 3;
//public static final int MediaFreed = 4;
//public static final int MediaStateChanged = 5;

//public static final int MediaPlayerMediaChanged         = 0x100;
//public static final int MediaPlayerNothingSpecial       = 0x101;
//public static final int MediaPlayerOpening              = 0x102;
//public static final int MediaPlayerBuffering            = 0x103;
public static final int MediaPlayerPlaying                = 0x104;
public static final int MediaPlayerPaused                 = 0x105;
public static final int MediaPlayerStopped                = 0x106;
//public static final int MediaPlayerForward              = 0x107;
//public static final int MediaPlayerBackward             = 0x108;
public static final int MediaPlayerEndReached             = 0x109;
public static final int MediaPlayerEncounteredError       = 0x10a;

接收到消息后的处理
 @Override
    public void handleMessage(Message msg) {
        VideoPlayerActivity activity = getOwner();
        if(activity == null) return;
        // Do not handle events if we are leaving the VideoPlayerActivity
        if (activity.mSwitchingView) return;

        switch (msg.getData().getInt("event")) {
            case EventHandler.MediaParsedChanged:
                Log.i(TAG, "MediaParsedChanged");
                if (activity.mLibVLC.getVideoTracksCount() < 1) {
                    Log.i(TAG, "No video track, open in audio mode");
                    activity.switchToAudioMode();
                }
                break;
            case EventHandler.MediaPlayerPlaying:
                Log.i(TAG, "MediaPlayerPlaying");
                activity.stopLoadingAnimation();
                activity.showOverlay();
                /** FIXME: update the track list when it changes during the
                 *  playback. (#7540) */
                activity.setESTrackLists(true);
                activity.setESTracks();
                activity.changeAudioFocus(true);
                break;
            case EventHandler.MediaPlayerPaused:
                Log.i(TAG, "MediaPlayerPaused");
                break;
            case EventHandler.MediaPlayerStopped:
                Log.i(TAG, "MediaPlayerStopped");
                activity.changeAudioFocus(false);
                break;
            case EventHandler.MediaPlayerEndReached:
                Log.i(TAG, "MediaPlayerEndReached");
                activity.changeAudioFocus(false);
                activity.endReached();
                break;
            case EventHandler.MediaPlayerVout:
                activity.handleVout(msg);
                break;
            case EventHandler.MediaPlayerPositionChanged:
                if (!activity.mCanSeek)
                    activity.mCanSeek = true;
                //don't spam the logs
                break;
            case EventHandler.MediaPlayerEncounteredError:
                Log.i(TAG, "MediaPlayerEncounteredError");
                activity.encounteredError();
                break;
            case EventHandler.HardwareAccelerationError:
                Log.i(TAG, "HardwareAccelerationError");
                activity.handleHardwareAccelerationError();
                break;
            default:
                Log.e(TAG, String.format("Event not handled (0x%x)", msg.getData().getInt("event")));
                break;
        }

播放视频的时候需要实现IVideoPlayer接口 处理设置surface的大小

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值