using System;
using System.Text;
using System.Runtime.InteropServices;
using System.Security;
using System.IO;
using System.Threading;
namespace Net.Media
{
//定义替代变量
using libvlc_media_t = System.IntPtr;
using libvlc_media_player_t = System.IntPtr;
using libvlc_instance_t = System.IntPtr;
class MediaPlayer
{
#region 全局变量
//数组转换为指针
internal struct PointerToArrayOfPointerHelper
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)]
public IntPtr[] pointers;
}
//vlc库启动参数配置
private static string pluginPath = System.Environment.CurrentDirectory + "\\plugins\\";
private static string plugin_arg = "--plugin-path=" + pluginPath;
//用于播放节目时,转录节目
//private static string program_arg = "--sout=#duplicate{dst=std{access=file,mux=ts,dst=d:/test.ts}}";
private static string[] arguments = { "-I", "dummy", "--ignore-config", "--video-title", plugin_arg};//, program_arg };
#region 结构体
public struct libvlc_media_stats_t
{
/* Input */
public int i_read_bytes;
public float f_input_bitrate;
/* Demux */
public int i_demux_read_bytes;
public float f_demux_bitrate;
public int i_demux_corrupted;
public int i_demux_discontinuity;
/* Decoders */
public int i_decoded_video;
public int i_decoded_audio;
/* Video Output */
public int i_displayed_pictures;
public int i_lost_pictures;
/* Audio output */
public int i_played_abuffers;
public int i_lost_abuffers;
/* Stream output */
public int i_sent_packets;
public int i_sent_bytes;
public float f_send_bitrate;
}
#endregion
#endregion
#region 公开函数
/// <summary>
/// 创建VLC播放资源索引
/// </summary>
/// <param name="arguments"></param>
/// <returns></returns>
public static libvlc_instance_t Create_Media_Instance()
{
libvlc_instance_t libvlc_instance = IntPtr.Zero;
IntPtr argvPtr = IntPtr.Zero;
try
{
if (arguments.Length == 0 ||
arguments == null)
{
return IntPtr.Zero;
}
//将string数组转换为指针
argvPtr = StrToIntPtr(arguments);
if (argvPtr == null || argvPtr == IntPtr.Zero)
{
return IntPtr.Zero;
}
//设置启动参数
libvlc_instance = SafeNativeMethods.libvlc_new(arguments.Length, argvPtr);
if (libvlc_instance == null || libvlc_instance == IntPtr.Zero)
{
return IntPtr.Zero;
}
return libvlc_instance;
}
catch
{
return IntPtr.Zero;
}
}
/// <summary>
/// 释放VLC播放资源索引
/// </summary>
/// <param name="libvlc_instance">VLC 全局变量</param>
public static void Release_Media_Instance(libvlc_instance_t libvlc_instance)
{
try
{
if (libvlc_instance != IntPtr.Zero ||
libvlc_instance != null)
{
SafeNativeMethods.libvlc_release(libvlc_instance);
}
libvlc_instance = IntPtr.Zero;
}
catch (Exception)
{
libvlc_instance = IntPtr.Zero;
}
}
/// <summary>
/// 创建VLC播放器
/// </summary>
/// <param name="libvlc_instance">VLC 全局变量</param>
/// <param name="handle">VLC MediaPlayer需要绑定显示的窗体句柄</param>
/// <returns></returns>
public static libvlc_media_player_t Create_MediaPlayer(libvlc_instance_t libvlc_instance, IntPtr handle)
{
libvlc_media_player_t libvlc_media_player = IntPtr.Zero;
try
{
if (libvlc_instance == IntPtr.Zero ||
libvlc_instance == null ||
handle == IntPtr.Zero ||
handle == null)
{
return IntPtr.Zero;
}
//创建播放器
libvlc_media_player = SafeNativeMethods.libvlc_media_player_new(libvlc_instance);
if (libvlc_media_player == null || libvlc_media_player == IntPtr.Zero)
{
return IntPtr.Zero;
}
//设置播放窗口
SafeNativeMethods.libvlc_media_player_set_hwnd(libvlc_media_player, (int)handle);
return libvlc_media_player;
}
catch
{
SafeNativeMethods.libvlc_media_player_release(libvlc_media_player);
return IntPtr.Zero;
}
}
/// <summary>
/// 释放媒体播放器
/// </summary>
/// <param name&#
C#中调用libvlc实现本地、网络节目流的播放
最新推荐文章于 2024-08-09 07:40:13 发布
这个博客介绍了如何在C#中使用libvlc库来创建播放器,播放本地和网络视频流。它详细展示了如何设置启动参数、创建VLC实例、创建播放器,并提供了播放网络媒体、暂停、停止、快进、快退等功能的实现方法。
摘要由CSDN通过智能技术生成