薛飞 基于VLC的Unity视频播放器(二)

6
回复
1559
查看
打印 上一主题 下一主题
[ 复制链接 ]
排名
418
昨日变化

21

主题

212

帖子

4011

积分

Rank: 9Rank: 9Rank: 9

UID
686
好友
18
蛮牛币
5334
威望
0
注册时间
2013-7-4
在线时间
1668 小时
最后登录
2019-4-18

专栏作家

QQ

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 AWNUXCVBN 于 2019-3-29 11:53 编辑

示例是播放湖南卫视的rtmp视频流 ,需要等待几秒才会开始播放

[C#] 纯文本查看 复制代码
using Net.Media;
using System;
using System.IO;
using System.Runtime.InteropServices;
using UnityEngine;

public class Test : MonoBehaviour
{
    //视频宽
    public int width = 1024;
    //视频高
    public int height = 768;
    public Texture2D texture;
    public Material mat;
    IntPtr libvlc_instance_t;
    IntPtr libvlc_media_player_t;
    IntPtr handle;

    private VideoLockCB _videoLockCB;
    private VideoUnlockCB _videoUnlockCB;
    private VideoDisplayCB _videoDisplayCB;

    private int _pixelBytes = 4;
    private int _pitch;
    private IntPtr _buff = IntPtr.Zero;
    bool ready = false;

    string snapShotpath;
    // Use this for initialization
    void Start()
    {
        Loom.Initialize();
        snapShotpath = "file:///" + Application.streamingAssetsPath;

        _videoLockCB += VideoLockCallBack;

        _videoUnlockCB += VideoUnlockCallBack;

        _videoDisplayCB += VideoDiplayCallBack;


        handle = new IntPtr(1);

        libvlc_instance_t = MediaPlayer.Create_Media_Instance();

        libvlc_media_player_t = MediaPlayer.Create_MediaPlayer(libvlc_instance_t, handle);
        //湖南卫视直播地址
        string videoPath = "rtmp://58.200.131.2:1935/livetv/hunantv";
        //本地视频地址
        //string videoPath = "file:///" + Application.streamingAssetsPath + "/test.mp4";
        bool state = MediaPlayer.SetLocation(libvlc_instance_t, libvlc_media_player_t, videoPath);
        Debug.Log("state:" + state);
        width = MediaPlayer.GetMediaWidth(libvlc_media_player_t);
        Debug.Log("width: " + width);
        height = MediaPlayer.GetMediaHeight(libvlc_media_player_t);
        Debug.Log("height: " + height);
        //网络地址不晓得怎么拿到视频宽高
        if(width==0&&height==0)
        {
            width = 1024;
            height = 576;
        }
        _pitch = width * _pixelBytes;
        _buff = Marshal.AllocHGlobal(_pitch * height);
        texture = new Texture2D(width, height, TextureFormat.RGBA32, false);
        mat.mainTexture = texture;

        MediaPlayer.SetCallbacks(libvlc_media_player_t, _videoLockCB, _videoUnlockCB, _videoDisplayCB, IntPtr.Zero);
        MediaPlayer.SetFormart(libvlc_media_player_t, "ARGB", width, height, _pitch);

        ready = MediaPlayer.MediaPlayer_Play(libvlc_media_player_t);
        Debug.Log("ready:" + ready);

        Debug.Log(MediaPlayer.MediaPlayer_IsPlaying(libvlc_media_player_t));
    }


    // Update is called once per frame
    void Update()
    {

    }

    private void FixedUpdate()
    {

    }

    private void OnGUI()
    {
        if (GUI.Button(new Rect(0, 0, 100, 100), "Take"))
        {
            Debug.Log("snapShotpath:" + snapShotpath);
            Debug.Log("@snapShotpath:" + @snapShotpath);
            //vlc截图未解决 用Unity保存帧图,画面是上下反转左右反转的
            //Debug.Log(MediaPlayer.TakeSnapShot(libvlc_media_player_t, snapShotpath, "testa.jpg", width, height));
            byte[] bs = texture.EncodeToJPG();
            File.WriteAllBytes(Application.streamingAssetsPath + "/test.jpg", bs);
        }

    }

    private IntPtr VideoLockCallBack(IntPtr opaque, IntPtr planes)
    {
        Lock(); 
        Marshal.WriteIntPtr(planes, 0, _buff);
        Loom.QueueOnMainThread(() =>
        {
            texture.LoadRawTextureData(_buff, _buff.ToInt32());
            texture.Apply();
        });
        return IntPtr.Zero;
    }

    private void VideoDiplayCallBack(IntPtr opaque, IntPtr picture)
    { 
        
    }

    private void VideoUnlockCallBack(IntPtr opaque, IntPtr picture, IntPtr planes)
    { 
        Unlock();
    }
     
    bool obj = false;
    private void Lock()
    {
        obj = true;
    }
    private void Unlock()
    {
        obj = false;
    }
    private bool Islock()
    {
        return obj;
    }

    private void OnDestroy()
    {

    }

    private void OnApplicationFocus(bool focus)
    {

    }

    private void OnApplicationQuit()
    {
        try
        {
            if (MediaPlayer.MediaPlayer_IsPlaying(libvlc_media_player_t))
            {
                MediaPlayer.MediaPlayer_Stop(libvlc_media_player_t);
            }

            MediaPlayer.Release_MediaPlayer(libvlc_media_player_t);

            MediaPlayer.Release_Media_Instance(libvlc_instance_t); 
        }
        catch (Exception e)
        {
            Debug.Log(e.Message);
        }
    }
}


工程地址https://gitee.com/awnuxcvbn/UnityVLC
5熟悉之中
571/1000
排名
10816
昨日变化

2

主题

382

帖子

571

积分

Rank: 5Rank: 5

UID
310426
好友
0
蛮牛币
447
威望
0
注册时间
2019-1-2
在线时间
91 小时
最后登录
2019-4-18
沙发
2019-4-2 09:02:42 只看该作者
基于VLC的Unity视频播放器(二)
6蛮牛粉丝
1317/1500
排名
2077
昨日变化

3

主题

86

帖子

1317

积分

Rank: 6Rank: 6Rank: 6

UID
124790
好友
0
蛮牛币
2967
威望
0
注册时间
2015-10-8
在线时间
563 小时
最后登录
2019-4-12
板凳
2019-4-8 11:11:59 只看该作者
已下载,为何,我这里播放图像是泛红的呀??

QQ图片20190408111102.png (591.34 KB, 下载次数: 1)

QQ图片20190408111102.png
排名
418
昨日变化

21

主题

212

帖子

4011

积分

Rank: 9Rank: 9Rank: 9

UID
686
好友
18
蛮牛币
5334
威望
0
注册时间
2013-7-4
在线时间
1668 小时
最后登录
2019-4-18

专栏作家

QQ
地板
楼主 2019-4-8 12:24:43 只看该作者
q598341543 发表于 2019-4-8 11:11
已下载,为何,我这里播放图像是泛红的呀??

试试这个图片格式TextureFormat.ARGB32
排名
418
昨日变化

21

主题

212

帖子

4011

积分

Rank: 9Rank: 9Rank: 9

UID
686
好友
18
蛮牛币
5334
威望
0
注册时间
2013-7-4
在线时间
1668 小时
最后登录
2019-4-18

专栏作家

QQ
5#
楼主 2019-4-8 12:24:50 只看该作者
q598341543 发表于 2019-4-8 11:11
已下载,为何,我这里播放图像是泛红的呀??

试试这个图片格式
6蛮牛粉丝
1317/1500
排名
2077
昨日变化

3

主题

86

帖子

1317

积分

Rank: 6Rank: 6Rank: 6

UID
124790
好友
0
蛮牛币
2967
威望
0
注册时间
2015-10-8
在线时间
563 小时
最后登录
2019-4-12
6#
2019-4-8 14:01:34 只看该作者
AWNUXCVBN 发表于 2019-4-8 12:24
试试这个图片格式TextureFormat.ARGB32

多谢! 已解决
6蛮牛粉丝
1027/1500
排名
2236
昨日变化

1

主题

141

帖子

1027

积分

Rank: 6Rank: 6Rank: 6

UID
232255
好友
1
蛮牛币
1336
威望
0
注册时间
2017-7-15
在线时间
257 小时
最后登录
2019-4-18
7#
前天 10:26 只看该作者
例是播放湖南卫视的rtmp视频流 ,需要等待几秒才会开始播放
您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则