舞者678 2016-10-18 11:14 采纳率: 0%
浏览 6330

C# 使用VLC编写的播放器,使用libvlc_video_set_callbacks进入回调后报错

参考http://www.cnblogs.com/smartsensor/p/4343769.html 中的回调功能,想将视频的每一帧图片截取下来,代码如下
private const int _width = 1920;
private const int _height = 1080;
private const int _pixelBytes = 4;
private const int _pitch = _width * _pixelBytes;
private IntPtr _buff = IntPtr.Zero;

    private VideoLockCB _videoLockCB;
    private VideoUnlockCB _videoUnlockCB;
    private VideoDisplayCB _videoDisplayCB;
    private void button3_Click(object sender, EventArgs e)
    {

        if (_videoLockCB == null)
            _videoLockCB = new VideoLockCB(VideoLockCallBack);
        if (_videoUnlockCB == null)
            _videoUnlockCB = new VideoUnlockCB(VideoUnlockCallBack);
        if (_videoDisplayCB == null)
            _videoDisplayCB = new VideoDisplayCB(VideoDiplayCallBack);


        string pluginPath = System.Environment.CurrentDirectory + "\\plugins\\";
        string plugin_arg = "--plugin-path=" + pluginPath;
        string[] arguments = { "-I", "dummy", "--ignore-config", "--no-video-title", plugin_arg };
        IntPtr vlcInstance = libvlc_new(arguments);//




        IntPtr mediaInstance = libvlc_media_new_path(vlcInstance, "C:\\Users\\Administrator\\Videos\\Vive Cinema\\test.mp4");
        IntPtr mediaPlayerInstance = libvlc_media_player_new_from_media(mediaInstance);

// IntPtr render_wnd = this.panel1.Handle;//
// libvlc_media_player_set_hwnd(mediaPlayerInstance, (Int64)render_wnd);

        libvlc_media_release(mediaInstance);

        libvlc_video_set_format(mediaPlayerInstance, "RV32", _width, _height, _pitch);//RGBA 颜色不对,YUYV显示错误,I420程序跳出
        libvlc_video_set_callbacks(mediaPlayerInstance, _videoLockCB, _videoUnlockCB, _videoDisplayCB, IntPtr.Zero);

        libvlc_media_player_play(mediaPlayerInstance);

        /*Thread.Sleep(200);
        int length = libvlc_media_player_get_length(mediaPlayerInstance);
        int width = libvlc_video_get_width(mediaPlayerInstance);
        int height = libvlc_video_get_height(mediaPlayerInstance);

        Console.WriteLine("" + length + "," + width + "," + height);
         * */
    }

    [DllImport("libvlc.dll", EntryPoint = "libvlc_media_player_new_from_media", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
    public static extern IntPtr libvlc_media_player_new_from_media(IntPtr mediaInstance);
    [DllImport("libvlc.dll", EntryPoint = "libvlc_video_set_callbacks", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
    public static extern void libvlc_video_set_callbacks(IntPtr mediaPlayInstance, VideoLockCB lockCB, VideoUnlockCB unlockCB, VideoDisplayCB displayCB, IntPtr opaque);
    [DllImport("libvlc.dll", EntryPoint = "libvlc_video_set_format", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
    public static extern void libvlc_video_set_format(IntPtr mediaPlayerInstance, IntPtr chroma, UInt32 width, UInt32 height, UInt32 pitch);
    public delegate IntPtr VideoLockCB(IntPtr opaque, IntPtr planes);
    //解锁一个图片缓冲区
    public delegate void VideoUnlockCB(IntPtr opaque, IntPtr picture, IntPtr planes);
    //显示图片
    public delegate void VideoDisplayCB(IntPtr opaque, IntPtr picture);
    // 锁定一个图片缓冲区时先锁定,然后初始化这个缓冲区。
    private IntPtr VideoLockCallBack(IntPtr opaque, IntPtr planes)
    {
        Lock();
        _buff = Marshal.AllocHGlobal(_pitch * _height);
        Marshal.WriteIntPtr(planes, _buff);//初始化
        return IntPtr.Zero;
    }

   private void VideoDiplayCallBack(IntPtr opaque, IntPtr picture)
    {

    }

    //解锁图片缓冲区
    private void VideoUnlockCallBack(IntPtr opaque, IntPtr picture, IntPtr planes)
    {
        Marshal.FreeHGlobal(_buff);//释放缓冲区
        Unlock();
    }


    bool obj = false;
    private void Lock()
    {
        obj = true;
    }
    private void Unlock()
    {
        obj = false;
    }
    private bool Islock()
    {
        return obj;
    }

运行的时候,点击按钮后,会在VideoLockCallBack返回后报错,直接就不能运行了,帮忙看一下是什么原因,VLC版本位2.2.4

  • 写回答

3条回答 默认 最新

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作