文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android Vitamio和ExoPlayer播放器的优劣势是什么

2023-07-05 22:58

关注

本篇内容介绍了“Android Vitamio和ExoPlayer播放器的优劣势是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Vitamio是一个功能强大而稳定的播放器库,它支持多种视频格式和编解码方式,并且具有快速、流畅的播放效果,因此在一些对播放质量要求比较高的应用场景下可以考虑使用。但是需要注意的是,Vitamio的开发团队近些年来已经较少更新和维护,不支持较新的Android版本(如Android 7.0及以上版本),因此在一些需要支持最新Android版本的应用中,可能需要考虑其他选项。

ExoPlayer是Google推出的一个功能强大的播放器库,它支持多种视频格式和编解码方式,具有良好的扩展性和定制性,可以通过插件等方式支持更多的功能和数据源。与Vitamio相比,ExoPlayer的开发团队更新迭代更为频繁,并且具有良好的Google生态环境(如与Android Studio的良好兼容等),因此在一些需要开发更加灵活、定制化的应用中,可以优先考虑使用。

总之,Vitamio和ExoPlayer都是非常优秀的播放器库,具体使用哪一个要根据你的实际需求来选择。如果你的应用比较老,需要支持7.0以下的Android版本,那么可以考虑使用Vitamio;如果你需要开发更加灵活、定制化的播放器,那么可以考虑使用ExoPlayer。

ExoPlayer支持音频播放。事实上,ExoPlayer可以用于播放视频、音频和流媒体等多种媒体格式。由于其良好的架构设计和强大的扩展性,ExoPlayer可以通过插件等方式支持更多的格式和功能,满足不同应用场景下的需求。

如果你需要使用ExoPlayer进行音频播放,可以通过以下步骤进行操作:

示例代码如下:

// 添加ExoPlayer库依赖implementation 'com.google.android.exoplayer:exoplayer-core:2.14.1'// 创建SimpleExoPlayer对象SimpleExoPlayer player = new SimpleExoPlayer.Builder(context).build();MediaItem mediaItem = MediaItem.fromUri(audioUri);player.setMediaItem(mediaItem);// 进行播放控制player.prepare();player.play();

需要注意的是,这只是一个简单的音频播放示例,实际使用中可能需要更复杂的逻辑处理,例如错误处理、缓冲控制等。另外,需要根据实际需求选择合适的数据源类型、音频编码等参数。

进一步封装ExoPlayer使用:

对于ExoPlayer的使用,我们可以进行一些进一步的封装,将ExoPlayer的初始化、播放等操作封装在一个类里,便于在整个应用程序中使用。

封装需要考虑以下几个方面:

以下是一个完美封装的示例:

