1.Unity版本:2018.1.1f
2.AVPro版本:AVPro Video 1.9.4
一、VideoPlayer
VideoRawImage参数设置如图:
视频Texture大小设置如图:
脚本:
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;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
二、AVPro
参数设置:
播放器API选择注意:
代码如下:
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
三、总结
VideoPlayer在真机上播放重复加载物体调用播放,丢帧的概率比MediaPlayer大,不稳定因素比较多。
MediaPlayer在退出应用重新返回应用时出现有声音无画面的异常。无法解决的bug,暂时处理为重新退出应用时关闭视频播放器,再次返回应用时可以重新调用视频播放逻辑。
————————————————
版权声明:本文为CSDN博主「随遇而安的生活」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sinat_25682007/article/details/78822227