参考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