找回密码
 注册帐号

扫一扫,访问微社区

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

12
回复
2383
查看
[ 复制链接 ]
排名
417
昨日变化

21

主题

215

帖子

4073

积分

Rank: 9Rank: 9Rank: 9

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

专栏作家

QQ
2019-3-29 11:40:14 显示全部楼层 阅读模式

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

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

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

示例是播放湖南卫视的rtmp视频流 ,需要等待几秒才会开始播放
img.jpg
[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熟悉之中
833/1000
排名
10817
昨日变化

3

主题

596

帖子

833

积分

Rank: 5Rank: 5

UID
310426
好友
0
蛮牛币
937
威望
0
注册时间
2019-1-2
在线时间
138 小时
最后登录
2019-6-20
2019-4-2 09:02:42 显示全部楼层
基于VLC的Unity视频播放器(二)
回复 支持 反对

使用道具 举报

6蛮牛粉丝
1341/1500
排名
2077
昨日变化

3

主题

87

帖子

1341

积分

Rank: 6Rank: 6Rank: 6

UID
124790
好友
0
蛮牛币
3074
威望
0
注册时间
2015-10-8
在线时间
585 小时
最后登录
2019-6-19
2019-4-8 11:11:59 显示全部楼层
已下载,为何,我这里播放图像是泛红的呀??
QQ图片20190408111102.png
回复 支持 反对

使用道具 举报

排名
417
昨日变化

21

主题

215

帖子

4073

积分

Rank: 9Rank: 9Rank: 9

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

专栏作家

QQ
楼主 2019-4-8 12:24:43 显示全部楼层
q598341543 发表于 2019-4-8 11:11
已下载,为何,我这里播放图像是泛红的呀??

试试这个图片格式TextureFormat.ARGB32
回复 支持 反对

使用道具 举报

排名
417
昨日变化

21

主题

215

帖子

4073

积分

Rank: 9Rank: 9Rank: 9

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

专栏作家

QQ
楼主 2019-4-8 12:24:50 显示全部楼层
q598341543 发表于 2019-4-8 11:11
已下载,为何,我这里播放图像是泛红的呀??

试试这个图片格式
回复 支持 反对

使用道具 举报

6蛮牛粉丝
1341/1500
排名
2077
昨日变化

3

主题

87

帖子

1341

积分

Rank: 6Rank: 6Rank: 6

UID
124790
好友
0
蛮牛币
3074
威望
0
注册时间
2015-10-8
在线时间
585 小时
最后登录
2019-6-19
2019-4-8 14:01:34 显示全部楼层
AWNUXCVBN 发表于 2019-4-8 12:24
试试这个图片格式TextureFormat.ARGB32

多谢! 已解决
回复 支持 反对

使用道具 举报

6蛮牛粉丝
1077/1500
排名
2236
昨日变化

1

主题

159

帖子

1077

积分

Rank: 6Rank: 6Rank: 6

UID
232255
好友
1
蛮牛币
1513
威望
0
注册时间
2017-7-15
在线时间
289 小时
最后登录
2019-6-14
2019-4-17 10:26:32 显示全部楼层
例是播放湖南卫视的rtmp视频流 ,需要等待几秒才会开始播放
回复 支持 反对

使用道具 举报

4四处流浪
341/500
排名
12304
昨日变化

3

主题

102

帖子

341

积分

Rank: 4

UID
148779
好友
0
蛮牛币
198
威望
0
注册时间
2016-5-16
在线时间
160 小时
最后登录
2019-5-30
2019-4-19 10:53:54 显示全部楼层
留名。留名。留名。留名。留名。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

4

积分

Rank: 1

UID
320069
好友
0
蛮牛币
15
威望
0
注册时间
2019-4-19
在线时间
3 小时
最后登录
2019-5-2
2019-4-19 14:32:45 显示全部楼层
你好,请问打包exe后运行报错怎么解决呢
libvlccore.dll caused an Access Violation (0xc0000005)
  in module libvlccore.dll at 0033:10abe798.
回复 支持 反对

使用道具 举报

排名
39859
昨日变化

0

主题

7

帖子

25

积分

Rank: 1

UID
142395
好友
0
蛮牛币
34
威望
0
注册时间
2016-3-20
在线时间
12 小时
最后登录
2019-6-6
2019-4-23 14:42:03 显示全部楼层
基于VLC的Unity视频播放器
回复 支持 反对

使用道具 举报

4四处流浪
317/500
排名
8486
昨日变化

2

主题

40

帖子

317

积分

Rank: 4

UID
243845
好友
0
蛮牛币
454
威望
0
注册时间
2017-9-16
在线时间
133 小时
最后登录
2019-6-20
2019-4-26 12:04:48 显示全部楼层
那我想播放别的视频流替换地址的话为什么播放不了呢?
回复 支持 反对

使用道具 举报

7日久生情
2284/5000
排名
1621
昨日变化

0

主题

771

帖子

2284

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
148286
好友
0
蛮牛币
3856
威望
0
注册时间
2016-5-11
在线时间
713 小时
最后登录
2019-6-20
2019-6-3 17:22:34 显示全部楼层
回复

使用道具 举报

7日久生情
2284/5000
排名
1621
昨日变化

0

主题

771

帖子

2284

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
148286
好友
0
蛮牛币
3856
威望
0
注册时间
2016-5-11
在线时间
713 小时
最后登录
2019-6-20
2019-6-4 20:27:07 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则