Unity Android平台 视频播放

1.Unity版本:2018.1.1f
2.AVPro版本:AVPro Video 1.9.4

一、VideoPlayer

  1. VideoRawImage参数设置如图:
    在这里插入图片描述
  2. 视频Texture大小设置如图:
    在这里插入图片描述
  3. 脚本:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Video;

public class VideoPlayerView : MonoBehaviour {
    private VideoPlayer videoPlayer;
    /// <summary>
    /// 是否播放中
    /// </summary>
    private bool isPlaying;
	// Use this for initialization
	void Awake ()
    {
        videoPlayer = GetComponent<VideoPlayer>();
        videoPlayer.waitForFirstFrame = true;
        videoPlayer.playOnAwake = false;
    }

    private void Start()
    {
        videoPlayer.errorReceived += ErrorEventHandler;
        videoPlayer.prepareCompleted += PrepareEventHandler;

        //测试 播放
        PlayVideo(Application.streamingAssetsPath + "/AVProVideoSamples/BigBuckBunny_360p30.mp4");
    }

    /// <summary>
    /// 播放视频
    /// </summary>
    /// <param name="url">视频路径</param>
    public void PlayVideo(string url)
    {
        videoPlayer.url = url;
        videoPlayer.Play();
    }

    private void PrepareEventHandler(VideoPlayer source)
    {
        if (source == videoPlayer) 
        {
            isPlaying = true;
        }
    }

    private void ErrorEventHandler(VideoPlayer source, string message)
    {
        if(videoPlayer == source)
        {
            Debug.LogError("VideoPlayerView::ErrorEventHandler - message:" + message);
        }
    }

    private void Update()
    {
        if(isPlaying)
        {
            //判断视频是否播放完成
            if(videoPlayer.frame >= (long)videoPlayer.frameCount)
            {
                Debug.Log("VideoPlayerView::Update - 视频播放完成");
                isPlaying = false;
            }
        }
    }

    private void OnDisable()
    {
        videoPlayer.errorReceived -= ErrorEventHandler;
        videoPlayer.prepareCompleted -= PrepareEventHandler;
    }
}

二、AVPro

  1. 参数设置:
    在这里插入图片描述
  2. 播放器API选择注意:
    在这里插入图片描述
  3. 代码如下:
using RenderHeads.Media.AVProVideo;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 脚本如果是动态加载的话 出现的问题有点多 按照如下方法播放 可以避免:
/// 1.加载完物体立刻播放视频无法正常播放
/// 2.播放完成通知无法接收到
/// </summary>
public class MediaPlayerView : MonoBehaviour {
    private MediaPlayer mediaPlayer;
    //用户操作是否播放
    private bool isPlaying;
    // Use this for initialization
    void Awake()
    {
        mediaPlayer = GetComponent<MediaPlayer>();
    }

    void Start()
    {
        mediaPlayer.Events.AddListener(EventHandler);
        //测试 播放
        PlayVideo(Application.streamingAssetsPath + "/AVProVideoSamples/BigBuckBunny_360p30.mp4");
    }

    private void Update()
    {
        //没有调用播放
        if (!isPlaying) return;
        if (mediaPlayer == null) return;
        //播放器没有加载完成导致Control为空 返回
        if (mediaPlayer.Control == null) return;
        //播放中
        if (mediaPlayer.Control.IsPlaying())
        {
            //视频缓冲
            if (mediaPlayer.Control.IsBuffering())
            {
                //todo 缓冲 显示加载UI等
            }
            else
            {
            }
        }
        //没有播放中
        else
        {

        }
        //暂停
        if (mediaPlayer.Control.IsPaused())
        {
            //todo 
        }
        //播放完成
        if (mediaPlayer.Control.IsFinished())
        {

        }
        else
        {
        }
    }

    /// <summary>
    /// 播放器事件处理
    /// </summary>
    /// <param name="arg0"></param>
    /// <param name="arg1"></param>
    /// <param name="arg2"></param>
    private void EventHandler(MediaPlayer arg0, MediaPlayerEvent.EventType arg1, ErrorCode arg2)
    {
        //测试事件有的时候 第一帧准备完成无法调用到 还有播放结束消息
        //arg1==MediaPlayerEvent.EventType.FinishedPlaying
        //arg1 == MediaPlayerEvent.EventType.FirstFrameReady
    }



    public void PlayVideo(string url)
    {
        StartCoroutine(WaitPlayVideo(url));
    }

    IEnumerator WaitPlayVideo(string url)
    {
        //播放器加载的过程中 可能还没有赋值
        while (mediaPlayer == null || mediaPlayer.Control == null)
        {
            yield return new WaitForEndOfFrame();
        }
        mediaPlayer.CloseVideo();
        mediaPlayer.OpenVideoFromFile(MediaPlayer.FileLocation.AbsolutePathOrURL, url);
        isPlaying = true;
    }
}

三、总结

  1. VideoPlayer在真机上播放重复加载物体调用播放,丢帧的概率比MediaPlayer大,不稳定因素比较多。
  2. MediaPlayer在退出应用重新返回应用时出现有声音无画面的异常。无法解决的bug,暂时处理为重新退出应用时关闭视频播放器,再次返回应用时可以重新调用视频播放逻辑。
  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值