播放网络视频、本地视频;可以暂停、前后拖动、快进、快退、音量调节、下一个视频

环境:Unity5.6以上

Unity正式发布了5.6版本后,作为5.x版本的最后一版还是有不少给力的更新的。其中新加入了一个Video Player控件,用以取代之前的MovieTexture。

VideoPlayer API

VideoClip API

首先导入视频,因为默认不进行编码转换,现在的视频导入速度比以前快很多。

Video Player还提供了多种视频渲染的方式,包括Camera Far Plane,Camera Near Plane,Render Texture,Material Override,Api Only。

本地视频播放:

直接将视频拖到VideoClip上

这个时候就可以播放了。

网络视频播放:

将网络视频的链接写到URL上面

这个时候就可以播放了

也可以通过URL播放本地视频,Browse...可以选择本地视频的路径,并且自动生成URL

这个时候我们会发现,播放的时候没有声音。

我们只要添加一个Audio Source组件,将他赋给VideoPlayer里面的Audio Source就有声音了

整合视频播放:

脚本控制(需引用UnityEngine.Video):

VideoPlayer的脚本控制与AudioSource相似,有常规的Play,Pause,Stop方法,也有用于进度控制的time,isPlaying,isLooping,frame,frameCount等属性。

用代码控制播放:

[C#] 纯文本查看 复制代码

?

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.Video;

using UnityEngine.UI;

using System;

public class VideoPlayerTeach : MonoBehaviour {

//图像

public RawImage image;

//播放器

public VideoPlayer vPlayer;

public string urlNetWork = "http://www.quirksmode.org/html5/videos/big_buck_bunny.mp4";//网络视频路径

//播放

public Button btn_Play;

//暂停

public Button btn_Pause;

//前进

public Button btn_Fornt;

//后退

public Button btn_Back;

//下一个

public Button btn_Next;

//视频控制器

public Slider sliderVideo;

//音量控制器

public Slider sliderSource;

//音量大小

public Text text;

//当前视频时间

public Text text_Time;

//视频总时长

public Text text_Count;

//音频组件

public AudioSource source;

//需要添加播放器的物体

public GameObject obj;

//是否拿到视频总时长

public bool isShow;

//前进后退的大小

public float numBer = 20f;

//时 分的转换

private int hour, mint;

private float time;

private float time_Count;

private float time_Current;

//视频是否播放完成

private bool isVideo;

// Use this for initialization

void Start () {

image = obj.GetComponent<RawImage>();

//一定要动态添加这两个组件,要不然会没声音

vPlayer = obj.AddComponent<VideoPlayer>();

source = obj.AddComponent<AudioSource>();

//这3个参数不设置也会没声音 唤醒时就播放关闭

vPlayer.playOnAwake = false;

source.playOnAwake = false;

source.Pause();

//初始化

Init(urlNetWork);

btn_Play.onClick.AddListener(delegate { OnClick(0); });

btn_Pause.onClick.AddListener(delegate { OnClick(1); });

btn_Fornt.onClick.AddListener(delegate { OnClick(2); });

btn_Back.onClick.AddListener(delegate { OnClick(3); });

btn_Next.onClick.AddListener(delegate { OnClick(4); });

sliderSource.value = source.volume;

text.text = string.Format("{0:0}%", source.volume * 100);

sliderSource.onValueChanged.AddListener(delegate { ChangeSource(sliderSource.value); });

}

/// <summary>

///     初始化VideoPlayer

/// </summary>

/// <param name="url"></param>

private void Init(string url) {

isVideo = true;

isShow = true;

time_Count = 0;

time_Current = 0;

sliderVideo.value = 0;

//设置为URL模式

vPlayer.source = VideoSource.Url;

//设置播放路径

vPlayer.url = url;

//在视频中嵌入的音频类型

vPlayer.audioOutputMode = VideoAudioOutputMode.AudioSource;

//把声音组件赋值给VideoPlayer

vPlayer.SetTargetAudioSource(0, source);

//当VideoPlayer全部设置好的时候调用

vPlayer.prepareCompleted += Prepared;

//启动播放器

vPlayer.Prepare();

}

/// <summary>

///     改变音量大小

/// </summary>

/// <param name="value"></param>

public void ChangeSource(float value) {

source.volume = value;

text.text = string.Format("{0:0}%", value * 100);

}

/// <summary>

///     改变视频进度

/// </summary>

/// <param name="value"></param>

public void ChangeVideo(float value) {

if (vPlayer.isPrepared)

{

vPlayer.time = (long)value;

Debug.Log("VideoPlayer Time:"+vPlayer.time);

time = (float)vPlayer.time;

hour = (int)time / 60;

mint = (int)time % 60;

text_Time.text = string.Format("{0:D2}:{1:D2}", hour.ToString(), mint.ToString());

}

}

private void OnClick(int num) {

switch (num)

{

case 0:

vPlayer.Play();

Time.timeScale = 1;

break;

case 1:

vPlayer.Pause();

Time.timeScale = 0;

break;

case 2:

sliderVideo.value = sliderVideo.value + numBer;

break;

case 3:

sliderVideo.value = sliderVideo.value - numBer;

break;

case 4:

vPlayer.Stop();

Init(Application.streamingAssetsPath + "/EasyMovieTexture.mp4");

break;

default:

break;

}

}

// Update is called once per frame

void Update ()

{

if (vPlayer.isPlaying && isShow)

{

//把图像赋给RawImage

image.texture = vPlayer.texture;

//帧数/帧速率=总时长    如果是本地直接赋值的视频,我们可以通过VideoClip.length获取总时长

sliderVideo.maxValue = vPlayer.frameCount/vPlayer.frameRate;

time = sliderVideo.maxValue;

hour = (int)time / 60;

mint = (int)time % 60;

text_Count.text = string.Format("/  {0:D2}:{1:D2}", hour.ToString(), mint.ToString());

sliderVideo.onValueChanged.AddListener(delegate { ChangeVideo(sliderVideo.value); });

isShow = !isShow;

}

if (Mathf.Abs((int)vPlayer.time - (int)sliderVideo.maxValue) == 0)

{

vPlayer.frame = (long)vPlayer.frameCount;

vPlayer.Stop();

Debug.Log("播放完成!");

isVideo = false;

return;

}

else if (isVideo && vPlayer.isPlaying)

{

time_Count += Time.deltaTime;

if ((time_Count - time_Current) >= 1)

{

sliderVideo.value += 1;

Debug.Log("value:" + sliderVideo.value);

time_Current = time_Count;

}

}

}

private void FixedUpdate()

{

}

void Prepared(VideoPlayer player) {

player.Play();

}

}[/size][/font][/align][align=left][font=&quot;][size=16px]}[/size][/font][font=&quot;][size=16px]

