国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Unity播放器插件-AVPro Video - Ultra Edition介紹

這篇具有很好參考價值的文章主要介紹了Unity播放器插件-AVPro Video - Ultra Edition介紹。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

c# AVPro Video - Ultra Edition官方插件使用介紹
AvproVideo,官網(wǎng)中有免費的,免費的帶了水印。不介意水印去下載,挺好使的。收費的在Unity商店中能找到:(這里我從淘寶上花“重金”買了一個玩玩)以前都是用的AvPro免費版的,1點幾那種版本的,也挺好使,相對這個來說,這個就是某東版本的,那個是拼夕夕版本的。
avpro unity,Unity,unity,java,游戲引擎

常用API

獲取MediaPlayer組件,使用代碼如下:

MediaPlayer meida;
//播放
media.Control.Play();
//暫停
media.Control.Pause();
//停止
media.Control.Stop();
//重播
media.Control.Rewind();
//設置播放鏈接AbsolutePathOrURL是Url的形式,可以選擇文件夾的形式,設置對應文件夾屬性即可
media.OpenMedia(MediaPathType.AbsolutePathOrURL,"視頻鏈接",true);
//StreamingAssets文件目錄下的視頻地址
media.OpenMedia(MediaPathType.RelativeToStreamingAssetsFolder,"視頻名稱",true);
//事件監(jiān)聽
media.Events.AddListener(OnVideoEvent); 
private void OnVideoEvent(MediaPlayer arg0, MediaPlayerEvent.EventType arg1, ErrorCode arg2)
        {
            switch (arg1)
            {
                case MediaPlayerEvent.EventType.MetaDataReady:
                    break;
                case MediaPlayerEvent.EventType.ReadyToPlay: 
                    break;
                case MediaPlayerEvent.EventType.Started: 
                    break;
                case MediaPlayerEvent.EventType.FirstFrameReady:
                    break;
                case MediaPlayerEvent.EventType.FinishedPlaying:
                    print("無循環(huán)狀態(tài)下播放完成");
                    break;
                case MediaPlayerEvent.EventType.Closing:
                    print(".Closing...");
                    break;
                case MediaPlayerEvent.EventType.Error:
                    print(".Error...");
                    break;
                case MediaPlayerEvent.EventType.SubtitleChange:
                    break;
                case MediaPlayerEvent.EventType.Stalled:
                    break;
                case MediaPlayerEvent.EventType.Unstalled:
                    break;
                case MediaPlayerEvent.EventType.ResolutionChanged:
                    break;
                case MediaPlayerEvent.EventType.StartedSeeking:
                    break;
                case MediaPlayerEvent.EventType.FinishedSeeking:
                    print("循環(huán)設置狀態(tài)下播放結束...");
                    break;
                case MediaPlayerEvent.EventType.StartedBuffering:
                    break;
                case MediaPlayerEvent.EventType.FinishedBuffering: 
                    break;
                case MediaPlayerEvent.EventType.PropertiesChanged:
                    break;
                case MediaPlayerEvent.EventType.PlaylistItemChanged:
                    break;
                case MediaPlayerEvent.EventType.PlaylistFinished:
                    break;
                case MediaPlayerEvent.EventType.TextTracksChanged:
                    break;
                //case MediaPlayerEvent.EventType.TextCueChanged://=>  SubtitleChange
                //  break;
                default:
                    break;
            }
        }

Demo源碼

該插件有很詳細的demo演示場景,很容易使用,基本功能都已封裝好,直接使用就行。以下是我將它封裝好的功能寫成一個單列。

