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⭐️获取视频的进度,与快进和快退的主要内容,如果未能解决你的问题,请参考以下文章