当前位置:网站首页>Unity study notes Description of AVPro video jump function (Seeking)
Unity study notes Description of AVPro video jump function (Seeking)
2022-07-31 13:45:00 【Lawa0592】
1. SeekingFunction related interface
Find jumps by double-precision time:
- Seek() ⇒ Jump to the screen at the exact specified time
- SeekFast() ⇒ Jump to the most recent frame at the specified time
- SeekWithTolerance() ⇒ Jump to the screen within a certain range at the specified time(只支持macOS,ios,tvOS)
Find jumps by using frames(Only valid for media with a known constant frame rate):
- SeekToFrame() ⇒ Jump to a specific frame of the picture
- SeekToFrameRelative() ⇒ Jump to the frame how many frames forward or backward relative to the current frame
The source code of the underlying interface is as follows:
/// <summary>
/// The time in seconds seeked will be to the exact time
/// This can take a long time is the keyframes are far apart
/// Some platforms don't support this and instead seek to the closest keyframe
/// </summary>
void Seek(double time);
/// <summary>
/// The time in seconds seeked will be to the closest keyframe
/// </summary>
void SeekFast(double time);
/// <summary>
/// The time in seconds seeked to will be within the range [time-timeDeltaBefore, time+timeDeltaAfter] for efficiency.
/// Only supported on macOS, iOS and tvOS.
/// Other platforms will automatically pass through to Seek()
/// </summary>
void SeekWithTolerance(double time, double timeDeltaBefore, double timeDeltaAfter);
/// <summary>
/// Seek to a specific frame, range is [0, GetMaxFrameNumber()]
/// NOTE: For best results the video should be encoded as keyframes only
/// and have no audio track, or an audio track with the same length as the video track
/// </summary>
void SeekToFrame(int frame, float overrideFrameRate = 0f);
/// <summary>
/// Seek forwards or backwards relative to the current frame
/// NOTE: For best results the video should be encoded as keyframes only
/// and have no audio track, or an audio track with the same length as the video track
/// </summary>
void SeekToFrameRelative(int frameOffset, float overrideFrameRate = 0f);
需要注意的是,Jump response/Behavior varies on different platforms
| 平台 | Fast approximate keyframe search(Fast Approximate Keyframe Seeking) | Accurate framing at slow speed(Slow Accurate Frame Seeking) |
|---|---|---|
| Windows (WinRT / Media Foundation) | * | * |
| Windows (DirectShow) | * | Depends on the codec |
| Android (ExoPlayer) | * | * |
| Android (MediaPlayer) | * | API 26 及以上 |
| macOS | * | * |
| iOS/iPadOS/tvOS | * | * |
| WebGL | * | Varies depending on the situation |
2. 跳转(Seeking)Example of the implementation of the function
具体的实现可以参考AVPro提供的Demo(Demo_MediaPlayer场景)
Only the combined time bar is listed below(slider)The part where video jumps are made:
[Header("UI Components")]
[SerializeField] Slider _sliderTime = null;
void Start()
{
CreateTimelineDragEvents();
}
private void CreateTimelineDragEvents()
{
EventTrigger trigger = _sliderTime.gameObject.GetComponent<EventTrigger>();
if (trigger != null)
{
EventTrigger.Entry entry = new EventTrigger.Entry();
entry.eventID = EventTriggerType.PointerDown;
entry.callback.AddListener((data) => {
OnTimeSliderBeginDrag(); });
trigger.triggers.Add(entry);
entry = new EventTrigger.Entry();
entry.eventID = EventTriggerType.Drag;
entry.callback.AddListener((data) => {
OnTimeSliderDrag(); });
trigger.triggers.Add(entry);
entry = new EventTrigger.Entry();
entry.eventID = EventTriggerType.PointerUp;
entry.callback.AddListener((data) => {
OnTimeSliderEndDrag(); });
trigger.triggers.Add(entry);
entry = new EventTrigger.Entry();
entry.eventID = EventTriggerType.PointerEnter;
entry.callback.AddListener((data) => {
OnTimelineBeginHover((PointerEventData)data); });
trigger.triggers.Add(entry);
entry = new EventTrigger.Entry();
entry.eventID = EventTriggerType.PointerExit;
entry.callback.AddListener((data) => {
OnTimelineEndHover((PointerEventData)data); });
trigger.triggers.Add(entry);
}
}
private bool _wasPlayingBeforeTimelineDrag;
private void OnTimeSliderBeginDrag()
{
if (_mediaPlayer && _mediaPlayer.Control != null)
{
_wasPlayingBeforeTimelineDrag = _mediaPlayer.Control.IsPlaying();
if (_wasPlayingBeforeTimelineDrag)
{
_mediaPlayer.Pause();
}
OnTimeSliderDrag();
}
}
private void OnTimeSliderDrag()
{
if (_mediaPlayer && _mediaPlayer.Control != null)
{
TimeRange timelineRange = GetTimelineRange();
double time = timelineRange.startTime + (_sliderTime.value * timelineRange.duration);
_mediaPlayer.Control.Seek(time);
_isHoveringOverTimeline = true;
}
}
private void OnTimeSliderEndDrag()
{
if (_mediaPlayer && _mediaPlayer.Control != null)
{
if (_wasPlayingBeforeTimelineDrag)
{
_mediaPlayer.Play();
_wasPlayingBeforeTimelineDrag = false;
}
}
}
private bool _isHoveringOverTimeline;
private void OnTimelineBeginHover(PointerEventData eventData)
{
if (eventData.pointerCurrentRaycast.gameObject != null)
{
_isHoveringOverTimeline = true;
_sliderTime.transform.localScale = new Vector3(1f, 2.5f, 1f);
}
}
private void OnTimelineEndHover(PointerEventData eventData)
{
_isHoveringOverTimeline = false;
_sliderTime.transform.localScale = new Vector3(1f, 1f, 1f);
}
参考文献
边栏推荐
猜你喜欢

