libvlc源码
① vlc播放器是用什么写出来的
以下是编译VLC源代码时所需的库:
Third party libraries used by VLC
You'll find a complete list on the wiki.
But, here are the most important libraries.
Audio/Video codecs
liba52 - an ATSC A/52 (aka AC3) audio decoder
libmad - an MPEG audio decoder
libmpeg2 - an MPEG1/2 video decoder
libavcodec (ffmpeg) - an extensive audio/video codec library which supports several formats like MPEG4, H263, WMV/A etc...
libogg - an Ogg bitstream parser
libvorbis - a Vorbis audio decoder
libflac - a FLAC (Free Lossless Audio Codec) audio decoder
libspeex - a Speex (Free speech codec) audio decoder
libtheora - a Theora video decoder
libfaad2 - an AAC audio decoder
libdv - a DV video decoder (deprecated in favor of libavcodec)
libxvidcore (xvid) - an ISO MPEG-4 compliant video codec (deprecated in favor of libavcodec)
libdca - A DTS Coherent Acoustics decoding library.
GUI framework libraries
wxWidgets - a cross-platform C++ GUI framework that keeps the look and feel of each platform
QT4 - a C++ Cross-Platform Rich Client Development Framework
Audio/Video output libraries
libsdl - a cross-platform multimedia library designed to provide level access to audio, and 2D video framebuffer
Miscellaneous libraries
libdvdcss - a library for accessing encrypted DVDs
libdvdnav - a library for DVD navigation
libdvdread - a library for reading DVD-Video images
libdvbpsi - a library designed for decoding and generation of MPEG TS and DVB PSI tables
libopenslp - an open-source implementation of Service Location Protocol
gettext - a set of tools that provides a framework to help applications proce multi-lingual messages
libfreetype2 - a software font engine that is designed to be small, efficient, highly customizable and portable while capable of procing high-quality output (glyph images).
fribidi - A Free Implementation of the Unicode Bidirectional Algorithm
liveMedia - C++ libraries for multimedia streaming (RTP/RTCP, RTSP, SIP)
matroska - a new, extensible open standard Audio/Video container format
If you're using those libs to compile VLC for windows with mingw-gcc 3.3.1, you can use our Win32 contribs.
如果需要更权威的回答,这里是VLC官方提供的源码下载:
http://download.videolan.org/pub/vlc/
② vlc-android要怎么用
做vlc-android移植的道友都应该知道,当编译完vlc-android 源码后EventManager.java
类中定义了许多事件,下面是源码一部分:
public class EventManager {/*
* Be sure to subscribe to events you need in the JNI too.
*///public static final int MediaMetaChanged = 0;
//public static final int MediaSubItemAdded = 1;
//public static final int MediaDurationChanged = 2;
//public static final int MediaParsedChanged = 3;
//public static final int MediaFreed = 4;
//public static final int MediaStateChanged = 5;//public static final int MediaPlayerMediaChanged = 0x100;
//public static final int MediaPlayerNothingSpecial = 0x101;
//public static final int MediaPlayerOpening = 0x102;
//public static final int MediaPlayerBuffering = 0x103;
public static final int MediaPlayerPlaying = 0x104;
public static final int MediaPlayerPaused = 0x105;
public static final int MediaPlayerStopped = 0x106;......
}
可是对于这些事件有很多都被注释掉了,当我们需要被注释掉的事件时,就算把注释拿掉,再调用mEventManager.addHandler(EventManager.getInstance())添加事件之后,也不会在定义的mEventHandler
的handleMessage()中监听到,下面为一个mEventHandler定义的demo:
[java] view plain
private final VideoEventHandler mEventHandler = new VideoEventHandler(this);
private class VideoEventHandler extends WeakHandler<DtvPlayer>{
public VideoEventHandler(DtvPlayer owner) {
super(owner);
}
@Override
public void handleMessage(Message msg) {
DtvPlayer activity = getOwner();
if(activity == null) return;
switch (msg.getData().getInt("event")) {
case EventManager.MediaPlayerBuffering:
Log.d(TAG, "MediaPlayerBuffering");
break;
case EventManager.MediaPlayerEncounteredError:
Log.d(TAG, "MediaPlayerEncounteredError");
break;
......
default:
Log.e(TAG, String.format("Event not handled (0x%x)", msg.getData().getInt("event")));
break;
}
super.handleMessage(msg);
}
}
那么如何才能够在mEventHandler中监听到我们需要的事件呢,下面将进入主题。
在libvlcjni.c中有一个静态常量,其中指定了我们目前需要获取哪些事件:
[html] view plain
static const libvlc_event_type_t mp_events[] = {
libvlc_MediaPlayerPlaying,
libvlc_MediaPlayerPaused,
libvlc_MediaPlayerEndReached,
libvlc_MediaPlayerStopped,
libvlc_MediaPlayerVout,
libvlc_MediaPlayerPositionChanged
};
你可以将自己需要的事件添加在里面,然后将EventManager中响应的事件注释拿掉,之后重新编译源码就可以再mEventHandler中获取你刚添加的事件了。
(例如:你要想获取MediaPlayerEncounteredError事件,先将libvlc_MediaPlayerEncounteredError添加在mp_events[]静态常量中(注意,这里前面多了libvlc_),然后把EventManager中的public
static final int MediaPlayerEncounteredError =
0x10a;注释拿掉,重新编译源码之后就可以在你得mEventHandler
的handleMessage()中获取到EventManger.MediaPlayerEncounteredError事件)。
在vlc-android/vlc/lib/event.c中定义了所有事件:
[cpp] view plain
#define DEF( a ) { libvlc_##a, #a, },typedef struct
{
int type;
const char name[40];
} event_name_t;static const event_name_t event_list[] = {
DEF(MediaMetaChanged)
DEF(MediaSubItemAdded)
DEF(MediaDurationChanged)
DEF(MediaParsedChanged)
DEF(MediaFreed)
DEF(MediaStateChanged)DEF(MediaPlayerMediaChanged)
DEF(MediaPlayerNothingSpecial)
DEF(MediaPlayerOpening)
DEF(MediaPlayerBuffering)
DEF(MediaPlayerPlaying)
DEF(MediaPlayerPaused)
DEF(MediaPlayerStopped)
DEF(MediaPlayerForward)
DEF(MediaPlayerBackward)
DEF(MediaPlayerEndReached)
DEF(MediaPlayerEncounteredError)
DEF(MediaPlayerTimeChanged)
DEF(MediaPlayerPositionChanged)
DEF(MediaPlayerSeekableChanged)
DEF(MediaPlayerPausableChanged)
DEF(MediaPlayerTitleChanged)
DEF(MediaPlayerSnapshotTaken)
DEF(MediaPlayerLengthChanged)
DEF(MediaPlayerVout)DEF(MediaListItemAdded)
DEF(MediaListWillAddItem)
DEF(MediaListItemDeleted)
DEF(MediaListWillDeleteItem)DEF(MediaListViewItemAdded)
DEF(MediaListViewWillAddItem)
DEF(MediaListViewItemDeleted)
DEF(MediaListViewWillDeleteItem)DEF(MediaListPlayerPlayed)
DEF(MediaListPlayerNextItemSet)
DEF(MediaListPlayerStopped)DEF(MediaDiscovererStarted)
DEF(MediaDiscovererEnded)DEF(VlmMediaAdded)
DEF(VlmMediaRemoved)
DEF(VlmMediaChanged)
DEF(VlmMediaInstanceStarted)
DEF(VlmMediaInstanceStopped)
DEF(VlmMediaInstanceStatusInit)
DEF(VlmMediaInstanceStatusOpening)
DEF(VlmMediaInstanceStatusPlaying)
DEF(VlmMediaInstanceStatusPause)
DEF(VlmMediaInstanceStatusEnd)
DEF(VlmMediaInstanceStatusError)
};
#undef DEF
其中DEF()将MediaPlayerEncounteredError定义为libvlc_MediaPlayerEncounteredError,当本地代码产生MediaPlayerEncounteredError事件时会将libvlc_MediaPlayerEncounteredError传递给jni,与此同时jni又会传递给java层。不管是本地libvlc_MediaPlayerEncounteredError还是java层MediaPlayerEncounteredError,对于同一个事件被定义的值都是相同的,传输的是同一个消息值。本地代码定义在vlc-android/vlc/include/libvlc_events.h,
java代码定义在EventManager.java中。
③ linux的系统支持哪些影视和音乐播放器
音乐播放器十个:
1- Rhythmbox:
Rhythmbox是一个伟大的linux版本的音乐播放器. 它可以容易的帮你组织音乐内容,并且是免费的. 它的灵感来自于苹果的iTunes,它使用GStreamer多媒体库开发,在GNOME桌面环境中执行结果和效果者让人感到惊艳.
2- GMPC (Gnome音乐播放器客户端):GMPC 是一个很好的前端音乐播放器守护程序. 它快速并且易于使用,同时它还优于mpd的所有功能(mpd?).
3- XMMS (X多媒体系统):
XMMS (X多媒体系统) 是一个伟大的多媒体播放器,几乎可以运行于所有的系统,但在linux下却有一些特殊的地方. XMMS可以播放的多媒体文件有MP3, MOD, WAV 和其它的一些输入插件. 它是一个运行在许多类UNIX系统上的有点类似Winamp但又小于它的免费音频播放器.
4- Amarok:
Amarok 是linux和unix上另一个伟大的音乐播放器. Amarok的界面非常直观. 它是免费的自由软件. 现在, Amarok是linux上最受欢迎的音频播放器.
5- Quod Libet
Quod Libet是一个使用GTK+界面库开发的播放器, 它的主要功能特点是音乐库管理. 不同于其它的以分类, 流派,艺术家和专辑方式管理, 代之是你可以搜索然后显示它. Quod Libet 在大型音乐库管理这一点上要远胜于其它linux上的播放器.
6- Audacious:Audacious 是linux或其它基于linux系统上的免费播放器. 支持它自己的大部分是自己的一些功能插件,包括所有的解码器. 大多数系统上,默认是安装一个很有用的一个插件集, 让你有能力播放mp3,ogg,和FLAC等格式文件.
7- Exaile:
Exaile 是一个免费的自由软件,它可以运行于所以类unix操作系统中,它是目标是要小于KDE下的Amarok,所以它使用的是GTK+不是QT.
8- Banshee:?
Banshee一个在GNU/Linux上使用Helix和GStreamer多媒体平台库来执行播放,编码,和解码Ogg,MP3和其它的格式的自由免费的音乐播放器.你可以播放和导入CD, 轻松的与你的ipod同步分享或播放它.? Banshee同样也可将播放列表报告发布到last.fm的播放列表中.? 还有其它的一些很酷功能如:它可以提取CD,支持播客, 漂亮整洁的播放列表, 音乐推荐, 烧录音频,MP3,CD等等!
9- BMP (Beep Media Player)
BMP 也就是蜂鸣媒体播放器. BMP 一个基于xmms的免费音乐播放器(上述). 它看来很像Winamp,也支持它的外观主题,包括xmms的. BMP 支持所以xmms能支持的格式, 主要差别在于两个播放器之间使用的插件.
10- Sonata:
Sonata另一优雅的基于GTK + MPD前端音乐播放器(MPD:音乐播放器守护进程).
视频播放器(也可以播放音频)十个:
VLC多媒体播放器
VLC多媒体播放器(最初命名为VideoLAN客户端)是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及档案格式,并支持DVD、VCD的播放及各类串流协议。它亦能作为unicast和multicast的串流服务器在IPv4以及IPv6的高速网络连线下使用。它融合了FFmpeg出品的解码器与libdvdcss程序库,这更使其增添了播放多媒体档案及加密DVD影碟的功能。
VLC多媒体播放器具有跨平台的持性,分别有Linux、Microsoft Windows、Mac OS X、BeOS、BSD、Pocket PC及Solaris等版本。
2.Mplayer
MPlayer是一款开源多媒体播放器,以GNU通用公共许可证发布。此款软件可在各主流作业系统使用,例如Linux和其他类Unix系统、微软的视窗系统及苹果电脑的Mac OS X系统。MPlayer是建基于命令行界面,在各作业系统可选择安装不同的图形界面。
3.Rhythmbox
Rhythmbox是一个伟大的linux版本的音乐播放器。它可以容易的帮你组织音乐内容,并且是免费的。它的灵感来自于苹果的iTunes,它使用GStreamer多媒体库开发,在GNOME桌面环境中执行结果和效果者让人感到惊艳。
4.Audacious
Audacious是基于Beep-media-player和XMMS的播放器,由于BMP的开发者现在集中精力开发bmpx, BMP的开发已经停止, 不过Audacious的开发者继承了BMP的源码, 在BMP-0.9.7.1的基础上fork了一个新的mediaplayer --- Audacious。Audacious和Beep- media-player很象,并且兼容它们的皮肤。而且它依赖的东西很少,就一个包。它的设置选项跟Beep-media-player基本一样,但是比XMMS的简单多了,只要设定了标题编码 UTF-8 码转换,也没有所谓的中文问题。
5.XMMS
XMMS(X多媒体系统) 是一个伟大的多媒体播放器,几乎可以运行于所有的系统,但在linux下却有一些特殊的地方。XMMS可以播放的多媒体文件有MP3,MOD,WAV和其它的一些输入插件。它是一个运行在许多类UNIX系统上的有点类似Winamp但又小于它的免费音频播放器。
6.Amarok
Amarok是一款在LINUX或其他类UNIX操作系统中运行的音频播放器软件。它是以自由软件的形式推出。Amarok 在播放音乐档案以外还提供了很多功能。例如Amarok可以根据音乐类型、歌手和专辑来管理音乐集,也可以为众多的音乐格式加入标签,加入歌词、唱片封面,也会自动按所播放的音乐评分。也因此,第一次执行Amarok可以吓退一些用户。一些用家觉得Amarok的接口不易使用而使用较简单的音乐播放软件,因为很多功能会隐藏其他功能。大量的功能也招致消耗大量资源或是拥肿的批评。
7. Banshee
Banshee是Gnome官方的播放器,是一个功能非常全的音乐播放器,能够支持各种格式文件。甚至能够支持视频文件的播放,Banshee也有MacOS和Windows版本,但是最稳定的版本,是运行在Linux上的版本,目前最新版本为2.4.0,是上个月发布的。这个版本现在深受很多Linux爱好者的喜好,可以说是Linux爱好者的接触的最早的播放器。
8.Clementine
Clementine
Clementine是简单跨平台的音乐播放软件,界面设计源于KDE Amarok 1.4的多标签设计。自然,软件支持音乐库播放列表的搜索管理,整合了Spotify,Grooveshark,Last.fm,SomaFM,Magnatune, Jamendo,SKY.fm,Digitally Imported和Icecast网络收音服务,支持 M3U,XSPF,PLS和ASX列表格式,支持CUE,MP3,FLAC,CD,AAC,OGG 格式互转,支持歌词、封面、乐手介绍等等等等,还能自动补全封面神马的。总之就是常用的都有了,听上去很强大。并且在之前发布了适用所有平台的1.0.1版本。
9.Tomahawk
Tomahawk
Tomahawk则是这三个当中名气最小的,毕竟他仅仅才出现不到一年的时间,但是Tomahawk能够代表音乐播放器的趋势,旨在提供一个完全自由的互联网协作的音乐平板,我用的版本就是最新版本0.4.2,觉得效果非常不错(可能我喜欢支持弱者的缘故吧)!
10.SongBird
SongBird给我的第一印象是很“苹果”,很iTune。它不但有linux版本,还有windows和Mac版本。
相对于其它音乐播放器,Songbird可以说是最不像音乐播放器的,它集成web浏览器,也就是说你可以在songbird里一边上网一边浏览网页,当网页中出现音乐时,你可以用songbird将其捕抓下来。
④ 如何获得android armv-7版libvlc.so libvlccore.so,编译vlc.tar.gz源码包还是编译vlc for android.tar.gz
一: 安装android SDK, NDK, JDK三个工具,SDK是android系统用的,有些SDK还包含了eclipse,
NDK是用来编译C/C++代码的,这样使得android应用程序可能通过java来调用c/c++程序、JDK不用说,是java运行必须的环境。
二: 根据第一步解压的三个工具,配置这三个工具的环境变量(PATH),方法很多,可以修改~/.bashrc /etc/profile等等,这一步一定要正确,否则系统会找不到这三个工具,后面的编译会用到这几个工具,当然也就会出错了,因为系统默认不知道这几个程序的位置,这跟windows下的环境变量一个道理。为了验证环境变量是否配置正确,可以到别的目录下运行这几个程序,比如到根目录下看能否运行ndk-build adb等程序,或者echo $PATH打印一下当前的环境变量并验证。
⑤ 如何在MacOSX Lion上编译VLC media player
11.03
在Mac OS X Lion下编译VLC media player
Prerequisite
Mac OS X Lion
XCode 4.4.1
0.建立一个文件夹并进入
$ mkdir vlc_osx && cd vlc_osx
1.设置编译器
$ export CC=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc
$ export CXX=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++
$ export OBJC=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc
2. 下载源码至本地
$ git clone git://git.videolan.org/vlc.git
3. 编译autoconfig等工具
$ cd vlc/extras/tools
$ ./bootstrap && make
$ cd ../..
$ export PATH=$PWD/extras/tools/build/bin:$PATH
(注意第四项设置非常重要,确保自行编译生成的工具所在的路径在系统原有路径之前,否则会调用
系统原有的lib tool工具,由于版本问题,可以会导致下面的步骤出错)
4. 设置操作系统版本
$ export OSX_VERSION=10.7
5. 编译
$ cd contrib
$ mkdir -p osx && cd osx
$ ../bootstrap --host=x86_64-apple-darwin11 --build=x86_64-apple-darwin11
6.编译第三方库
6.1 下载编译好的第三方库(推荐)
$ make prebuilt
6.2 从源码自行编译第三方库(反正我是没有编译成功)
$ make -j4 .gettext
$ export PATH=$PWD/../x86_64-apple-darwin11/bin:$PATH
7.Bootstrap VLC
$ cd ../..
$ ./bootstrap
8.配置编译选项(Configure)
$ mkdir -p build && cd build
$ ../extras/package/macosx/configure.sh --enable-debug --disable-ncurses --host=x86_64-apple-darwin11 --build=x86_64-apple-darwin11
9.编译VLC
$ make -j4 或 $./compile.sh
10.开始使用
此时在当前目录下(即build目录)下应有一个VLC.app目录
$VLC.app/Contents/MacOS/VLC
应该可以看到vlc media player正确启动了
Reference
http://wiki.videolan.org/OSXCompile
⑥ 如果我想在iOS中使用vlc,需要编译什么源代码
你有两种选择:
选择一:你可以编译VLC(iOS)的源代码。VLC(iOS)调用了libVLC。
选择二:你也可以只编译libVLC的源代码。
如果你选择编译VLC(iOS),那么请参考下面的网站:
⑦ easydarwin支持什么格式
1 配置环境
1、系统:Windows 10
Easydarwin版本:官方最新版本
本配置为非web配置,在官方文档中有提供web配置攻略
2、 安装步骤
1
获取最新版本
在Github 中下图第一个链接获取最新的EasyDarwin版本源码,自行编译成需要的可执行文件,也可以直接在下图第二个链接中下载已经归档的相应版本进行部署;
2
编译最新版本(可选)
【如果直接下载已编译好的Release归档版本,可跳过此步骤】
Windows版本编译,可以直接用Visual Studio 2010打开源码文件中的:/EasyDarwin-master/EasyDarwin/WinNTSupport/EasyDarwin.sln解决方案文件,直接编译出exe可执行文件EasyDarwin.exe;
注意:在编译运行过程中会出现libEasyHLS.dll,libEasyPusher.dll,libEasyRTSPClient.dll,libEasyAACEncoder.dll不存在的问题,在这里只需要把下图lib文件中的几个.dll文件复制黏贴到WinNTSupport/Debug文件夹中即可,再重新编译运行Easydarwin的项目即可。
3
此时此刻,在WinNTSupport/Debug文件夹下,就存在正确无误的EasyDarwin.exe可执行文件。
4
移动Moives文件夹
把EasyDarwin-master\EasyDarwin\WinNTSupport文件夹下的Movies文件夹Copy一份到Debug文件夹下,其他可暂时不动。
注意:这里的Movies文件夹是Copy,不是在Debug下新建Movies文件夹,因为Movies文件夹内还有.xml的配置文件,如果是新建的文件夹,请记得把Movies下的.xml文件Copy到新的Movies文件夹下。
5
相关配置
所有的配置信息都存放在EasyDarwin-master\EasyDarwin\WinNTSupport\easydarwin.xml文件中,相关重要配置说明:
rtsp_port:EasyDarwin RTSP服务监听的端口;
movie_folder:媒体文件存储的路径,包括点播文件、直播切片生成的hls文件;(注意在这里必须要求Movies文件夹是在Debug下的路径)
local_ip_address:配置EasyRelayMole对外服务的ip地址,因为可能会有多网卡或者内网映射,所以需要手动配置;
RTSP_debug_printfs:将easydarwin.xml中输出打印配置为true,这样就能在调试模式中看是否有报文发来,也可以在easydarwin.xml中配置log输出的目录和文件名称,再根据log确定问题(具体个性化log,需要自己添加代码,编译部署);
6
启动Easydarwin服务
Windows版本运行(控制台调试运行):win+R-》调出运行-》命令提示符-》找到Easydarwin.exe文件路径,输入以下指令:
EasyDarwin.exe -c ./easydarwin.xml -d
出现如下结果,表示服务器已经成功开启。
7
说明,官方文档中给出了制作.bat快捷运行的方法。具体如下:
将这段脚本做成bat。
制作方法如下:
首先在EasyDarwin-master\EasyDarwin\WinNTSupport\Debug文件下创建一个Startup.bat.txt(名字随便取)的文本文件,然后把上面的脚本指令Copy进到文本中,保存后重命名Startup.bat,之后单击.bat文件即可运行服务器。
8
注意:笔者在使用这个方法的过程中,在自己win 10 机上没有成功,笔者使用的脚本指令是
END
3 测试流媒体服务器
1
首先,在网上下载一个MP4视频文件,之后放置到EasyDarwin-master\EasyDarwin\WinNTSupport\Debug\Movies\路径下。之后使用6中的说明开启服务器,在之后就可以使用相关播放器进行播放啦。
END
4 EasyDarwin视频支持格式说明
1
说明:EasyDarwin 支持MPEG-1、MPEG-2、MPEG-4、H.264、VC-1等多种标准编码格式的众多主流媒体格式及avi、asf、 wmv、mp4、mov、rm、rmvb、flv、3GP等等全格式的文件Container容器,更加详细的请参考官方文档说明。
END
5 播放器推荐
1
推荐使用的播放器有:ffplay,vlc等开源播放器进行测试,重点推荐VLC播放器,使用非常简单。
END
6 可能会遇到的问题
1
在测试过程中要关注播放器和控制台两方,播放器不播放控制台无消息,表示没有连接上服务器,查看自己的url是否正确;播放器不播放控制台有消息,可细细查看错误所在。
2
首次使用推荐使用mp4格式视频,如在使用中出现415 Unsupported Media Type问题,可以用以下办法解决。
MP4点播返回415错误(Requested movie hasn't been hinted)EasyDarwin点播要求mp4文件需要先经过RTSP/RTP HINT处理,具体方法(用mp4box GUI、MediaCoder等工具):
⑧ centos 7 怎么安装mp3解码以及怎么安装vlc
CentOS 7音乐播放器主要为Rhythmbox
可以在网站上搜索下载:gst-fluendo-mp3-0.10.32.tar.gz这个文件,如果有更新版本的可以用更新版本。具体自己找,网络不让我发地址。
下载后解压,进入目录按照源代码的编译方式进行安装:
$ ./configure
$ make
$ sudo make install
安装完毕后,搜索“gstream”,安装好后的插件名字叫:“libgstflump3dec.so”
,大致上位于:“/usr/local/lib/gstreamer-1.0/”下(对于CentOS7.0而言),需要手动将此文件复制到系统原来自带的GStreamer部分插件的位置,也就是/usr/lib64/gstreamer-1.0(对于CentOS7.0而言),可以执行以下的复制命令:
$ sudo cp /usr/local/lib/gstreamer-1.0/libgstflump3dec.so/usr/lib64/gstreamer-1.0
完毕后Rhythmbox就可以调用mp3插件而播放MP3文件了。
另外对于VLC,不建议在centos7.0里安装,需要的依赖包太多,很麻烦,不如安装mplayer相对简单一些。
还有,音乐播放器与其用Rhythmbox,你就不如去下一个deadbeef,解压开后就可以运行。支持很多的音频格式,音质还可以,一般的音响是听不出来的。
⑨ 在编译vc6.0时出现错误'p_media_player' : undeclared identifier
首先可以看到,在这个按钮2响应函数中,并没有定义p_media_player,如果要让编译器识别,那么p_media_player必须在指定作用域生效。
MFC模式下,p_media_player应该是CMFCVLCDlg对话框类成员变量,你检查一下,是不是前面使用p_media_player是临时声明的,而不是类成员,或者是其它类成员变量。
⑩ vlc-android要怎么用
一.认识android的架构
Android其本质就是在标准的Linux系统上增加了Java虚拟机Dalvik,并在Dalvik虚拟机上搭建了一个JAVA的application framework,所有的应用程序都是基于JAVA的application framework之上。
android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。
二.搭建环境
搭建开发环境
对国内的开发者来说最痛苦的是无法去访问android开发网站。为了更好的认识世界,对程序员来说,会翻墙也是的一门技术,带你去领略墙外的世界,好了,不废话了, 国内开发者访问(androiddevtools) 上面已经有了所有你要的资源,同时可以下载到我们的主角framework
但是这样的搭建只能去阅读源代码,我们无法去更进一步去实现自己的rom,我们看到锤子的系统在早期的开放rom是自己从新实现了framework的代码,现在看起来他成功了,所以我们还要去搭建android系统的源码编译环境。
搭建源码编译环境
http://www.cnblogs.com/bluestorm/p/4419135.html
https://source.android.com/source/downloading.html(这里详细的介绍了如何下载编译)
三.开始主题
在一开始写c程序的时候都有一个运行的入口,比如
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
//这里的main就是应用的入口
int main(int argc, const char * argv[]){
return 0;
}
在计算机网络原理中我们用socket实现一个服务器端,不断的接听客户端的访问,而且他的代码是这样实现的:
#include <winsock2.h>
#pragma comment(lib, "WS2_32.lib")
#include <stdio.h>
void main()
{
WORD wVersionRequested;//版本号
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);//2.2版本的套接字
//加载套接字库,如果失败返回
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
return;
}
//判断高低字节是不是2,如果不是2.2的版本则退出
if (LOBYTE(wsaData.wVersion) != 2 ||
HIBYTE(wsaData.wVersion) != 2)
{
return;
}
//创建流式套接字,基于TCP(SOCK_STREAM)
SOCKET socSrv = socket(AF_INET, SOCK_STREAM, 0);
//Socket地址结构体的创建
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//转换Unsigned long型为网络字节序格
addrSrv.sin_family = AF_INET;//指定地址簇
addrSrv.sin_port = htons(6000);
//指定端口号,除sin_family参数外,其它参数都是网络字节序,因此需要转换
//将套接字绑定到一个端口号和本地地址上
bind(socSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));//必须用sizeof,strlen不行
listen(socSrv, 5);
SOCKADDR_IN addrClient;//字义用来接收客户端Socket的结构体
int len = sizeof(SOCKADDR);//初始化参数,这个参数必须进行初始化,sizeof
//循环等待接受客户端发送请求
while (1)
{
//等待客户请求到来;当请求到来后,接受连接请求,
//返回一个新的对应于此次连接的套接字(accept)。
//此时程序在此发生阻塞
SOCKET sockConn = accept(socSrv, (SOCKADDR*)&addrClient, &len);
char sendBuf[100];
sprintf(sendBuf, "Welcome %s to JoyChou",
inet_ntoa(addrClient.sin_addr));//格式化输出
//用返回的套接字和客户端进行通信
send(sockConn, sendBuf, strlen(sendBuf)+1, 0);//多发送一个字节
//接收数据
char recvBuf[100];
recv(sockConn, recvBuf, 100, 0);
printf("%s\\n", recvBuf);
closesocket(sockConn);
}
}
他采用了一个while死循环去监听客户端的请求。
在一遍啰嗦之后,主角终于闪亮的登场了。
先上源代码
public final class ActivityThread {
public static void main(String[] args) {
SamplingProfilerIntegration.start();
CloseGuard.setEnabled(false);
Environment.initForCurrentUser();
EventLogger.setReporter(new EventLoggingReporter());
Security.addProvider(new AndroidKeyStoreProvider());
final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());
TrustedCertificateStore.setDefaultUserDirectory(configDir);
Process.setArgV0("<pre-initialized>");
Looper.prepareMainLooper();
//从中可以看到为app开辟了一个线程进入了looper之中
ActivityThread thread = new ActivityThread();
thread.attach(false);
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}
AsyncTask.init();
if (false) {
Looper.myLooper().setMessageLogging(new
LogPrinter(Log.DEBUG, "ActivityThread"));
}
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
}
看到源码失望了,没有一个while循环啊,其实用了他方法实现
//用一个looper的机制循环监听响应
Looper.prepareMainLooper();
Looper.loop();
进一步深入代码
public static void loop() {
final Looper me = myLooper();
if (me == null) {
throw new RuntimeException("No Looper; Looper.prepare() wasn't called on this thread.");
}
final MessageQueue queue = me.mQueue;
Binder.clearCallingIdentity();
final long ident = Binder.clearCallingIdentity();
// 在这里看到了一个循环监听消息
for (;;) {
Message msg = queue.next(); // might block
if (msg == null) {
// No message indicates that the message queue is quitting.
return;
}
Printer logging = me.mLogging;
if (logging != null) {
logging.println(">>>>> Dispatching to " + msg.target + " " +
msg.callback + ": " + msg.what);
}
msg.target.dispatchMessage(msg);
if (logging != null) {
logging.println("<<<<< Finished to " + msg.target + " " + msg.callback);
}
// Make sure that ring the course of dispatching the
// identity of the thread wasn't corrupted.
final long newIdent = Binder.clearCallingIdentity();
if (ident != newIdent) {
Log.wtf(TAG, "Thread identity changed from 0x"
+ Long.toHexString(ident) + " to 0x"
+ Long.toHexString(newIdent) + " while dispatching to "
+ msg.target.getClass().getName() + " "
+ msg.callback + " what=" + msg.what);
}
msg.recycleUnchecked();
}
}