AVProVideo⭐️获取视频的进度,与快进和快退

Posted 橙子SKODE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AVProVideo⭐️获取视频的进度,与快进和快退相关的知识,希望对你有一定的参考价值。

哈喽大家好,你的橙哥突然出现~

本系列博客地址:传送门

 

效果演示

注意进度条,能获得当前视频的播放进度

拖动进度条,能实现快进、快退

 

一、获取视频播放进度

代码如下所示,看不懂的同学在下方评论区留言哦!

    /// <summary>
    /// 进度条UI
    /// </summary>
    public Slider slider;

    private MediaPlayer _mediaPlayer;

    /// <summary>
    /// 当前的视频播放进度(0-1)
    /// </summary>
    private float _currentVideoProgress;

    void Start()
    {
        _mediaPlayer = GetComponent<MediaPlayer>();

        _mediaPlayer.OpenVideoFromFile(MediaPlayer.FileLocation.RelativeToStreamingAssetsFolder,
            "AVProVideoSamples/BigBuckBunny_720p30.mp4", false);

        //开始播放
        _mediaPlayer.Control.Play();
    }

    private void Update()
    {
        if (_mediaPlayer && _mediaPlayer.Info != null && _mediaPlayer.Info.GetDurationMs() > 0f)
        {
            //当前视频时间(ms)
            var time = _mediaPlayer.Control.GetCurrentTimeMs();
            //媒体总时长(ms)
            var duration = _mediaPlayer.Info.GetDurationMs();
            _currentVideoProgress = Mathf.Clamp(time / duration, 0.0f, 1.0f);

            slider.value = _currentVideoProgress;
        }
    }

 

 

二、实现快进、快退

首先,我们要来实现整理一下思路。

我们一方面看到,随着进度条拖动,视频实现了快进快退,

也能看到,拖动时,视频不播放了,当放开拖动,视频又开始播放。

 

那么我们要做的就是:

  • (1)开始拖动时,暂停播放视频
  • (2)结束拖动时,开始播放视频
  • (3)实现播放指定进度的视频

(3)我们可以用Slider自带的OnValueChange实现,那(1)、(2)该怎样实现呢?

教大家一个组件:是 EventTrigger ~

 

我们给Slider UI添加上该组件之后,便可以给它Add New Event Type,

我们在这儿添加 BeginDrag(开始拖拽)、EndDrag(结束拖拽)事件,

给这两个事件注册我们上面说到的事情,不就完成了嘛~

 

好的,我们来做一下

(根据代码完成界面哦,看不懂的小老弟,把问题扣在评论区~)

    /// <summary>
    /// 进度条UI
    /// </summary>
    public Slider slider;

    private EventTrigger _eventTrigger;
    private MediaPlayer _mediaPlayer;

    void Start()
    {
        _eventTrigger = GetComponent<EventTrigger>();
        _mediaPlayer = GetComponent<MediaPlayer>();

        AddEventTriggerEvent(_eventTrigger, EventTriggerType.BeginDrag, OnBeginDrag);
        AddEventTriggerEvent(_eventTrigger, EventTriggerType.EndDrag, OnEndDrag);
        slider.onValueChanged.AddListener(OnSliderChange);

        _mediaPlayer.OpenVideoFromFile(MediaPlayer.FileLocation.RelativeToStreamingAssetsFolder,
            "AVProVideoSamples/BigBuckBunny_720p30.mp4", false);

        //开始播放
        _mediaPlayer.Control.Play();
    }

    void OnSliderChange(float value)
    {
        _mediaPlayer.Control.Seek(slider.value * _mediaPlayer.Info.GetDurationMs());
    }

    void OnBeginDrag(BaseEventData baseEventData)
    {
        _mediaPlayer.Control.Pause();
    }

    void OnEndDrag(BaseEventData baseEventData)
    {
        _mediaPlayer.Control.Play();
    }

    /// <summary>
    /// 为EventTrigger添加事件及事件监听。
    /// </summary>
    /// <param name="trigger">EventTrigger的对象</param>
    /// <param name="eventType">要添加的事件的类型</param>
    /// <param name="callback">事件的触发回调</param>
    private void AddEventTriggerEvent(EventTrigger trigger, EventTriggerType eventType, UnityAction<BaseEventData> callback)
    {
        EventTrigger.Entry entry = null;

        // 查找是否已经存在要注册的事件
        foreach (EventTrigger.Entry existingEntry in trigger.triggers)
        {
            if (existingEntry.eventID == eventType)
            {
                entry = existingEntry;
                break;
            }
        }

        // 如果这个事件不存在,就创建新的实例
        if (entry == null)
        {
            entry = new EventTrigger.Entry();
            entry.eventID = eventType;
            // todo 如果已经存在这个事件,它的callback是否还需要new?
            entry.callback = new EventTrigger.TriggerEvent();
        }

        // 添加触发回调并注册事件
        entry.callback.AddListener(callback);
        trigger.triggers.Add(entry);
    }

 

 

好啦,这就是本节内容

让我们江湖再见~

 

 

如果你有技术上的问题或困扰

都可以加我的vx(skode250)

和我聊一聊你的故事🧡

以上是关于AVProVideo⭐️获取视频的进度,与快进和快退的主要内容,如果未能解决你的问题,请参考以下文章

快进和快退

快进和快倒用英文怎么说?

寻找 iOS 风格的快进和快退按钮图像

使用 AS3 我想在音频上做慢动作、快进和倒带

android 自己定义视频播放器之2/1

使用 AVAudioPlayer 快进歌曲