A. 求vlc播放器 中文版軟體
軟體介紹:
vlc播放器中文版是一款操作簡單的媒體播放器,它支持眾多音頻與視頻解碼器及文件格式,並支持DVD影音光碟,VCD影音光碟及各類流式協議,大多數的媒體文件都可以播放。
所需工具:點擊下載 vlc播放器 中文版
軟體特點
1、簡單、快速、強大
1)vlc播放器中文版能播放任何內容 - 文件、光碟、攝像頭、設備及流媒體
2)可播放大多數格式,無需安裝編解碼器包 - MPEG-2, MPEG-4, H.264, MKV, WebM, WMV, MP3...
3)可在所有平台運行 - Windows, linux, Mac OS X, Unix, iOS, android ...
4)vlc播放器中文版完全免費 - 無間諜軟體,無廣告,無跟蹤用戶的行為
2、自定義
1)添加外觀
2)設計外觀可採用 VLC 外觀編輯器
3)安裝擴展
3、vlc播放器中文版具有跨平台的特性,它有Linux、Microsoft Windows、Mac OS X、BeOS、BSD、Pocket PC及Solaris的版本。
4、與另一個著名播放器Mplayer(使用Gtk+庫)不同的是,VLC使用了Qt庫來編寫Linux的用戶操作界面。
5、在Windows,Linux以及某些平台,vlc播放器中文版提供了一個Mozilla擴充包,使得某些網站上附帶的QuickTime及Windows Media多媒體文件,可以在非微軟或蘋果計算機的操作系統中,正常顯示於Mozilla的瀏覽器下。
6、從版本0.8.2開始,VLC亦提供了一個ActiveX的擴充包,使用戶可以在Internet Explorer下,正常顯示某些網站上附帶的QuickTime及Windows Media多媒體文件。
7、從1.0.5版本開始VLC的ActiveX的擴充包已經放棄js介面的調用。
8、vlc播放器中文版還有一個非常好的功能——支持播放某些沒有下載完成的視頻文件部份內容。
B. 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中。
C. 播放器排行榜前十名
播放器排行榜前十名:
1、PotPlayer
視頻播放器排行榜上PotPlayer基本都會上榜,是無數人心中最好用的播放器,它是一款多格式視頻播放工具,擁有強大的內置解碼器用於解碼播放,支持幀定位,幾乎可以播放所有格式的視頻,解碼功能很出色,啟動速度和播放速度都非常快,並且無需額外的轉碼和設置,同時還可以載入直播源,支持自定義皮膚。它還支持BD和MKV等大視頻流暢播放,看高清大片無任何問題。
2、VLC
好用的視頻播放器有哪些堪稱萬能?小編提名VLC。VLC多媒體播放器是一款免費開源的視頻播放器,支持眾多音頻與視頻解碼器及文件格式,並支持DVD影音光碟,VCD影音光碟及各類流式協議。它也能作為unicast或multicast的流式伺服器在IPv4或IPv6的高速網路連接下使用。
不僅佔用電腦資源低,而且支持的文件格式也很全,並且基本上Windows、Mac、Linux、Android、iOS各大平台都有對應都設備。幾乎兼容所有的音頻和視頻格式,並且還有多音軌、多字幕軌管理,還支持360度視頻和3D環繞音效,功能相當齊全。
3、KMPlayer
十大視頻播放器之一的KMPlayer也非常受歡迎,這是一款全能視頻播放器軟體,頁面設計比較簡潔,功能上支持多種格式視頻的直接播放,而且它還支持4K、8K視頻的播放,播放視頻的時候還有VR模式可以選擇,無須注冊表支持直接調用Directshow濾鏡。能夠播放DVD與VCD、匯入多種格式的外掛字幕檔、使用普及率最高的WinAMP音效外掛與支援超多種影片效果調整選項等。
4、MPC-HC
MPC-HC的全稱是「Media Player Classic Home Cinema」,是Windows平台上一個非常輕量級的開源媒體播放器,體積及資源佔用很小,響應迅速,能播放網上幾乎全部主流的音頻視頻格式,兼容性非常好,軟體對硬體配置要求也很低,低配置老電腦上也可以正常運行,可以一邊看視頻一邊工作也非常穩定,而且100%免費,沒有任何廣告或後門。
5、MPV播放器
MPV播放器是一個基於MPlayer和mplayer2的開源極簡全能播放器,它的界面非常簡單,幾乎沒有完整的UI,只有簡單的視頻播放按鈕,但是功能卻很強大,支持播放各種格式的視頻文件,對字幕的支持的也很不錯,同時MPV還支持windows、Linux和OSX,真正的跨平台,啟動迅速,並且穩定不閃退。
6、mx player
如果你在尋找安卓手機視頻播放器,那小編最推薦的就是mx player,它能夠播放幾乎每一個影片檔案,並且具備多核心的解碼能力來處理你的影片檔案和字幕。MX Video Player是Android平台上的第一款能夠支持多核解碼功能額的媒體播放器軟體,有多核解碼功能,根據在雙核Android裝置上的測試結果表明,它能夠取得比單核解碼播放器高達70%的效能。
7、nPlayer
可在iPhone、iPad和安卓上流暢播放幾乎所有主流格式的視頻,可以直接在手機上播放各種MKV、MP4、MOV、AVI、WMV、ASF、FLV、OGV、RMVB等幾乎所有視頻格式。nPlayer還可以支持DTS/DTS-HD/DTS DTS Headphone:X、Dolby AC3/E-AC3音頻編碼以及Dolby移動環繞立體聲,字幕管理系統也很好用,可以切換多聲道字幕,支持多種字幕格式。
8、Kodi
可用於多種操作系統和硬體平台,配有軟體10英尺用戶界面,可用於電視機和遙控器。它允許用戶播放和查看大多數流媒體,如來自網上的視頻、音樂、播客和視頻,以及來自本地和網路存儲媒體的所有常見數字媒體文件。對字幕的支持更是堪稱一絕,能夠兼容特效字幕,支持在線字幕匹配,看外語片無需自己找字幕,全球無數開發者為Kodi製作了大量實用的插件。
9、MPC-be
MPC-be是從MPC衍生來的播放器,這款免費開源的軟體同樣非常實用,低內存佔用+高速打開播放,並且在界面外觀上更勝一籌。由於Media Player Classic是開源軟體,所以任何人都可以基於它的源代碼進行修改,自由設置切換主題顏色,還可以隱藏掉整個界面邊框和各種圖標UI。具有播放控制,可以播放DVD,其他功能還包括的可能性在一個在線資料庫中進行搜索字幕。
10、Avplayer
蘋果手機視頻播放器Avplayer也是款很強大的app,它可以播放任何格式的全功能影音播放器,適應於iPhone、iPod、iPad,大多數視頻不需要另外的轉換格式過程就可以直接從iPhone里看。用戶還可以通過itunes或者WiFi傳輸文件到播放器內,也可以通過內置的下載客戶端直接從Ftp/Samba/UPnP等伺服器中打開影音文件,或者下載文件,還做了內置的相片瀏覽器。
D. Vlc 添加共享文件夾
經驗:網路了一下午,關於vlc的,沒找到一個靠譜、而且小白的。
以下干貨:
vlc手機版本最新(我是iOS系統,vlc版本截止答題時最新版本3.1.2)
電腦,win10最新(截止答題時,無自動更新)
大前提:手機、電腦,連接的是同一區域網(Wi-Fi,自己家裡的)
步驟:兩大步(一步是在電腦操作,一步是在手機端操作)
一、在電腦上,要新建「用戶」和「共享」
具體:
打開「計算機管理」(自行網路)
1、找到「本地用戶和組」這一欄,點開,可以看見」用戶」這一欄,滑鼠右鍵,「新用戶」。這時,就是要新建「用戶」,用戶名和密碼,自己隨便編,兩個都填123也行。取消「下次登陸時須更改密碼」,勾選「用戶不能更改密碼」、「密碼永不過期」。創建後完成,關閉。
2、接著,找到「共享文件夾」這一欄,點開,可以看見「共享」這一欄,滑鼠右鍵,「新建共享」。這時,就是要新建「共享」,在這里有界面引導,你所要做的,就只是確定你要共享的文件夾位置(比如文件夾里,有大量音頻和視頻文件。你想用vlc連電腦不就是為了這個嗎…),接下來,只需要不斷的點擊下一步,完成。
二、電腦上操作已經完成了。接著手機端操作,連接電腦。
具體:
在vlc界面,左上角有個vlc自己的圖標,點開,找到「本地網路」,在「本地網路」里,因為你手機和電腦是同一網路下,所以你可以在「文件伺服器(SMB)」下面,看到你的電腦的名字。點開「你的電腦的名字」(比如你的電腦是surface pro,名字可能就是「surface pro」),在彈出的窗口裡,左邊是「SMB」,在「SMB」下,其他的不用管,只需要,只需要,只需要,把你新建的用戶、密碼填進去就可以了(比如假設的是123,那隻用填123)。點擊保存,然後連接
結果:你就可以像訪問電腦一樣訪問文件夾了(僅限於你「分享」的文件)。
連接成功,可以直接用vlc看電腦上的電影。
提醒:分享的文件夾,最好不要有太多其他的「非視頻、音頻文件」,不然好像會一直顯示不出來。
E. vlc for android 源碼能不能在windows環境下編譯
1. 准備編譯環境
基本上按照這篇wiki的介紹就足夠了,為了順利完成編譯,建議首先保證相關的軟體或者依賴庫都已經下載好了,我再強調一下幾個重點注意事項。
(1) Android SDK:必須使用SDK Platform Android 5.0, API 21,因為VLC-for-android用到了Android 5.0 的一些API。
(2) 最好通過apt-get install 把下面這些依賴的軟體都安裝一遍,或更新到最新版
git,apache-ant (or ant), autoconf, automake, autopoint, cmake,
gawk (or nawk), gcc, g++, libtool, m4, patch, pkg-config, ragel,
subversion, unzip.
2. 下載源碼包
直接通過git下載VLC-for-android最新的源碼即可:
git clone git://git.videolan.org/vlc-ports/android.git
3. 編譯VLC源碼和VLC Android工程
(1) 配置編譯環境變數
具體參考wiki的介紹,你可以寫個shell腳本來執行,避免每次編譯都要配置,下面是我的環境變數,可以根據你的路徑修改:
#! /bin/sh
export ANDROID_SDK=/opt/android/sdk/
export ANDROID_NDK=/opt/android/android-ndk-r10/
export ANT_DIR=/opt/android/ant/
export PATH=$PATH:$ANDROID_SDK/platform-tools:$ANDROID_SDK/tools:$ANT_DIR
export ANDROID_ABI=armeabi-v7a
(2) 執行編譯
sh compile.sh
VLC不愧是使用這么廣泛的播放器,它的編譯腳本寫得非常強大和智能,直接通過執行compile.sh,它會自動check所有的依賴,並通過網路去下載缺失的庫。
首先,它會下載vlc的源碼,並存放在當前目錄下。然後去下載依賴的第三方庫文件。
當然,由於GFW的存在,有的時候下載會失敗,這個時候,就需要你手動去Google搜索它正在下載的依賴文件,手動下載好了之後放到 vlc/contrib/tarballs目錄下,然後再回到命令行重新執行 sh compile.sh
它依賴的全部第三方庫文件如圖所示:
(3) 編譯問題
編譯過程還算順利,只出現過一個大問題,如下:
google/protobuf/unittest.proto:853:21: Missing field number.
google/protobuf/unittest.proto:862:1: Reached end of input in message definition (missing '}').
make[3]: *** [unittest_proto_middleman] Error 1
網上也搜不到解決方案,我看了下GitHub上Protobuf的Readme,然後下載了最新的protobuf放到vlc/contrib
/tarballs/contrib-android-arm-linux-androideabi/protobuf目錄下,執行.
/configure --disable-shared,再編譯,沒想到就直接過了。
4. 載入VLC-For-Android的Java工程
編譯通過後,就可以直接在vlc-android/bin目錄下看到debug版的apk了,下面簡單說說在Eclipse中載入vlc-android的整個工程。
打開Eclipse,選擇Import,把vlc-for-android目錄下所有的工程到導入到Eclipse中(我去掉了TV工程),如圖所
示,有5個必須的工程,其中,VLC是主工程,其他四個都是Lib工程。沒有什麼意外的話,直接運行VLC工程,就可以在Android手機上看到VLC
播放器應用了!
F. vlc-android要怎麼用
VLC Media Player (VideoLAN) 為 Windows、Linux、OS X、Android、iOS、Windows Phone 等平台提供一個視頻播放器、解碼器。它可以播放來自網路、攝像頭、磁碟、光碟機的文件,支持包括MPEG 1/2/4, H264, VC-1, DivX, WMV, Vorbis, AC3, AAC等格式的解碼。
vlc-android是開源播放器,可以移植到項目里,對碼流進行解碼,播放等等
G. 最好的播放器十大排名
最好的播放器十大排名:GOM 播放器、 VideoLAN VLC 媒體播放器、 SMPlayer、Pot Player、Media Player Classic-家庭影院、MediaMonkey、5K播放器、KMPlayer、科迪、DivX。
1、GOM 播放器
GOM Player 支持多種格式,能夠在 PC 上查找編解碼器、損壞的文件和下載的文件。它還可以幫助添加字幕、語言、字幕同步控制項和屏幕捕獲。
10、DivX
DivX 是一款屢獲殊榮的視頻播放器,用於創建、播放和投射 DivX、AVI、MKV 和 HVAC 格式高達 4K 的視頻。使用更少 CPU 和內存的輕量級應用程序提供了多個組件;轉換器、播放器、Web 播放器、DivX To Go、媒體伺服器、DivX 安裝程序系統和 DivX 控制面板。
H. 手機本地視頻播放器哪個好用
手機本地視頻播放器有以下幾個:
1、MX播放器:
MXPlayer以超強的解碼性能以及兼容性聞名,對字幕的支持能夠兼容特效字幕,支持在線字幕匹配,看外語片無需自己找字幕。
該軟體界面風格現在是Material Design設計,MXPlayer是一款多核心解碼影片播放器,根據在多核心設備上的測試,它比單核心解碼效能提高將近70%。
2、VLC播放器:
VLC 也是一款老牌、開源的播放器,推出了包括 Windows 、Mac OS X、Linux 和 iOS 的設備,直到 2012 年 VLC 的團隊才開始著手測試版的開發,一直到 2014 年其實都是測試版本。VLC和MX Player 不同的是,它沒有插件,所有的功能全部是通過一個應用來實現的。
3、KMPlayer:
KMPlayer 是一款來自韓國的影音播放器,KMPlayer是一套將網路上所有能見得到的解碼程式(Codec)全部收集於一身的影音播放軟體。
此外,KMPlayer還能夠播放DVD與VCD、匯入多種格式的外掛字幕檔、使用普及率最高的WinAMP音效外掛與支援超多種影片效果調整選項等。
4、BSPlayer:
BSPlayer持硬體加速和多核心解碼。同樣也支持市面上主流的播放格式和字幕格式。但這些卻不是 BSPlayer 最大的亮點。它會自動在網路中搜尋匹配的字幕然後告訴用戶。除此之外,BSPlayer 的特性還包括可以直接從未解壓的壓縮文件中播放媒體文件和直接播放網路文件。
5、MoboPlayer:
一款Android平台視頻播放器,支持幾乎所有的視頻格式和載入字幕,並且能通過高度優化的核心解碼器在手機上流暢播放各種高清視頻。MoboPlayer是Android Market電子市場上下載量第一的視頻播放器,被稱為「Android平台的萬能播放器」。
I. 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();
}
}
J. 沒有編譯VLC Android配方為目標問題,怎麼解決
一:安裝androidSDK,NDK,JDK三個工具,SDK是android系統用的,有些SDK還包含了eclipse,NDK是用來編譯C/C++代碼的,這樣使得android應用程序可能通過java來調用c/c++程序、JDK不用說,是java運行必須的環境。二:根據第一步解壓的三個工具,配置這三個工具的環境變數(PATH),方法很多,可以修改~/.bashrc/etc/profile等等,這一步一定要正確,否則系統會找不到這三個工具,後面的編譯會用到這幾個工具,當然也就會出錯了,因為系統默認不知道這幾個程序的位置,這跟windows下的環境變數一個道理。為了驗證環境變數是否配置正確,可以到別的目錄下運行這幾個程序,比如到根目錄下看能否運行ndk-buildadb等程序,或者echo$PATH列印一下當前的環境變數並驗證。