操作符详解

C# 中的Async 和 Await 的用法详解

技能大赛训练题:MS15_034漏洞验证与安全加固

CLion用于STM32开发

C#控件StatusStrip使用

【蓝桥杯选拔赛真题46】Scratch磁铁游戏 少儿编程scratch蓝桥杯选拔赛真题讲解

推荐系统-召回阶段-2013:DSSM(双塔模型)【Embedding(语义向量)召回】【微软】

golang-gin - graceful restart

ICML2022 | Fully Granular Self-Semantic Propagation for Self-Supervised Graph Representation Learning

C#控件 ToolStripProgressBar 用法
随机推荐
技能大赛训练题:交换机虚拟化练习
P5019 [NOIP2018 提高组] 铺设道路
【牛客刷题-SQL大厂面试真题】NO3.电商场景(某东商城)
网络协议及相关技术详解
LeetCode·304竞赛·6132·使数组中所有元素都等于零·模拟·哈希
Install the latest pytorch gpu version
推荐系统-召回阶段-2013:DSSM(双塔模型)【Embedding(语义向量)召回】【微软】
Network layer key protocol - IP protocol
技能大赛训练题:MS15_034漏洞验证与安全加固
关于MySQL主从复制的数据同步延迟问题
[RPI]树莓派监控温度及报警关机保护「建议收藏」
Shell脚本经典案例:探测批量主机是否存活
C#控件ListView用法
The cluster of safe mode
技能大赛训练题:ftp 服务攻防与加固
战略进攻能力的重要性,要远远高于战略防守能力
C# Get network card information NetworkInterface IPInterfaceProperties
ECCV2022:在Transformer上进行递归,不增参数,计算量还少!
为什么 wireguard-go 高尚而 boringtun 孬种
SAP e-commerce cloud Spartacus SSR Optimization Engine execution sequence of several timeouts