using RenderHeads.Media.AVProVideo.Demos.UI;
using RenderHeads.Media.AVProVideo;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace Demo
{
    public class MediaManager : MonoBehaviour
    {
        public static MediaManager m_Ins;
        [SerializeField] MediaPlayer _mediaPlayer = null; 
        [Header("Options")] 
        [SerializeField] float _keyVolumeDelta = 0.05f;
        [SerializeField] float _jumpDeltaTime = 5f;
        [SerializeField] bool _autoHide = true;
        [SerializeField] float _userInactiveDuration = 1.5f;
        [SerializeField] bool _useAudioFading = true; 
        [Header("Keyboard Controls")]
        [SerializeField] bool _enableKeyboardControls = true;
        [SerializeField] KeyCode KeyVolumeUp = KeyCode.UpArrow;
        [SerializeField] KeyCode KeyVolumeDown = KeyCode.DownArrow;
        [SerializeField] KeyCode KeyTogglePlayPause = KeyCode.Space;
        [SerializeField] KeyCode KeyToggleMute = KeyCode.M;
        [SerializeField] KeyCode KeyJumpForward = KeyCode.RightArrow;
        [SerializeField] KeyCode KeyJumpBack = KeyCode.LeftArrow;

        [Header("Optional Components")]
        [SerializeField] OverlayManager _overlayManager = null;
        [SerializeField] MediaPlayer _thumbnailMediaPlayer = null;
        [SerializeField] RectTransform _timelineTip = null;

        [Header("UI Components")]
        [SerializeField] RectTransform _canvasTransform = null;
        //[SerializeField] Image image = null;
        [SerializeField] Slider _sliderTime = null;
        [SerializeField] EventTrigger _videoTouch = null;
        [SerializeField] CanvasGroup _controlsGroup = null;

        [Header("UI Components (Optional)")]
        [SerializeField] GameObject _liveItem = null;
        [SerializeField] Text _textMediaName = null;
        [SerializeField] Text _textTimeDuration = null;
        [SerializeField] Slider _sliderVolume = null;
        [SerializeField] Button _buttonPlayPause = null;
        [SerializeField] Button _buttonVolume = null;
        [SerializeField] Button _buttonSubtitles = null;
        [SerializeField] Button _buttonOptions = null;
        [SerializeField] Button _buttonTimeBack = null;
        [SerializeField] Button _buttonTimeForward = null;
        [SerializeField] RawImage _imageAudioSpectrum = null;
        [SerializeField] HorizontalSegmentsPrimitive _segmentsSeek = null;
        [SerializeField] HorizontalSegmentsPrimitive _segmentsBuffered = null;
        [SerializeField] HorizontalSegmentsPrimitive _segmentsProgress = null;

        private bool _wasPlayingBeforeTimelineDrag;
        private float _controlsFade = 1f;
        private Material _playPauseMaterial;
        private Material _volumeMaterial;
        private Material _subtitlesMaterial;
        private Material _audioSpectrumMaterial;
        private float[] _spectrumSamples = new float[128];
        private float[] _spectrumSamplesSmooth = new float[128];
        private float _maxValue = 1f;
        private float _audioVolume = 1f;

        private float _audioFade = 0f;
        private bool _isAudioFadingUpToPlay = true;
        private const float AudioFadeDuration = 0.25f;
        private float _audioFadeTime = 0f;

        private readonly LazyShaderProperty _propMorph = new LazyShaderProperty("_Morph");
        private readonly LazyShaderProperty _propMute = new LazyShaderProperty("_Mute");
        private readonly LazyShaderProperty _propVolume = new LazyShaderProperty("_Volume");
        private readonly LazyShaderProperty _propSpectrum = new LazyShaderProperty("_Spectrum");
        private readonly LazyShaderProperty _propSpectrumRange = new LazyShaderProperty("_SpectrumRange");

        void Awake()
        {
            m_Ins = this;
#if UNITY_IOS
			Application.targetFrameRate = 60;
#endif
        }

        void Start()
        {
            if (_mediaPlayer)
            {
                _audioVolume = _mediaPlayer.AudioVolume;
            }
            SetupPlayPauseButton();
            SetupTimeBackForwardButtons();
            SetupVolumeButton();
            SetupSubtitlesButton();
            SetupAudioSpectrum();
            CreateTimelineDragEvents();
            CreateVideoTouchEvents();
            CreateVolumeSliderEvents();
            UpdateVolumeSlider();
        }

        private struct UserInteraction
        {
            public static float InactiveTime;
            private static Vector3 _previousMousePos;
            private static int _lastInputFrame;

            public static bool IsUserInputThisFrame()
            {
                if (Time.frameCount == _lastInputFrame)
                {
                    return true;
                }
                bool touchInput = (Input.touchSupported && Input.touchCount > 0);
                bool mouseInput = (Input.mousePresent && (Input.mousePosition != _previousMousePos || Input.mouseScrollDelta != Vector2.zero || Input.GetMouseButton(0)));

                if (touchInput || mouseInput)
                {
                    _previousMousePos = Input.mousePosition;
                    _lastInputFrame = Time.frameCount;
                    return true;
                }

                return false;
            }
        }

        private Material DuplicateMaterialOnImage(Graphic image)
        {
            // Assign a copy of the material so we aren't modifying the material asset file
            image.material = new Material(image.material);
            return image.material;
        }

        private void SetupPlayPauseButton()
        {
            if (_buttonPlayPause)
            {
                _buttonPlayPause.onClick.AddListener(OnPlayPauseButtonPressed);
                _playPauseMaterial = DuplicateMaterialOnImage(_buttonPlayPause.GetComponent<Image>());
            }
        }
        /// <summary>
        /// 視頻播放鏈接設置
        /// </summary>
        /// <param name="url"></param>
        public void SetMediaUrl(string url, MediaPathType type = MediaPathType.AbsolutePathOrURL)
        {
#if UNITY_EDITOR || UNITY_WIN
            _mediaPlayer.OpenMedia(type, url, true);
#elif UNITY_ANDROID
            _mediaPlayer.OpenMedia(type, url, true);
#endif
        }
        public MediaPlayer GetMediaPlayer { get { 
                return _mediaPlayer; 
            }
        }
        private void SetupTimeBackForwardButtons()
        {
            if (_buttonTimeBack)
            {
                _buttonTimeBack.onClick.AddListener(OnPlayTimeBackButtonPressed);
            }
            if (_buttonTimeForward)
            {
                _buttonTimeForward.onClick.AddListener(OnPlayTimeForwardButtonPressed);
            }
        }

        private void SetupVolumeButton()
        {
            if (_buttonVolume)
            {
                _buttonVolume.onClick.AddListener(OnVolumeButtonPressed);
                _volumeMaterial = DuplicateMaterialOnImage(_buttonVolume.GetComponent<Image>());
            }
        }

        private void SetupSubtitlesButton()
        {
            if (_buttonSubtitles)
            {
                _buttonSubtitles.onClick.AddListener(OnSubtitlesButtonPressed);
                _subtitlesMaterial = DuplicateMaterialOnImage(_buttonSubtitles.GetComponent<Image>());
            }
        }

        private void SetupAudioSpectrum()
        {
            if (_imageAudioSpectrum)
            {
                _audioSpectrumMaterial = DuplicateMaterialOnImage(_imageAudioSpectrum);
            }
        }

        private void OnPlayPauseButtonPressed()
        {
            TogglePlayPause();
        }

        private void OnPlayTimeBackButtonPressed()
        {
            SeekRelative(-_jumpDeltaTime);
        }

        private void OnPlayTimeForwardButtonPressed()
        {
            SeekRelative(_jumpDeltaTime);
        }

        private void OnVolumeButtonPressed()
        {
            ToggleMute();
        }

        private void OnSubtitlesButtonPressed()
        {
            ToggleSubtitles();
        }

        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);
        }

        private void CreateVideoTouchEvents()
        {
            EventTrigger.Entry entry = new EventTrigger.Entry();
            entry.eventID = EventTriggerType.PointerUp;
            entry.callback.AddListener((data) => { OnVideoPointerUp(); });
            _videoTouch.triggers.Add(entry);
        }

        private void OnVideoPointerUp()
        {
            bool controlsMostlyVisible = (_controlsGroup.alpha >= 0.5f && _controlsGroup.gameObject.activeSelf);
            if (controlsMostlyVisible)
            {
                TogglePlayPause();
            }
        }

        void UpdateAudioFading()
        {
            // Increment fade timer
            if (_audioFadeTime < AudioFadeDuration)
            {
                _audioFadeTime = Mathf.Clamp(_audioFadeTime + Time.deltaTime, 0f, AudioFadeDuration);
            }

            // Trigger pause when audio faded down
            if (_audioFadeTime >= AudioFadeDuration)
            {
                if (!_isAudioFadingUpToPlay)
                {
                    Pause(skipFeedback: true);
                }
            }

            // Apply audio fade value
            if (_mediaPlayer.Control != null && _mediaPlayer.Control.IsPlaying())
            {
                _audioFade = Mathf.Clamp01(_audioFadeTime / AudioFadeDuration);
                if (!_isAudioFadingUpToPlay)
                {
                    _audioFade = (1f - _audioFade);
                }
                ApplyAudioVolume();
            }
        }

        public void TogglePlayPause()
        {
            if (_mediaPlayer && _mediaPlayer.Control != null)
            {
                if (_useAudioFading && _mediaPlayer.Info.HasAudio())
                {
                    if (_mediaPlayer.Control.IsPlaying())
                    {
                        if (_overlayManager)
                        {
                            _overlayManager.TriggerFeedback(OverlayManager.Feedback.Pause);
                        }
                        _isAudioFadingUpToPlay = false;
                    }
                    else
                    {
                        _isAudioFadingUpToPlay = true;
                        Play();
                    }
                    _audioFadeTime = 0f;
                }
                else
                {
                    if (_mediaPlayer.Control.IsPlaying())
                    {
                        Pause();
                    }
                    else
                    {
                        Play();
                    }
                }
            }
        }

        public void Play()
        {
            if (_mediaPlayer && _mediaPlayer.Control != null)
            {
                if (_overlayManager)
                {
                    _overlayManager.TriggerFeedback(OverlayManager.Feedback.Play);
                }
                _mediaPlayer.Play();
            }
        }

        public void Pause(bool skipFeedback = false)
        {
            if (_mediaPlayer && _mediaPlayer.Control != null)
            {
                if (!skipFeedback)
                {
                    if (_overlayManager)
                    {
                        _overlayManager.TriggerFeedback(OverlayManager.Feedback.Pause);
                    }
                }
                _mediaPlayer.Pause();
            }
        }
        public void Stop()
        {
            if (_mediaPlayer && _mediaPlayer.Control != null)
            {  
                _mediaPlayer.Stop();
                _mediaPlayer.CloseMedia();
            }
        }
        public void Rewind()
        {
            if (_mediaPlayer && _mediaPlayer.Control != null)
            {
                if (_overlayManager)
                {
                    _overlayManager.TriggerFeedback(OverlayManager.Feedback.Play);
                }
                _mediaPlayer.Rewind(true);
                _mediaPlayer.Play();
            }
        }
        public void SeekRelative(float deltaTime)
        {
            if (_mediaPlayer && _mediaPlayer.Control != null)
            {
                TimeRange timelineRange = GetTimelineRange();
                double time = _mediaPlayer.Control.GetCurrentTime() + deltaTime;
                time = System.Math.Max(time, timelineRange.startTime);
                time = System.Math.Min(time, timelineRange.startTime + timelineRange.duration);
                _mediaPlayer.Control.Seek(time);

                if (_overlayManager)
                {
                    _overlayManager.TriggerFeedback(deltaTime > 0f ? OverlayManager.Feedback.SeekForward : OverlayManager.Feedback.SeekBack);
                }
            }
        }

        public void ChangeAudioVolume(float delta)
        {
            if (_mediaPlayer && _mediaPlayer.Control != null)
            {
                // Change volume
                _audioVolume = Mathf.Clamp01(_audioVolume + delta);

                // Update the UI
                UpdateVolumeSlider();

                // Trigger the overlays
                if (_overlayManager)
                {
                    _overlayManager.TriggerFeedback(delta > 0f ? OverlayManager.Feedback.VolumeUp : OverlayManager.Feedback.VolumeDown);
                }
            }
        }

        public void ToggleMute()
        {
            if (_mediaPlayer && _mediaPlayer.Control != null)
            {
                if (_mediaPlayer.Control.IsMuted())
                {
                    MuteAudio(false);
                }
                else
                {
                    MuteAudio(true);
                }
            }
        }

        public void MuteAudio(bool mute)
        {
            if (_mediaPlayer && _mediaPlayer.Control != null)
            {
                // Change mute
                _mediaPlayer.Control.MuteAudio(mute);

                // Update the UI
                // The UI element is constantly updated by the Update() method

                // Trigger the overlays
                if (_overlayManager)
                {
                    _overlayManager.TriggerFeedback(mute ? OverlayManager.Feedback.VolumeMute : OverlayManager.Feedback.VolumeUp);
                }
            }
        }

        public void ToggleSubtitles()
        {
            if (_mediaPlayer && _mediaPlayer.TextTracks != null)
            {
                if (_mediaPlayer.TextTracks.GetTextTracks().Count > 0)
                {
                    if (_mediaPlayer.TextTracks.GetActiveTextTrack() != null)
                    {
                        _mediaPlayer.TextTracks.SetActiveTextTrack(null);
                    }
                    else
                    {
                        // TODO: instead of activating the first one, base it on the language/track 
                        // selection stored in the MediaPlayerUI
                        _mediaPlayer.TextTracks.SetActiveTextTrack(_mediaPlayer.TextTracks.GetTextTracks()[0]);
                    }
                }
            }
        }

        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 void CreateVolumeSliderEvents()
        {
            if (_sliderVolume != null)
            {
                EventTrigger trigger = _sliderVolume.gameObject.GetComponent<EventTrigger>();
                if (trigger != null)
                {
                    EventTrigger.Entry entry = new EventTrigger.Entry();
                    entry.eventID = EventTriggerType.PointerDown;
                    entry.callback.AddListener((data) => { OnVolumeSliderDrag(); });
                    trigger.triggers.Add(entry);

                    entry = new EventTrigger.Entry();
                    entry.eventID = EventTriggerType.Drag;
                    entry.callback.AddListener((data) => { OnVolumeSliderDrag(); });
                    trigger.triggers.Add(entry);
                }
            }
        }

        private void OnVolumeSliderDrag()
        {
            if (_mediaPlayer && _mediaPlayer.Control != null)
            {
                _audioVolume = _sliderVolume.value;
                ApplyAudioVolume();
            }
        }

        private void ApplyAudioVolume()
        {
            if (_mediaPlayer)
            {
                _mediaPlayer.AudioVolume = (_audioVolume * _audioFade);
            }
        }

        private void UpdateVolumeSlider()
        {
            if (_sliderVolume)
            {
                if (_mediaPlayer)
                {
                    // TODO: remove this
                    /*if (mp.Control != null)
                    {
                        _sliderVolume.value = mp.Control.GetVolume();
                    }
                    else*/
                    {
                        _sliderVolume.value = _audioVolume;
                    }
                }
            }
        }

        private void UpdateAudioSpectrum()
        {
            bool showAudioSpectrum = false;
            if (_mediaPlayer && _mediaPlayer.Control != null)
            {
                AudioSource audioSource = _mediaPlayer.AudioSource;
                if (audioSource && _audioSpectrumMaterial)
                {
                    showAudioSpectrum = true;

                    float maxFreq = (Helper.GetUnityAudioSampleRate() / 2);

                    // Frequencies over 18Khz generally aren't very interesting to visualise, so clamp the range
                    const float clampFreq = 18000f;
                    int sampleRange = Mathf.FloorToInt(Mathf.Clamp01(clampFreq / maxFreq) * _spectrumSamples.Length);

                    // Add new samples and smooth the samples over time
                    audioSource.GetSpectrumData(_spectrumSamples, 0, FFTWindow.BlackmanHarris);

                    // Find the maxValue sample for normalising with
                    float maxValue = -1.0f;
                    for (int i = 0; i < sampleRange; i++)
                    {
                        if (_spectrumSamples[i] > maxValue)
                        {
                            maxValue = _spectrumSamples[i];
                        }
                    }

                    // Chase maxValue to zero
                    _maxValue = Mathf.Lerp(_maxValue, 0.0f, Mathf.Clamp01(2.0f * Time.deltaTime));

                    // Update maxValue
                    _maxValue = Mathf.Max(_maxValue, maxValue);
                    if (_maxValue <= 0.01f)
                    {
                        _maxValue = 1f;
                    }

                    // Copy and smooth the spectrum values
                    for (int i = 0; i < sampleRange; i++)
                    {
                        float newSample = _spectrumSamples[i] / _maxValue;
                        _spectrumSamplesSmooth[i] = Mathf.Lerp(_spectrumSamplesSmooth[i], newSample, Mathf.Clamp01(15.0f * Time.deltaTime));
                    }

                    // Update shader
                    _audioSpectrumMaterial.SetFloatArray(_propSpectrum.Id, _spectrumSamplesSmooth);
                    _audioSpectrumMaterial.SetFloat(_propSpectrumRange.Id, (float)sampleRange);
                }
            }

            if (_imageAudioSpectrum)
            {
                _imageAudioSpectrum.gameObject.SetActive(showAudioSpectrum);
            }
        }

        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 TimeRange GetTimelineRange()
        {
            if (_mediaPlayer.Info != null)
            {
                return Helper.GetTimelineRange(_mediaPlayer.Info.GetDuration(), _mediaPlayer.Control.GetSeekableTimes());
            }
            return new TimeRange();
        }

        private bool CanHideControls()
        {
            bool result = true;
            if (!_autoHide)
            {
                result = false;
            }
            else if (Input.mousePresent)
            {
                // Check whether the mouse cursor is over the controls, in which case we can't hide the UI
                RectTransform rect = _controlsGroup.GetComponent<RectTransform>();
                Vector2 canvasPos;
                RectTransformUtility.ScreenPointToLocalPointInRectangle(rect, Input.mousePosition, null, out canvasPos);

                Rect rr = RectTransformUtility.PixelAdjustRect(rect, null);
                result = !rr.Contains(canvasPos);
            }
            return result;
        }

        private void UpdateControlsVisibility()
        {
            if (UserInteraction.IsUserInputThisFrame() || !CanHideControls())
            {
                UserInteraction.InactiveTime = 0f;
                FadeUpControls();
            }
            else
            {

                UserInteraction.InactiveTime += Time.unscaledDeltaTime;
                if (UserInteraction.InactiveTime >= _userInactiveDuration)
                {
                    FadeDownControls();
                }
                else
                {
                    FadeUpControls();
                }
            }
        }

        private void FadeUpControls()
        {
            if (!_controlsGroup.gameObject.activeSelf)
            {
                _controlsGroup.gameObject.SetActive(true);
            }
            _controlsFade = Mathf.Min(1f, _controlsFade + Time.deltaTime * 8f);
            _controlsGroup.alpha = Mathf.Pow(_controlsFade, 5f);
        }

        private void FadeDownControls()
        {
            if (_controlsGroup.gameObject.activeSelf)
            {
                _controlsFade = Mathf.Max(0f, _controlsFade - Time.deltaTime * 3f);
                _controlsGroup.alpha = Mathf.Pow(_controlsFade, 5f);
                if (_controlsGroup.alpha <= 0f)
                {
                    _controlsGroup.gameObject.SetActive(false);
                }
            }
        }

        void Update()
        {
            if (!_mediaPlayer) return;

            UpdateControlsVisibility();
            UpdateAudioFading();
            UpdateAudioSpectrum();

            if (_mediaPlayer.Info != null)
            {
                TimeRange timelineRange = GetTimelineRange();

                // Update timeline hover popup
                if (_timelineTip != null)
                {
                    if (_isHoveringOverTimeline)
                    {
                        Vector2 canvasPos;
                        RectTransformUtility.ScreenPointToLocalPointInRectangle(_canvasTransform, Input.mousePosition, null, out canvasPos);

                        _segmentsSeek.gameObject.SetActive(true);
                        _timelineTip.gameObject.SetActive(true);
                        Vector3 mousePos = _canvasTransform.TransformPoint(canvasPos);

                        _timelineTip.position = new Vector2(mousePos.x, _timelineTip.position.y);

                        if (UserInteraction.IsUserInputThisFrame())
                        {
                            // Work out position on the timeline
                            Bounds bounds = RectTransformUtility.CalculateRelativeRectTransformBounds(this._sliderTime.GetComponent<RectTransform>());
                            float x = Mathf.Clamp01((canvasPos.x - bounds.min.x) / bounds.size.x);

                            double time = (double)x * timelineRange.Duration;

                            // Seek to the new position
                            if (_thumbnailMediaPlayer != null && _thumbnailMediaPlayer.Control != null)
                            {
                                _thumbnailMediaPlayer.Control.SeekFast(time);
                            }

                            // Update time text
                            Text hoverText = _timelineTip.GetComponentInChildren<Text>();
                            if (hoverText != null)
                            {
                                time -= timelineRange.startTime;
                                time = System.Math.Max(time, 0.0);
                                time = System.Math.Min(time, timelineRange.Duration);
                                hoverText.text = Helper.GetTimeString(time, false);
                            }

                            {
                                // Update seek segment when hovering over timeline
                                if (_segmentsSeek != null)
                                {
                                    float[] ranges = new float[2];
                                    if (timelineRange.Duration > 0.0)
                                    {
                                        double t = ((_mediaPlayer.Control.GetCurrentTime() - timelineRange.startTime) / timelineRange.duration);
                                        ranges[1] = x;
                                        ranges[0] = (float)t;
                                    }
                                    _segmentsSeek.Segments = ranges;
                                }
                            }
                        }
                    }
                    else
                    {
                        _timelineTip.gameObject.SetActive(false);
                        _segmentsSeek.gameObject.SetActive(false);
                    }
                }

                // Updated stalled display
                if (_overlayManager)
                {
                    _overlayManager.Reset();
                    if (_mediaPlayer.Info.IsPlaybackStalled())
                    {
                        _overlayManager.TriggerStalled();
                    }
                }

                // Update keyboard input
                if (_enableKeyboardControls)
                {
                    // Keyboard toggle play/pause
                    if (Input.GetKeyDown(KeyTogglePlayPause))
                    {
                        TogglePlayPause();
                    }

                    // Keyboard seek 5 seconds
                    if (Input.GetKeyDown(KeyJumpBack))
                    {
                        SeekRelative(-_jumpDeltaTime);
                    }
                    else if (Input.GetKeyDown(KeyJumpForward))
                    {
                        SeekRelative(_jumpDeltaTime);
                    }

                    // Keyboard control volume
                    if (Input.GetKeyDown(KeyVolumeUp))
                    {
                        ChangeAudioVolume(_keyVolumeDelta);
                    }
                    else if (Input.GetKeyDown(KeyVolumeDown))
                    {
                        ChangeAudioVolume(-_keyVolumeDelta);
                    }

                    // Keyboard toggle mute
                    if (Input.GetKeyDown(KeyToggleMute))
                    {
                        ToggleMute();
                    }
                }

                // Animation play/pause button
                if (_playPauseMaterial != null)
                {
                    float t = _playPauseMaterial.GetFloat(_propMorph.Id);
                    float d = 1f;
                    if (_mediaPlayer.Control.IsPlaying())
                    {
                        d = -1f;
                    }
                    t += d * Time.deltaTime * 6f;
                    t = Mathf.Clamp01(t);
                    _playPauseMaterial.SetFloat(_propMorph.Id, t);
                }

                // Animation volume/mute button
                if (_volumeMaterial != null)
                {
                    float t = _volumeMaterial.GetFloat(_propMute.Id);
                    float d = 1f;
                    if (!_mediaPlayer.Control.IsMuted())
                    {
                        d = -1f;
                    }
                    t += d * Time.deltaTime * 6f;
                    t = Mathf.Clamp01(t);
                    _volumeMaterial.SetFloat(_propMute.Id, t);
                    _volumeMaterial.SetFloat(_propVolume.Id, _audioVolume);
                }

                // Animation subtitles button
                if (_subtitlesMaterial)
                {
                    float t = _subtitlesMaterial.GetFloat(_propMorph.Id);
                    float d = 1f;
                    if (_mediaPlayer.TextTracks.GetActiveTextTrack() == null)
                    {
                        d = -1f;
                    }
                    t += d * Time.deltaTime * 6f;
                    t = Mathf.Clamp01(t);
                    _subtitlesMaterial.SetFloat(_propMorph.Id, t);
                }

                // Update time/duration text display
                if (_textTimeDuration)
                {
                    string t1 = Helper.GetTimeString((_mediaPlayer.Control.GetCurrentTime() - timelineRange.startTime), false);
                    string d1 = Helper.GetTimeString(timelineRange.duration, false);
                    _textTimeDuration.text = string.Format("{0} / {1}", t1, d1);
                }

                // Update volume slider
                if (!_useAudioFading)
                {
                    UpdateVolumeSlider();
                }

                // Update time slider position
                if (_sliderTime)
                {
                    double t = 0.0;
                    if (timelineRange.duration > 0.0)
                    {
                        t = ((_mediaPlayer.Control.GetCurrentTime() - timelineRange.startTime) / timelineRange.duration);
                    }
                    _sliderTime.value = Mathf.Clamp01((float)t);
                }

                // Update LIVE text visible
                if (_liveItem)
                {
                    _liveItem.SetActive(double.IsInfinity(_mediaPlayer.Info.GetDuration()));
                }

                // Update subtitle button visible
                if (_buttonSubtitles)
                {
                    _buttonSubtitles.gameObject.SetActive(_mediaPlayer.TextTracks.GetTextTracks().Count > 0);
                }

                // Update media name
                if (_textMediaName)
                {
#if MEDIA_NAME
					string mediaName = string.Empty;
					if (!string.IsNullOrEmpty(_mediaPlayer.VideoPath))
					{
						mediaName  = System.IO.Path.GetFileName(_mediaPlayer.VideoPath);
						if (mediaName.Length > 26)
						{
							mediaName = mediaName.Substring(0, 26);
						}
					}
#endif

                    string resolutionName = string.Empty;
                    if (_mediaPlayer.Info.GetVideoWidth() > 0)
                    {
                        resolutionName = Helper.GetFriendlyResolutionName(_mediaPlayer.Info.GetVideoWidth(), _mediaPlayer.Info.GetVideoHeight(), _mediaPlayer.Info.GetVideoFrameRate());
                    }

#if MEDIA_NAME
					_textMediaName.text = string.Format("{0} {1}", mediaName, resolutionName);
#else
                    _textMediaName.text = resolutionName;
#endif
                }

                // Update buffered segments
                if (_segmentsBuffered)
                {
                    TimeRanges times = _mediaPlayer.Control.GetBufferedTimes();
                    float[] ranges = null;
                    if (times.Count > 0 && timelineRange.duration > 0.0)
                    {
                        ranges = new float[times.Count * 2];
                        for (int i = 0; i < times.Count; i++)
                        {
                            ranges[i * 2 + 0] = Mathf.Max(0f, (float)((times[i].StartTime - timelineRange.startTime) / timelineRange.duration));
                            ranges[i * 2 + 1] = Mathf.Min(1f, (float)((times[i].EndTime - timelineRange.startTime) / timelineRange.duration));
                        }
                    }
                    _segmentsBuffered.Segments = ranges;
                }

                // Update progress segment
                if (_segmentsProgress)
                {
                    TimeRanges times = _mediaPlayer.Control.GetBufferedTimes();
                    float[] ranges = null;
                    if (times.Count > 0 && timelineRange.Duration > 0.0)
                    {
                        ranges = new float[2];
                        double x1 = (times.MinTime - timelineRange.startTime) / timelineRange.duration;
                        double x2 = ((_mediaPlayer.Control.GetCurrentTime() - timelineRange.startTime) / timelineRange.duration);
                        ranges[0] = Mathf.Max(0f, (float)x1);
                        ranges[1] = Mathf.Min(1f, (float)x2);
                    }
                    _segmentsProgress.Segments = ranges;
                }
            }
        }
        #region GUI 顯示一大堆幾乎沒用的
        //    void OnGUI()
        //    {
        //        // NOTE: These this IMGUI is just temporary until we implement the UI using uGUI

        //        if (!_mediaPlayer || _mediaPlayer.Control == null) return;

        //        //GUI.matrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, new Vector3(2f, 2f, 1f));

        //        //GUI.backgroundColor = Color.red;
        //        //GUILayout.BeginVertical(GUI.skin.box);
        //        //GUI.backgroundColor = Color.white;

        //        //GUILayout.Label("Duration " + _mediaPlayer.Info.GetDuration() + "s");
        //        //GUILayout.BeginHorizontal();
        //        //GUILayout.Label("States: ");
        //        //GUILayout.Toggle(_mediaPlayer.Control.HasMetaData(), "HasMetaData", GUI.skin.button);
        //        //GUILayout.Toggle(_mediaPlayer.Control.IsPaused(), "Paused", GUI.skin.button);
        //        //GUILayout.Toggle(_mediaPlayer.Control.IsPlaying(), "Playing", GUI.skin.button);
        //        //GUILayout.Toggle(_mediaPlayer.Control.IsBuffering(), "Buffering", GUI.skin.button);
        //        //GUILayout.Toggle(_mediaPlayer.Control.IsSeeking(), "Seeking", GUI.skin.button);
        //        //GUILayout.Toggle(_mediaPlayer.Control.IsFinished(), "Finished", GUI.skin.button);
        //        GUILayout.EndHorizontal();

        //        {
        //            TimeRanges times = _mediaPlayer.Control.GetBufferedTimes();
        //            if (times != null)
        //            {
        //                GUILayout.Label("Buffered Range " + times.MinTime + " - " + times.MaxTime);
        //            }
        //        }
        //        {
        //            TimeRanges times = _mediaPlayer.Control.GetSeekableTimes();
        //            if (times != null)
        //            {
        //                GUILayout.Label("Seek Range " + times.MinTime + " - " + times.MaxTime);
        //            }
        //        }


        //        {
        //            GUILayout.Label("Video Tracks: " + _mediaPlayer.VideoTracks.GetVideoTracks().Count);

        //            GUILayout.BeginVertical();

        //            VideoTrack selectedTrack = null;
        //            foreach (VideoTrack track in _mediaPlayer.VideoTracks.GetVideoTracks())
        //            {
        //                bool isSelected = (track == _mediaPlayer.VideoTracks.GetActiveVideoTrack());
        //                if (isSelected) GUI.color = Color.green;
        //                if (GUILayout.Button(track.DisplayName, GUILayout.ExpandWidth(false)))
        //                {
        //                    selectedTrack = track;
        //                }
        //                if (isSelected) GUI.color = Color.white;
        //            }
        //            GUILayout.EndHorizontal();
        //            if (selectedTrack != null)
        //            {
        //                _mediaPlayer.VideoTracks.SetActiveVideoTrack(selectedTrack);
        //            }
        //        }
        //        {
        //            GUILayout.Label("Audio Tracks: " + _mediaPlayer.AudioTracks.GetAudioTracks().Count);

        //            GUILayout.BeginVertical();

        //            AudioTrack selectedTrack = null;
        //            foreach (AudioTrack track in _mediaPlayer.AudioTracks.GetAudioTracks())
        //            {
        //                bool isSelected = (track == _mediaPlayer.AudioTracks.GetActiveAudioTrack());
        //                if (isSelected) GUI.color = Color.green;
        //                if (GUILayout.Button(track.DisplayName, GUILayout.ExpandWidth(false)))
        //                {
        //                    selectedTrack = track;
        //                }
        //                if (isSelected) GUI.color = Color.white;
        //            }
        //            GUILayout.EndHorizontal();
        //            if (selectedTrack != null)
        //            {
        //                _mediaPlayer.AudioTracks.SetActiveAudioTrack(selectedTrack);
        //            }
        //        }
        //        {
        //            GUILayout.Label("Text Tracks: " + _mediaPlayer.TextTracks.GetTextTracks().Count);

        //            GUILayout.BeginVertical();

        //            TextTrack selectedTrack = null;
        //            foreach (TextTrack track in _mediaPlayer.TextTracks.GetTextTracks())
        //            {
        //                bool isSelected = (track == _mediaPlayer.TextTracks.GetActiveTextTrack());
        //                if (isSelected) GUI.color = Color.green;
        //                if (GUILayout.Button(track.DisplayName, GUILayout.ExpandWidth(false)))
        //                {
        //                    selectedTrack = track;
        //                }
        //                if (isSelected) GUI.color = Color.white;
        //            }
        //            GUILayout.EndHorizontal();
        //            if (selectedTrack != null)
        //            {
        //                _mediaPlayer.TextTracks.SetActiveTextTrack(selectedTrack);
        //            }
        //        }
        //        {
        //            GUILayout.Label("FPS: " + _mediaPlayer.Info.GetVideoDisplayRate().ToString("F2"));
        //        }
        //#if (UNITY_STANDALONE_WIN)
        //			if (_mediaPlayer.PlatformOptionsWindows.bufferedFrameSelection != BufferedFrameSelectionMode.None)
        //			{
        //				IBufferedDisplay bufferedDisplay = _mediaPlayer.BufferedDisplay;
        //				if (bufferedDisplay != null)
        //				{
        //					BufferedFramesState state = bufferedDisplay.GetBufferedFramesState();
        //					GUILayout.BeginHorizontal();
        //					GUILayout.Label("Buffered Frames: " + state.bufferedFrameCount);
        //					GUILayout.HorizontalSlider(state.bufferedFrameCount, 0f, 12f);
        //					GUILayout.EndHorizontal();
        //					GUILayout.BeginHorizontal();
        //					GUILayout.Label("Free Frames: " + state.freeFrameCount);
        //					GUILayout.HorizontalSlider(state.freeFrameCount, 0f, 12f);
        //					GUILayout.EndHorizontal();
        //					GUILayout.Label("Min Timstamp: " + state.minTimeStamp);
        //					GUILayout.Label("Max Timstamp: " + state.maxTimeStamp);
        //					GUILayout.Label("Display Timstamp: " + _mediaPlayer.TextureProducer.GetTextureTimeStamp());
        //				}
        //			}
        //#endif
        //        GUILayout.EndVertical();
        //    }
        #endregion
    }
}