播放网络视频、本地视频;可以暂停、前后拖动、快进、快退、音量调节、下一个视频

环境:Unity5.6以上
Unity正式发布了5.6版本后,作为5.x版本的最后一版还是有不少给力的更新的。其中新加入了一个Video Player控件,用以取代之前的MovieTexture。
首先导入视频,因为默认不进行编码转换,现在的视频导入速度比以前快很多。
 
Video Player还提供了多种视频渲染的方式,包括Camera Far Plane,Camera Near Plane,Render Texture,Material Override,Api Only。

本地视频播放:

直接将视频拖到VideoClip上
 
这个时候就可以播放了。
 

网络视频播放:

将网络视频的链接写到URL上面
 
这个时候就可以播放了
 
也可以通过URL播放本地视频,Browse...可以选择本地视频的路径,并且自动生成URL
这个时候我们会发现,播放的时候没有声音。
我们只要添加一个Audio Source组件,将他赋给VideoPlayer里面的Audio Source就有声音了
 
 

整合视频播放:

脚本控制(需引用UnityEngine.Video):
VideoPlayer的脚本控制与AudioSource相似,有常规的Play,Pause,Stop方法,也有用于进度控制的time,isPlaying,isLooping,frame,frameCount等属性。
 
用代码控制播放:
[C#] 纯文本查看 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Video;
using UnityEngine.UI;
using System;
 
public class VideoPlayerTeach : MonoBehaviour {
    //图像
    public RawImage image;
    //播放器
    public VideoPlayer vPlayer;
    public string urlNetWork = "http://www.quirksmode.org/html5/videos/big_buck_bunny.mp4";//网络视频路径
    //播放
    public Button btn_Play;
    //暂停
    public Button btn_Pause;
    //前进
    public Button btn_Fornt;
    //后退
    public Button btn_Back;
    //下一个
    public Button btn_Next;
    //视频控制器
    public Slider sliderVideo;
    //音量控制器
    public Slider sliderSource;
    //音量大小
    public Text text;
    //当前视频时间
    public Text text_Time;
    //视频总时长
    public Text text_Count;
    //音频组件
    public AudioSource source;
    //需要添加播放器的物体
    public GameObject obj;
    //是否拿到视频总时长
    public bool isShow;
    //前进后退的大小
    public float numBer = 20f;
    //时 分的转换
    private int hour, mint;
    private float time;
    private float time_Count;
    private float time_Current;
    //视频是否播放完成
    private bool isVideo;
 
    // Use this for initialization
    void Start () {
        image = obj.GetComponent<RawImage>();
        //一定要动态添加这两个组件,要不然会没声音
        vPlayer = obj.AddComponent<VideoPlayer>();
        source = obj.AddComponent<AudioSource>();
 
        //这3个参数不设置也会没声音 唤醒时就播放关闭
        vPlayer.playOnAwake = false;
        source.playOnAwake = false;
        source.Pause();
 
        //初始化
        Init(urlNetWork);
 
        btn_Play.onClick.AddListener(delegate { OnClick(0); });
        btn_Pause.onClick.AddListener(delegate { OnClick(1); });
        btn_Fornt.onClick.AddListener(delegate { OnClick(2); });
        btn_Back.onClick.AddListener(delegate { OnClick(3); });
        btn_Next.onClick.AddListener(delegate { OnClick(4); });
 
        sliderSource.value = source.volume;
        text.text = string.Format("{0:0}%", source.volume * 100);
        sliderSource.onValueChanged.AddListener(delegate { ChangeSource(sliderSource.value); });
    }
 
    /// <summary>
    ///     初始化VideoPlayer
    /// </summary>
    /// <param name="url"></param>
    private void Init(string url) {
        isVideo = true;
        isShow = true;
        time_Count = 0;
        time_Current = 0;
        sliderVideo.value = 0;
        //设置为URL模式
        vPlayer.source = VideoSource.Url;
        //设置播放路径
        vPlayer.url = url;
        //在视频中嵌入的音频类型
        vPlayer.audioOutputMode = VideoAudioOutputMode.AudioSource;
 
        //把声音组件赋值给VideoPlayer
        vPlayer.SetTargetAudioSource(0, source);
 
        //当VideoPlayer全部设置好的时候调用
        vPlayer.prepareCompleted += Prepared;
        //启动播放器
        vPlayer.Prepare();
    }
 
    /// <summary>
    ///     改变音量大小
    /// </summary>
    /// <param name="value"></param>
    public void ChangeSource(float value) {
        source.volume = value;
        text.text = string.Format("{0:0}%", value * 100);
    }
 
    /// <summary>
    ///     改变视频进度
    /// </summary>
    /// <param name="value"></param>
    public void ChangeVideo(float value) {
        if (vPlayer.isPrepared)
        {
            vPlayer.time = (long)value;
            Debug.Log("VideoPlayer Time:"+vPlayer.time);
            time = (float)vPlayer.time;
            hour = (int)time / 60;
            mint = (int)time % 60;
            text_Time.text = string.Format("{0:D2}:{1:D2}", hour.ToString(), mint.ToString());
        }
    }
 
    private void OnClick(int num) {
        switch (num)
        {
            case 0:
                vPlayer.Play();
                Time.timeScale = 1;
                break;
            case 1:
                vPlayer.Pause();
                Time.timeScale = 0;
                break;
            case 2:
                sliderVideo.value = sliderVideo.value + numBer;
                break;
            case 3:
                sliderVideo.value = sliderVideo.value - numBer;
                break;
            case 4:
                vPlayer.Stop();
                Init(Application.streamingAssetsPath + "/EasyMovieTexture.mp4");
                break;
            default:
                break;
        }
    }
     
    // Update is called once per frame
    void Update ()
    {
        if (vPlayer.isPlaying && isShow)
        {
            //把图像赋给RawImage
            image.texture = vPlayer.texture;
            //帧数/帧速率=总时长    如果是本地直接赋值的视频,我们可以通过VideoClip.length获取总时长
            sliderVideo.maxValue = vPlayer.frameCount/vPlayer.frameRate;
 
            time = sliderVideo.maxValue;
            hour = (int)time / 60;
            mint = (int)time % 60;
            text_Count.text = string.Format("/  {0:D2}:{1:D2}", hour.ToString(), mint.ToString());
 
            sliderVideo.onValueChanged.AddListener(delegate { ChangeVideo(sliderVideo.value); });
            isShow = !isShow;
        }
 
        if (Mathf.Abs((int)vPlayer.time - (int)sliderVideo.maxValue) == 0)
        {
            vPlayer.frame = (long)vPlayer.frameCount;
            vPlayer.Stop();
            Debug.Log("播放完成!");
            isVideo = false;
            return;
        }
        else if (isVideo && vPlayer.isPlaying)
        {
            time_Count += Time.deltaTime;
            if ((time_Count - time_Current) >= 1)
            {
                sliderVideo.value += 1;
                Debug.Log("value:" + sliderVideo.value);
                time_Current = time_Count;
            }
        }
    }
 
    private void FixedUpdate()
    {
 
    }
 
    void Prepared(VideoPlayer player) {
        player.Play();
    }
}[/size][/font][/align][align=left][font=&quot;][size=16px]}[/size][/font][font=&quot;][size=16px]

