精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
随着开源技术的使用,以前很难的工作也容易完成了,比如播放器。播放器的架构是很复杂的,也要处理很多文件格式,是一个团队需要至少一年时间才有可能完成。不过随着开源的兴起,有某些要求不严格的场合下,用开源平台搭建个播放器,效果也不错。本文介绍2个视频播放器的线索
下面是锐英源孙老师完成的播放器界面
界面元素有:播放窗口、进度条、时间指示、全屏/窗口切换、暂停、开始、音量/静音按钮和音量大小进度条。界面使用了皮肤技术,比较美观。有需要学习的同学请联系孙老师,QQ396806883,微信ryysoft。
下面内容来自网络,仅供参考。
本人之前很多的文章中均提到了使用libvlc为播放器内核制作的播放器,也许有些朋友对此感兴趣,于是我用c#写了一个调用libvlc api实现的万能视频播放器,与大家分享一下。说它“万能”,当然是因为我们站在了vlc的肩膀上。
vlc是一个强大而且开源的多媒体播放器,也可以说是一个多媒体平台。它支持非常广泛的媒体格式的本地播放,完全可以媲美mplayer,其对视频网络流的处理能力更是非常强悍。libvlc就是指的vlc的核心,它向外提供了一系列的接口,通过接口,来实现视频播放等复杂的功能。libvlc对外提供了c语言的接口,也有其他语言,包括.net的绑定,在其官网上就有,不过已经“年久失修”。我之前用Qt, MFC实现过基于libvlc的播放器,不过鉴于园子里c#开发人员较多,遂用c#封装了一下libvlc的API接口,并实现了一个视频播放器。
先上鉴赏图,外表很简单,不过,外表不是重点
首先是libvlc的一些导出函数,我在注释里对它们的功能都有说明
1 class VlcPlayer 2 { 3 private IntPtr libvlc_instance_; 4 private IntPtr libvlc_media_player_; 5 6 private double duration_; 7 8 public VlcPlayer(string pluginPath) 9 { 10 string plugin_arg = "--plugin-path=" + pluginPath; 11 string[] arguments = { "-I", "dummy", "--ignore-config", "--no-video-title", plugin_arg }; 12 libvlc_instance_ = LibVlcAPI.libvlc_new(arguments); 13 14 libvlc_media_player_ = LibVlcAPI.libvlc_media_player_new(libvlc_instance_); 15 } 16 17 public void SetRenderWindow(int wndHandle) 18 { 19 if (libvlc_instance_ != IntPtr.Zero && wndHandle != 0) 20 { 21 LibVlcAPI.libvlc_media_player_set_hwnd(libvlc_media_player_, wndHandle); 22 } 23 } 24 25 public void PlayFile(string filePath) 26 { 27 IntPtr libvlc_media = LibVlcAPI.libvlc_media_new_path(libvlc_instance_, filePath); 28 if (libvlc_media != IntPtr.Zero) 29 { 30 LibVlcAPI.libvlc_media_parse(libvlc_media); 31 duration_ = LibVlcAPI.libvlc_media_get_duration(libvlc_media) / 1000.0; 32 33 LibVlcAPI.libvlc_media_player_set_media(libvlc_media_player_, libvlc_media); 34 LibVlcAPI.libvlc_media_release(libvlc_media); 35 36 LibVlcAPI.libvlc_media_player_play(libvlc_media_player_); 37 } 38 } 39 40 public void Pause() 41 { 42 if (libvlc_media_player_ != IntPtr.Zero) 43 { 44 LibVlcAPI.libvlc_media_player_pause(libvlc_media_player_); 45 } 46 } 47 48 public void Stop() 49 { 50 if (libvlc_media_player_ != IntPtr.Zero) 51 { 52 LibVlcAPI.libvlc_media_player_stop(libvlc_media_player_); 53 } 54 } 55 56 public double GetPlayTime() 57 { 58 return LibVlcAPI.libvlc_media_player_get_time(libvlc_media_player_) / 1000.0; 59 } 60 61 public void SetPlayTime(double seekTime) 62 { 63 LibVlcAPI.libvlc_media_player_set_time(libvlc_media_player_, (Int64)(seekTime * 1000)); 64 } 65 66 public int GetVolume() 67 { 68 return LibVlcAPI.libvlc_audio_get_volume(libvlc_media_player_); 69 } 70 71 public void SetVolume(int volume) 72 { 73 LibVlcAPI.libvlc_audio_set_volume(libvlc_media_player_, volume); 74 } 75 76 public void SetFullScreen(bool istrue) 77 { 78 LibVlcAPI.libvlc_set_fullscreen(libvlc_media_player_, istrue ? 1 : 0); 79 } 80 81 public double Duration() 82 { 83 return duration_; 84 } 85 86 public string Version() 87 { 88 return LibVlcAPI.libvlc_get_version(); 89 } 90 }
封装为VlcPlayer之后,调用就会变得非常简单。
程序做好之后,需要带上libvlc.dll和libvlccore.dll,这两个是vlc的播放内核,因为vlc把编解码和格式解析的支持设计成了插件的形式,所以还必须要带上vlc的plugins目录里的插件。