調用

     void Start()
        {
            MediaManager.m_Ins.SetMediaUrl("AVProVideoSamples/BigBuckBunny-360p30-H264.mp4",MediaPathType.RelativeToStreamingAssetsFolder);
            MediaManager.m_Ins.GetMediaPlayer.Events.AddListener(OnVideoEvent);
            //播放
         //   MediaManager.m_Ins.Play();
            //暫停
           // MediaManager.m_Ins.Pause();
           
        }

        private void OnVideoEvent(MediaPlayer arg0, MediaPlayerEvent.EventType arg1, ErrorCode arg2)
        {
            switch (arg1)
            {
                case MediaPlayerEvent.EventType.MetaDataReady:
                    break;
                case MediaPlayerEvent.EventType.ReadyToPlay: 
                    break;
                case MediaPlayerEvent.EventType.Started: 
                    break;
                case MediaPlayerEvent.EventType.FirstFrameReady:
                    break;
                case MediaPlayerEvent.EventType.FinishedPlaying:
                    break;
                case MediaPlayerEvent.EventType.Closing:
                    print(".Closing...");
                    break;
                case MediaPlayerEvent.EventType.Error:
                    print(".Error...");
                    break;
                case MediaPlayerEvent.EventType.SubtitleChange:
                    break;
                case MediaPlayerEvent.EventType.Stalled:
                    break;
                case MediaPlayerEvent.EventType.Unstalled:
                    break;
                case MediaPlayerEvent.EventType.ResolutionChanged:
                    break;
                case MediaPlayerEvent.EventType.StartedSeeking:
                    break;
                case MediaPlayerEvent.EventType.FinishedSeeking:
                    print("播放結束...");
                    break;
                case MediaPlayerEvent.EventType.StartedBuffering:
                    break;
                case MediaPlayerEvent.EventType.FinishedBuffering: 
                    break;
                case MediaPlayerEvent.EventType.PropertiesChanged:
                    break;
                case MediaPlayerEvent.EventType.PlaylistItemChanged:
                    break;
                case MediaPlayerEvent.EventType.PlaylistFinished:
                    break;
                case MediaPlayerEvent.EventType.TextTracksChanged:
                    break;
                //case MediaPlayerEvent.EventType.TextCueChanged://=>  SubtitleChange
                //  break;
                default:
                    break;
            }
        }

        // Update is called once per frame
        void Update()
        {
            if (Input.GetKeyDown(KeyCode.Space))
            {
                 MediaManager.m_Ins.SetMediaUrl("AVProVideoSamples/RenderHeads-1080p30-H264.mp4", MediaPathType.RelativeToStreamingAssetsFolder);
            }
            if (Input.GetKeyDown(KeyCode.A))
            {
                MediaManager.m_Ins.Stop(); 
            }
            if (Input.GetKeyDown(KeyCode.S))
            {
                MediaManager.m_Ins.Rewind(); 
            }
        }