VideoPlayer播放的更多相关文章

  1. 搭建rtmp直播流服务之4:videojs和ckPlayer开源播放器二次开发(播放rtmp、hls直播流及普通视频)

    前面几章讲解了使用 nginx-rtmp搭建直播流媒体服务器; ffmpeg推流到nginx-rtmp服务器; java通过命令行调用ffmpeg实现推流服务; 从数据源获取,到使用ffmpeg推流, ...

  2. 转:RTMPdump使用相关

    在FFMPEG中使用libRTMP的经验 FFMPEG在编译的时候可以选择支持RTMP的类库libRTMP.这样ffmpeg就可以支持rtmp://, rtmpt://, rtmpe://, rtmp ...

  3. 最简单的基于FFmpeg的推流器(以推送RTMP为例)

    ===================================================== 最简单的基于FFmpeg的推流器系列文章列表: <最简单的基于FFmpeg的推流器(以 ...

  4. iOS 音视频播放

    播放控制切换为: ijkplayer wiki: https://github.com/changsanjiang/SJVideoPlayer/wiki/Use-ijkplayer 播放控制切换为: ...

  5. 还在一个模块打天下嘛?你知道引入Jetpack架构后,你的App会发生哪些奇妙的变化吗?

    前言 上篇文章我给大家分享了我对Android架构的理解,从思想层面去讲述架构的演进过程.很多小伙伴读完后拍手叫好,表示还想听我讲一下对Jetpack 架构的看法,本着帮人帮到底的精神,今天我将再次动 ...

  6. Unity3D学习(十):使用VideoPlayer在UI上播放视频

    前言 每一款游戏往往启动的第一次都会播放CG动画之类的,Unity本身对于移动平台也提供了一个接口. Handheld.PlayFullScreenMovie("path") 过场 ...

  7. 【Android】 修复ijkPlayer进行m3u8 hls流播放时seek进度条拖动不准确的问题

    项目中使用的播放器是ijkPlayer,发现播放切片特点的hls流(m3u8格式的视频)拖动seekBar的时候会莫名的跳转或者seek不到准确的位置,发现网友也遇到了同样的问题,ijk的开发者也说明 ...

  8. .NET中使用APlayer组件自制播放器

    目录 说明 APlayer介绍 APlayer具备功能 APlayer使用 自制播放器Demo 未完成工作 源码下载 说明 由于需求原因,需要在项目中(桌面程序)集成一个在线播放视频的功能.大概要具备 ...

  9. AVFoundation播放视频时显示字幕,切换音轨

    主要用到两个类:AVMediaSelectionGroup 和 AVMediaSelectionOption 调用 AVAsset对象的availableMediaCharacteristicsWit ...

随机推荐

  1. 第三篇——Struts2的动态方法调用

    Struts2动态方法调用 默认方式:默认执行方法中的execute方法,若指定类中没有该方法,默认返回success: method方式:执行method属性中定义的方法,没有该方法,页面报错: 通 ...

  2. Python 第五阶段 学习记录之----ORM

    ORM: orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为了 ...

  3. Tomcat 加载 jsp 异常:ServletException: java.lang.LinkageError

    环境:win10 JDK:java version "1.8.0_131" mvn 内置 Tomcat 报错: javax.servlet.ServletException: ja ...

  4. oracle(3)

    存储过程: CREATE OR REPLACE PROCEDURE PROC_ABC ( currency IN NUMBER, aysdate IN DATE, money OUT number ) ...

  5. Fast Matrix Calculation HDU - 4965

    One day, Alice and Bob felt bored again, Bob knows Alice is a girl who loves math and is just learni ...

  6. Bootstrap3基础 thumbnail 圆角类型的div块

      内容 参数   OS   Windows 10 x64   browser   Firefox 65.0.2   framework     Bootstrap 3.3.7   editor    ...

  7. CSDN不登录阅读全文(最新更新

    CSDN真的烦...然而没卵用 用stylus加两行css就行了: .article_content{height:auto!important} .hide-article-box{display: ...

  8. P5205 【模板】多项式开根

    思路 按如下式子计算即可 \[ B(x)=\frac{A(x)+B'^2(x)}{2B'(x)} \] 代码 // luogu-judger-enable-o2 #include <cstdio ...

  9. itsdangerous

    将字典进行加密.解密 通过私钥保证安全性 serializer=TimedJSONWebSignatureSerializer(私钥,过期时间) dumps(字典)=====>返回加密字符串 l ...

  10. vue中插入Echarts示例(菜鸟记录)