public class AudioPlayer implements Player.EventListener {  private SimpleExoPlayer player;  private PlayerStateListener playerStateListener;  private Context context;  private Uri currentUri;  private boolean playWhenReady = true;  // 播放器状态回调接口  public interface PlayerStateListener {    void onPlayerStateChanged(boolean playWhenReady, int playbackState);    void onPositionUpdated(long position, long duration);    void onError(ExoPlaybackException error);  }  // 初始化操作,在Activity或Fragment中调用  public void init(Context context, Uri uri) {    this.context = context;    this.currentUri = uri;    player = new SimpleExoPlayer.Builder(context).build();    player.setMediaItem(MediaItem.fromUri(uri));    player.addListener(this);    player.prepare();  }  // 播放操作  public void play() {    if (player != null) {      player.setPlayWhenReady(playWhenReady);    }  }  // 暂停操作  public void pause() {    if (player != null) {      player.setPlayWhenReady(false);    }  }  // 停止操作  public void stop() {    if (player != null) {      player.stop();    }  }  // 释放操作,在Activity或Fragment销毁时调用  public void release() {    if (player != null) {      player.release();      player.removeListener(this);      player = null;    }  }  // 设置播放状态回调接口  public void setPlayerStateListener(PlayerStateListener listener) {    this.playerStateListener = listener;  }  // 获取当前播放的媒体源Uri  public Uri getCurrentUri() {    return currentUri;  }  // 获取当前播放状态和播放进度  public void getCurrentPosition() {    if (player != null) {      long position = player.getCurrentPosition();      long duration = player.getDuration();      if (playerStateListener != null) {        playerStateListener.onPositionUpdated(position, duration);      }    }  }  // Player.EventListener 事件回调方法  @Override  public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {    this.playWhenReady = playWhenReady;    if (playerStateListener != null) {      playerStateListener.onPlayerStateChanged(playWhenReady, playbackState);    }  }  // Player.EventListener 事件回调方法  @Override  public void onPlayerError(ExoPlaybackException error) {    if (playerStateListener != null) {      playerStateListener.onError(error);    }  }}

这个示例封装了ExoPlayer的初始化、播放、暂停、停止和释放等操作,可以在应用程序中方便地调用。使用时,只需要创建一个AudioPlayer对象,然后调用相应的方法即可。还有以下几个功能:

这个封装示例可能仍然不是完美的,但是对于大多数应用程序的使用场景已经足够成熟。如果需要更加复杂的功能,可以根据实际需。

在使用这个封装类的时候,你需要按以下步骤进行:

在你的Activity或Fragment中创建一个AudioPlayer实例,例如:

private AudioPlayer audioPlayer;

在创建完AudioPlayer实例后,调用init方法初始化。

audioPlayer = new AudioPlayer();audioPlayer.init(this, Uri.parse("https://example.com/audio.mp3"));

其中,第一个参数传入当前的Context,第二个参数传入媒体源的Uri。

在需要播放的时候,调用play方法:

audioPlayer.play();

如果需要暂停播放,调用pause方法:

audioPlayer.pause();

如果需要停止播放,调用stop方法:

audioPlayer.stop();

如果需要释放播放器实例,取消实例化,调用release方法:

audioPlayer.release();

如果需要监听播放器状态回调,可以通过setPlayerStateListener方法来设置:

audioPlayer.setPlayerStateListener(new AudioPlayer.PlayerStateListener() {  @Override  public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {    // do something  }  @Override  public void onPositionUpdated(long position, long duration) {    // do something  }  @Override  public void onError(ExoPlaybackException error) {    // do something  }});

如果需要获取当前播放进度和媒体源Uri,可以调用getCurrentPosition和getCurrentUri方法:

Uri uri = audioPlayer.getCurrentUri();audioPlayer.getCurrentPosition();

以上就是大致的调用步骤,具体情况可以根据自己的场景进行调整。

public class AudioPlayer {    private static final String TAG = AudioPlayer.class.getSimpleName();    private Context context;    private SimpleExoPlayer player;    private boolean isPlaying;    private int currentPosition;    private List < Integer > audioList;    private List < OnProgressListener > progressListeners = new ArrayList < > ();    private List < OnErrorListener > errorListeners = new ArrayList < > ();    public AudioPlayer(Context context) {        this.context = context;    }    public void init() {        TrackSelector trackSelector = new DefaultTrackSelector();        player = new SimpleExoPlayer.Builder(context)            .setTrackSelector(trackSelector)            .build();        player.addListener(new Player.EventListener() {                @Override                public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {                    switch (playbackState) {                        case Player.STATE_IDLE:                            Log.d(TAG, "onPlayerStateChanged: STATE_IDLE");                            break;                        case Player.STATE_BUFFERING:                            Log.d(TAG, "on                                case Player.STATE_ENDED:                                Log.d(TAG, "onPlayerStateChanged: STATE_ENDED"); isPlaying = false;                                break;                                default:                                break;                            }                    }                    @Override                    public void onPlayerError(ExoPlaybackException error) {                        Log.e(TAG, "onPlayerError: " + error.getMessage());                        for (OnErrorListener listener: errorListeners) {                            listener.onError(error);                        }                        release();                    }                });            player.addAnalyticsListener(new AnalyticsListener() {                @Override                public void onPositionDiscontinuity(                    AnalyticsListener.EventTime eventTime,                    int reason) {                    Log.d(TAG, "onPositionDiscontinuity");                    if (player.getPlaybackError() != null) {                        Log.e(TAG, "onPlayerError: " + player.getPlaybackError().getMessage());                        for (OnErrorListener listener: errorListeners) {                            listener.onError(player.getPlaybackError().getCause());                        }                        release();                    }                    currentPosition = player.getCurrentWindowIndex();                    int duration = (int) player.getDuration();                    int currentPosition = (int) player.getCurrentPosition();                    for (OnProgressListener listener: progressListeners) {                        listener.onProgress(currentPosition, duration);                    }                }            });        }        public void addOnErrorListener(OnErrorListener listener) {            errorListeners.add(listener);        }        public void addOnProgressListener(OnProgressListener listener) {            progressListeners.add(listener);        }        public void setAudioList(List < Integer > audioList) {            this.audioList = audioList;        }        public void play(int position) {            if (audioList == null || audioList.size() == 0) {                return;            }            currentPosition = position;            Uri audioUri = RawResourceDataSource.buildRawResourceUri(audioList.get(currentPosition));            MediaSource audioSource = new ProgressiveMediaSource.Factory(                new DefaultDataSourceFactory(context, "ExoplayerDemo")            ).createMediaSource(audioUri);            player.prepare(audioSource);            player.setPlayWhenReady(true);            isPlaying = true;        }        public void pause() {            if (player != null) {                player.setPlayWhenReady(false);                isPlaying = false;            }        }        public void resume() {            if (player != null) {                player.setPlayWhenReady(true);                isPlaying = true;            }        }        public void stop() {            if (player != null) {                player.stop();                isPlaying = false;            }        }        public void release() {            if (player != null) {                player.release();                player = null;                isPlaying = false;            }        }        public boolean isPlaying() {            return isPlaying;        }        public int getCurrentPosition() {            return currentPosition;        }        public interface OnProgressListener {            void onProgress(int currentPosition, int duration);        }        public interface OnErrorListener {            void onError(Exception e);        }    }

在以上代码中,我们添加了两个接口,OnProgressListener是用来监听进度的,OnErrorListener是用来监听播放异常的。在init方法中,我们给player对象添加了Player.EventListener接口和AnalyticsListener接口,分别用来监听播放状态的变化和进度的变化。播放异常包括播放开始前的异常和播放过程中的异常。在onPlaybackError方法中,我们回调OnErrorListener接口的onError方法。注意,在捕获到播放异常时,我们要调用release方法释放资源。

最后,通过调用addOnErrorListener和addOnProgressListener方法,我们可以将外部传进来的OnErrorListener和OnProgressListener实例添加到AudioPlayer类中。这样,在播放过程中,我们就可以监听到错误和进度的变化了。

“Android Vitamio和ExoPlayer播放器的优劣势是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