結語

相對Unity自帶的VideoPlayer,我更喜歡用這個,功能更齊全,主要是好使,某些平臺更好使。
注意這個收費插件在安卓下使用需要在PlayerSettings => OtherSettings =>Rendering =>AutoGraphicsAPI需要取消掉,然后GraphicsAPIS設置OpenGL2或者3.
avpro unity,Unity,unity,java,游戲引擎
源碼地址:文章來源地址http://www.zghlxwxcb.cn/news/detail-697823.html

到了這里,關于Unity播放器插件-AVPro Video - Ultra Edition介紹的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Unity中使用AVPro Video播放視頻的完全指南

    Unity中使用AVPro Video播放視頻的完全指南

    Unity AVPro是一款強大的視頻播放解決方案,它支持多種視頻格式和編解碼器,能夠在Unity中實現(xiàn)高質量的視頻播放。本教程將指導你如何在Unity項目中使用AVPro播放視頻。 1、安裝AVPro Video 2、在UI上顯示視頻 3、在3D物體上顯示視頻,介紹兩種播放到物體的方法 4、編寫腳本,用按

    2024年04月16日
    瀏覽(199)
  • springboot + vue3實現(xiàn)視頻播放Demo(video.js & Vue3-video-play視頻播放器)

    springboot + vue3實現(xiàn)視頻播放Demo(video.js & Vue3-video-play視頻播放器)

    ffmpeg官網(wǎng) 長時長視頻java存儲及vue播放解決方法 【 攻城略地 】vue3 + video.js播放m3u8視頻流格式 Vue3-video-play組件官網(wǎng) Vue3視頻播放器組件Vue3-video-play入門教程 vue-video-player播放m3u8格式的視頻 Spring boot視頻播放(解決MP4大文件無法播放),整合ffmpeg,用m3u8切片播放。 Java獲取MP4視頻文

    2024年02月07日
    瀏覽(33)
  • 【VideoJs】初識videojs && video.js 視頻播放器的基本使用 && videojs基礎用法 && videojs視頻播放器 && vue3中使用videojs

    免費,開源 插件多 可自定義 【推】 雖然,但是Videojs算好了,但我覺得有點雜,特別是文檔與插件,且自定義插件有點困難,也可能是我比較菜吧 相比之下,我還是強烈推薦 【Xgplayer ——點我進入】 備用地址 http://t.csdn.cn/H0cAV Xgplayer 優(yōu)點 優(yōu)雅、美觀 文檔清晰明了 大廠出

    2024年02月03日
    瀏覽(57)
  • vue自定義h5video視頻播放器進度條組件,可拖拽、跳轉、倍速、全屏

    vue自定義h5video視頻播放器進度條組件,可拖拽、跳轉、倍速、全屏

    一個進度條組件控制多個視頻的播放、進度調整。視頻可點擊全屏觀看,唯一的進度條是某個指定視頻的視頻信息。 全屏 點擊進度條跳轉 拖動滑塊 在菜鳥教程上有以下幾個參數(shù)的詳細解說,這張圖忘記哪里看的了,如有認領可評論我貼鏈接 倍速 // 倍速 handleChangeSpeed(item)

    2024年02月12日
    瀏覽(90)
  • 【Unity】代碼控制視頻的播放(視頻播放器-更新)

    【Unity】代碼控制視頻的播放(視頻播放器-更新)

    ?結果如上圖,之前寫過一個使用代碼控制視頻播放器的Demo,但是好多小伙伴說我附帶的鏈接沒法下載,這次我直接做一個完整版的,不用下載,照著一步一步做就能做出來。 之前寫了如何設置RawImage進行自動播放,大家可以看一下基礎操作這篇文章:,大佬勿怪。 【Unity】

    2024年02月09日
    瀏覽(23)
  • 【記錄】優(yōu)化油猴插件【BD網(wǎng)盤播放器】

    【記錄】優(yōu)化油猴插件【BD網(wǎng)盤播放器】

    有錢的可以支持一下原作者,沒錢就要多學習 1.1 視頻剛開始未播放時,可能會有彈窗,不需要管,開始播放的時候自動關閉; 1.2 視頻播放時,自動關閉彈窗,并繼續(xù)播放視頻 1.3 視頻暫停時,每10s檢測一次彈窗,自動關閉彈窗 2.1 添加快捷速度調整按鈕 2.2 添加2.5和3倍速

    2024年02月16日
    瀏覽(25)
  • Unity中兩種播放器

    Unity中兩種播放器

    一、Animator動畫播放器 1.簡單搭建UI,通過Slider來控制Cube當前狀態(tài)動畫的播放 2.給Cube加上Animator組件,做兩個簡單的動畫(隨便做個來回移動的動畫就行),注意要關閉動畫的循環(huán)播放 ?3.給攝像機掛在腳本,并拖拽對應組件 ?4.給Slider掛載腳本 5.運行Unity即可 二、Video Player視

    2024年02月07日
    瀏覽(14)
  • 基于WebAssembly無插件解碼H264/H265碼流播放器

    基于WebAssembly無插件解碼H264/H265碼流播放器

    基于WebAssembly無插件解碼H264/H265碼流播放器 之前看到一篇文章:web無插件解碼播放H264/H265(WebAssembly解碼HTML5播放) H.265/HEVC在Web視頻播放的實踐 按照文章思路,已經(jīng)復現(xiàn)了web端無插件解碼H265碼流。首先說明下我這邊的環(huán)境,框架。 在海思主板上移植了web服務器nginx,用于pc端請

    2024年01月16日
    瀏覽(23)
  • uniapp(全端兼容) - 最新詳細禁用video視頻組件的拖動快進快退功能,禁止視頻播放組件video拖曳改變視頻進度,uni-app如何不讓視頻播放器手動快進和快退(可保證用戶完整觀看完視頻)

    uniapp(全端兼容) - 最新詳細禁用video視頻組件的拖動快進快退功能,禁止視頻播放組件video拖曳改變視頻進度,uni-app如何不讓視頻播放器手動快進和快退(可保證用戶完整觀看完視頻)

    在uniapp小程序/h5網(wǎng)頁網(wǎng)站/安卓蘋果app/nvue等(全平臺完美兼容)開發(fā)中,詳細實現(xiàn)Video視頻組件禁止用戶快進和快退,屏蔽禁用屏幕拖拽進行快退和快進功能(禁止用戶拖動視頻進度條),強制讓用戶從0-100完整觀看完視頻允許中途快進,適用于uni-app官方video視頻組件,也支持

    2024年04月27日
    瀏覽(28)
  • 移動端高性能Unity播放器實現(xiàn)方案

    移動端高性能Unity播放器實現(xiàn)方案

    前情提要: 視聽體驗再進化——如何在24小時內全面升級你的視頻應用 如何打造新時代的終端播放產(chǎn)品? 隨著VR、AR、元宇宙等新玩法的出現(xiàn),Unity平臺的視頻播放需求逐漸增加,比如下面兩個動圖就是在百度真實的案例。前者是演唱會場景,后者則是一個演講會場。 通過這

    2024年02月08日
    瀏覽(32)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包