Unity Android平台 视频播放

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

一、VideoPlayer

  1. VideoRawImage参数设置如图:
    Unity Android平台 视频播放_第1张图片
  2. 视频Texture大小设置如图:
    Unity Android平台 视频播放_第2张图片
  3. 脚本:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Video;

public class VideoPlayerView : MonoBehaviour {
    private VideoPlayer videoPlayer;
    /// 
    /// 是否播放中
    /// 
    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");
    }

    /// 
    /// 播放视频
    /// 
    /// 视频路径
    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. 参数设置:
    Unity Android平台 视频播放_第3张图片
  2. 播放器API选择注意:
    Unity Android平台 视频播放_第4张图片
  3. 代码如下:
using RenderHeads.Media.AVProVideo;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// 
/// 脚本如果是动态加载的话 出现的问题有点多 按照如下方法播放 可以避免:
/// 1.加载完物体立刻播放视频无法正常播放
/// 2.播放完成通知无法接收到
/// 
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
        {
        }
    }

    /// 
    /// 播放器事件处理
    /// 
    /// 
    /// 
    /// 
    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,暂时处理为重新退出应用时关闭视频播放器,再次返回应用时可以重新调用视频播放逻辑。

你可能感兴趣的:(Unity3D学习笔记)