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();
}
}