zoukankan      html  css  js  c++  java
  • c# 播放器 支持所有格式

    ---恢复内容开始---

    直接上代码 

    internal static class LibVlcAPI
    {
    internal struct PointerToArrayOfPointerHelper
    {
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1000)]
    public IntPtr[] pointers;
    }

    public static IntPtr libvlc_new(string[] arguments)
    {
    PointerToArrayOfPointerHelper argv = new PointerToArrayOfPointerHelper();
    argv.pointers = new IntPtr[1000];

    for (int i = 0; i < arguments.Length; i++)
    {
    argv.pointers[i] = Marshal.StringToHGlobalAnsi(arguments[i]);
    }

    IntPtr argvPtr = IntPtr.Zero;
    try
    {
    int size = Marshal.SizeOf(typeof(PointerToArrayOfPointerHelper));
    argvPtr = Marshal.AllocHGlobal(size);
    Marshal.StructureToPtr(argv, argvPtr, false);

    return libvlc_new(arguments.Length, argvPtr);
    }
    finally
    {
    for (int i = 0; i < arguments.Length + 1; i++)
    {
    if (argv.pointers[i] != IntPtr.Zero)
    {
    Marshal.FreeHGlobal(argv.pointers[i]);
    }
    }
    if (argvPtr != IntPtr.Zero)
    {
    Marshal.FreeHGlobal(argvPtr);
    }
    }
    }
    //从路径构建一个视频文件
    public static IntPtr libvlc_media_new_path(IntPtr libvlc_instance, string path)
    {
    IntPtr pMrl = IntPtr.Zero;

    {
    byte[] bytes = Encoding.UTF8.GetBytes(path);
    pMrl = Marshal.AllocHGlobal(bytes.Length + 1);
    Marshal.Copy(bytes, 0, pMrl, bytes.Length);
    Marshal.WriteByte(pMrl, bytes.Length, 0);
    return libvlc_media_new_path(libvlc_instance, pMrl);
    }

    }
    //从网络位置构建一个视频文件
    public static IntPtr libvlc_media_new_location(IntPtr libvlc_instance, string path)
    {
    IntPtr pMrl = IntPtr.Zero;
    try
    {
    byte[] bytes = Encoding.UTF8.GetBytes(path);
    pMrl = Marshal.AllocHGlobal(bytes.Length + 1);
    Marshal.Copy(bytes, 0, pMrl, bytes.Length);
    Marshal.WriteByte(pMrl, bytes.Length, 0);
    return libvlc_media_new_path(libvlc_instance, pMrl);
    }
    finally
    {
    if (pMrl != IntPtr.Zero)
    {
    Marshal.FreeHGlobal(pMrl);
    }
    }
    }

    // ----------------------------------------------------------------------------------------
    // 以下是libvlc.dll导出函数

    // 创建一个libvlc实例,它是引用计数的
    [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
    [SuppressUnmanagedCodeSecurity]
    private static extern IntPtr libvlc_new(int argc, IntPtr argv);

    // 释放libvlc实例
    [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
    [SuppressUnmanagedCodeSecurity]
    public static extern void libvlc_release(IntPtr libvlc_instance);

    [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
    [SuppressUnmanagedCodeSecurity]
    public static extern String libvlc_get_version();

    // 从视频来源(例如Url)构建一个libvlc_meida
    [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
    [SuppressUnmanagedCodeSecurity]
    private static extern IntPtr libvlc_media_new_location(IntPtr libvlc_instance, IntPtr path);

    // 从本地文件路径构建一个libvlc_media
    [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
    [SuppressUnmanagedCodeSecurity]
    private static extern IntPtr libvlc_media_new_path(IntPtr libvlc_instance, IntPtr path);

    [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
    [SuppressUnmanagedCodeSecurity]
    public static extern void libvlc_media_release(IntPtr libvlc_media_inst);

    // 创建libvlc_media_player(播放核心)
    [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
    [SuppressUnmanagedCodeSecurity]
    public static extern IntPtr libvlc_media_player_new(IntPtr libvlc_instance);

    // 将视频(libvlc_media)绑定到播放器上
    [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
    [SuppressUnmanagedCodeSecurity]
    public static extern void libvlc_media_player_set_media(IntPtr libvlc_media_player, IntPtr libvlc_media);

    // 设置图像输出的窗口
    [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
    [SuppressUnmanagedCodeSecurity]
    public static extern void libvlc_media_player_set_hwnd(IntPtr libvlc_mediaplayer, Int32 drawable);

    [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
    [SuppressUnmanagedCodeSecurity]
    public static extern void libvlc_media_player_play(IntPtr libvlc_mediaplayer);

    [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
    [SuppressUnmanagedCodeSecurity]
    public static extern void libvlc_media_player_pause(IntPtr libvlc_mediaplayer);

    [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
    [SuppressUnmanagedCodeSecurity]
    public static extern void libvlc_media_player_stop(IntPtr libvlc_mediaplayer);

    // 解析视频资源的媒体信息(如时长等)
    [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
    [SuppressUnmanagedCodeSecurity]
    public static extern void libvlc_media_parse(IntPtr libvlc_media);

    // 返回视频的时长(必须先调用libvlc_media_parse之后,该函数才会生效)
    [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
    [SuppressUnmanagedCodeSecurity]
    public static extern Int64 libvlc_media_get_duration(IntPtr libvlc_media);

    // 当前播放的时间
    [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
    [SuppressUnmanagedCodeSecurity]
    public static extern Int64 libvlc_media_player_get_time(IntPtr libvlc_mediaplayer);

    // 设置播放位置(拖动)
    [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
    [SuppressUnmanagedCodeSecurity]
    public static extern void libvlc_media_player_set_time(IntPtr libvlc_mediaplayer, Int64 time);

    [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
    [SuppressUnmanagedCodeSecurity]
    public static extern void libvlc_media_player_release(IntPtr libvlc_mediaplayer);

    // 获取和设置音量
    [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
    [SuppressUnmanagedCodeSecurity]
    public static extern int libvlc_audio_get_volume(IntPtr libvlc_media_player);

    [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
    [SuppressUnmanagedCodeSecurity]
    public static extern void libvlc_audio_set_volume(IntPtr libvlc_media_player, int volume);

    // 设置全屏
    [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
    [SuppressUnmanagedCodeSecurity]
    public static extern void libvlc_set_fullscreen(IntPtr libvlc_media_player, int isFullScreen);

    //设置播放速度
    [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
    [SuppressUnmanagedCodeSecurity]
    public static extern int libvlc_media_player_set_rate(IntPtr libvlc_media, float rate);
    }

    这个是将libvlc里面的api导入到c#开发环境中 

    class VlcPlayer
    {
    //播放视频文件实例
    private IntPtr libvlc_instance_;
    //播放实例
    private IntPtr libvlc_media_player_;
    //视频时长
    private double duration_;



    public VlcPlayer(string pluginPath)
    {
    string plugin_arg = "--plugin-path=" + pluginPath;
    string[] arguments = { "0", "dummy", "--ignore-config", "--no-video-title", plugin_arg };
    //播放视频文件实例
    libvlc_instance_ = LibVlcAPI.libvlc_new(arguments);
    //播放实例
    libvlc_media_player_ = LibVlcAPI.libvlc_media_player_new(libvlc_instance_);
    }

    //接受窗口句炳
    public void SetRenderWindow(int wndHandle)
    {
    if (libvlc_instance_ != IntPtr.Zero && wndHandle != 0)
    {
    LibVlcAPI.libvlc_media_player_set_hwnd(libvlc_media_player_, wndHandle);
    }
    }

    //播放器控制视频的播放
    public void PlayFile(string filePath)
    {
    IntPtr libvlc_media = LibVlcAPI.libvlc_media_new_location(libvlc_instance_, filePath);
    if (libvlc_media != IntPtr.Zero)
    {
    LibVlcAPI.libvlc_media_parse(libvlc_media);
    //返回视频的时长

    duration_ = LibVlcAPI.libvlc_media_get_duration(libvlc_media) / 1000.0;

    LibVlcAPI.libvlc_media_player_set_media(libvlc_media_player_, libvlc_media);
    LibVlcAPI.libvlc_media_release(libvlc_media);
    LibVlcAPI.libvlc_media_player_play(libvlc_media_player_);
    }
    }
    //播放器控制视频文件的解析
    public void Pause()
    {
    if (libvlc_media_player_ != IntPtr.Zero)
    {
    LibVlcAPI.libvlc_media_player_pause(libvlc_media_player_);
    }
    }
    //播放器控制视频文件的停止
    public void Stop()
    {
    if (libvlc_media_player_ != IntPtr.Zero)
    {
    LibVlcAPI.libvlc_media_player_stop(libvlc_media_player_);
    }
    }

    //播放器得到当前的播放时间
    public double GetPlayTime()
    {
    return LibVlcAPI.libvlc_media_player_get_time(libvlc_media_player_) / 1000.0;
    }

    //播放器设置当前的播放时间
    public void SetPlayTime(double seekTime)
    {
    LibVlcAPI.libvlc_media_player_set_time(libvlc_media_player_, (Int64)(seekTime * 1000));
    }

    //播放器得到当前播放声音大小
    public int GetVolume()
    {
    return LibVlcAPI.libvlc_audio_get_volume(libvlc_media_player_);
    }

    //播放器设置当前的播放声音
    public void SetVolume(int volume)
    {
    LibVlcAPI.libvlc_audio_set_volume(libvlc_media_player_, volume);
    }
    //设置全屏
    public void SetFullScreen(bool istrue)
    {
    LibVlcAPI.libvlc_set_fullscreen(libvlc_media_player_, istrue ? 1 : 0);
    }

    public double Duration()
    {
    return duration_;
    }

    public string Version()
    {
    return LibVlcAPI.libvlc_get_version();
    }

    public int SetRate(float rate){
    return LibVlcAPI.libvlc_media_player_set_rate(libvlc_media_player_,rate);

    }
    }

    这个是调用 下面导入的函数重新封装

    下面我讲解一个方法的调用过程 其他的可以到代码中学习

    1. 这个获得视频文件的路径

    2.将路径打包传递作为数组的一个元素传给

     传递到自己封装的api

    传递到api里面 

    改天给大家代码地址  有需要学习的或者自己可以下载一个完全安全的播放器 我明天会给大家分享地址

  • 相关阅读:
    arm linux kernel 从入口到start_kernel 的代码分析
    Booting ARM Linux
    GNU风格 ARM汇编语法指南
    基于linux2.6.38.8内核启动过程完全解析[一]
    基于linux2.6.38.8内核zImage文件的自解压详解
    Busybox支持中文的解决办法
    对Kernel panic-not syncing:No init found...init=option to kernel错误总结!
    Linux 的启动流程
    计算机是如何启动的?
    Debian的定时执行命令Crontab
  • 原文地址:https://www.cnblogs.com/rowping/p/3702248.html
Copyright © 2011-2022 走看看