anychatandroid
❶ 網易雲信是什麼
問題一:網易雲信是幹嘛用的!?剛下載了看一下,功能不多,很簡約!剛進去向易信! 吶,你想了解的網易雲信都在這兒
換個悠然的姿勢,把他看完吧。
基本信息
姓名:網易雲信
生日:2015年10月13日
星座:天秤座
家庭關系
爹:網易(杭州)網路有限公司
媽:網易雲信團隊
雲信介紹
雲信是網易公司傾力打造的即時通訊雲服務,
開發者通過客戶端SDK和雲端開放API,
即可在最短時間內獲得穩定可靠的IM功能。
服務模式
雲信是PaaS服務模式,全面支持Android、iOS、Web、PC多平台。
網易雲信優勢
01團隊IM研發資歷成熟
15年專注IM研發
IM解決方案經億級產品(網易郵箱、網易新聞客戶端、網易雲音樂等)線上驗證
移動端解決方案持續優化5年以
02凝聚網易技術實力
成熟專業運維、雲服務團隊
全套自研方案
行業頂尖前端技術提供UI組件
03網易存儲服務
網易自有億級產品內部使用多媒體文件存儲系統
數據文件系統多重備份,歷史消息不丟失
分布式資料庫,應用級數據隔離
網易雲信的能力
(十八般武藝啊)往下看,詳細了解一下~
一、 IM基礎功能
IM基礎功能即文字、表情、圖片、文件、語音、視頻、地理位置及通知消息等信息的收發功能,通過接入雲信的IM基礎功能,開發者已經能完整打造私信、群聊等聊天功能。
聊天方式
單聊:一對一聊天,支持文字、表情、圖片、語音、視頻、地理位置、通知消息。
群聊:提供普通群 (Normal) 以及高級群 (Advanced) 兩種形式的群聊功能,高級群擁有更多的許可權操作
普通群群許可權操作:創建群、邀請入群、申請入群、踢人、修改群資料、設置管理員、更改群昵稱、移交群主、解散群等。
高級群群許可權操作:群容量和群數量根據所選服務版本進行擴展。
聊天室:提供無人數上限的聊天室功能,支持聊天室創建、解散、資料編輯、歷史消息(最近10條)、抄送等功能。
聊天室管理許可權:踢人、禁言、拉黑、設置管理員、取消管理員
聊天功能
已讀回執:消息被對方查看後,可獲得消息的已讀狀態。
自定義消息:即消息類型支持自定義,可實現紅包、石頭剪刀布、閱後即焚等豐富功能。
當前狀態:單聊時可獲取對方當前正在輸入的狀態。
消息提醒:新消息提醒功能,支持設置 *** /振動提醒、免打擾時段等,支持對用戶設置或關閉消息提醒。
黑名單:可以將用戶加入黑名單,拉黑後將不再收到對方發來的任何消息或者請求
信息功能
信息記錄
歷史信息:雲端存儲用戶最近的歷史消息,提供關鍵字搜索聊天記錄的功能。消息存儲時長可根據所選服務版本(試用版、標准版和專屬私有雲)進行擴展。
消息漫遊:用戶切換到任何設備都可以讀取到歷史消息,適用於標准版。
離線消息:用戶離線後重新上線,可收到離線期間到達的消息,適用於任何服務版本
最近會話:提供最近與用戶會話的聯系人信息,實現最近聯系人列表。
信息託管
消息抄送:將消息數據實時同步給第三方開發者的伺服器。支持單聊數據、群聊數據、討論組數據、個人自定義系統通知、群組自定義系統通知數據的抄送。
好友關系託管:使用雲信用戶關系以及用戶資料託管,提供用戶好友關系託管,構建用戶通訊錄。
用戶資料託管:提供用戶資料託管功能,第三方 APP 可以選擇由雲信託管用戶資料,也可以自行實現。
優勢
穩定可靠: 累計成功發送消息量超過1000億條,系統架構保證彈性可擴展,並支持接入產品動態擴容
數據安全: 私有精簡二進制協議,數據的傳輸和存儲安全可靠
海外訪問: 提供海外AWS雲主機連通服務,保證海外用戶消息收發速度。
二、實時音視頻
提供基於網路的......>>
問題二:網易雲信是什麼 網易雲信怎麼樣 雲信就是一個即時通訊服務 網易提供SDK,如果你要開發及時通訊類的功能就不用完全自己開發,只需要接入雲信的SDK介面就可以實現,雲信現在在IM服務行業也算是很不錯的了。。
問題三:網易雲信 騙人的 真的嗎
問題四:java 和 網易雲信怎樣連接 20分 這個你需要 有他們提供的SDK才可以進行擴展的吧
問題五:網易雲信的價格怎麼樣 價格比叮咚雲高多了
問題六:誰用網易雲信的平台,怎麼感覺操作好復雜? 我這也是,操作復雜不說價格還高
問題七:剛看了一下其他的軟體,感覺網易雲信的價格好貴啊 應該不怎樣,其他軟體。
問題八:網易有易信,怎麼又出網易雲信? 大家不要上當,網易雲信 就是一個 詐騙集團!
問題九:除了阿里雲、網易雲信、騰訊雲,還有什麼別的音視頻開發?要性價比高的。。。 AnyChat是一款跨平台的音視頻解決方案,面向開發者和企業,提供SDK和多埠接入,價格也比較合理。
問題十:目前新出的網易雲信跟融雲對比,哪個更好用 如果從穩定性和技術實力看,網易雲信應該要靠譜些。不過,初創團隊估計資金會緊張,選什麼都會尷尬吧。不要道聽途說,親自與各家溝通一下,先嘗試用起來,好壞立竿見影。
❷ android 框架圖在哪個文件夾里
這是AnyChat音視頻引擎的結構圖,希望能夠幫到你,如果有什麼問題也可以進入其網站論壇進行提問。
❸ cocos2d-x集成anychat行不行
一、功能描述、SDK版本和帳號准備
功能大致是這樣的:在游戲中設置一個按鈕,點擊這個按鈕,彈出知名社交平台的分享圖標集窗口,用戶選擇分享目標後,相關信息分享到對應的社交平台。分享結果通知通過Toast顯示在屏幕的下方。
這次依舊使用ShareSDK for Android 2.3.7版本(ShareSDK-Android-2.3.7),Cocos2d-x的版本為3.0rc2。
集成前,你需要有一個基於Cocos2d-x 3.0rc2的可運行的Android平台游戲project,我們的集成就基於該project,這里我們的project名為GameDemo,GameDemo的源碼結構大致是:
復制代碼 代碼如下:
GameDemo/
– Classes/
– proj.android/
– Resources/
– cocos2d/
– CMakeLists.txt
– … …
使用ShareSDK前,你需要在各大主流社交平台(微信、微博)申請開發者帳號以及游戲接入許可權(app_key、app_secret)等,當然在ShareSDK站點也應該有自己的帳號和應用AppKey,這些申請的審核需要幾個工作日,甚至更長。
二、ShareSDK集成步驟
按照ShareSDK官方manual說法,Cocos2d-x集成ShareSDK有三種方式,之前在Cocos2d-x 2.2.2引擎中採用的是專用組件集成的方式,該組件(C2DXShareSDKSample)可以在這里下載(https://github.com/ShareSDKPlatform/C2DXShareSDKSample,該組件近期已經fix了我之前發現的bug)。
1.jar包集成
這次我們主要做微博、微信的社交分享,因此只需要微博、微信相關jar包。在C2DXShareSDKSample/proj.android/libs下,我們找到以下幾個jar包:
復制代碼 代碼如下:
-rw-rw-r– 1 tony tony 97K 4月 8 18:10 mframework.jar
-rw-rw-r– 1 tony tony 112K 4月 8 17:39 ShareSDK-Core-2.3.7.jar
-rw-rw-r– 1 tony tony 19K 4月 8 17:39 ShareSDK-SinaWeibo-2.3.7.jar
-rw-rw-r– 1 tony tony 4.3K 4月 8 17:39 ShareSDK-Wechat-2.3.7.jar
-rw-rw-r– 1 tony tony 29K 4月 8 17:39 ShareSDK-Wechat-Core-2.3.7.jar
-rw-rw-r– 1 tony tony 4.6K 4月 8 17:39 ShareSDK-Wechat-Favorite-2.3.7.jar
-rw-rw-r– 1 tony tony 4.4K 4月 8 17:39 ShareSDK-Wechat-Moments-2.3.7.jar
把這些jar包文件Copy到GameDemo/proj.android/libs下。
2. 配置文件與資源部分集成
修改GameDemo/proj.android/AndroidManifest.xml文件,在application標簽下,添加如下Activity標簽:
復制代碼 代碼如下:
<activity
android:name="cn.sharesdk.framework.ShareSDKUIShell"
android:configChanges="keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:windowSoftInputMode="stateHidden|adjustResize" >
</activity>
<activity
android:name=".wxapi.WXEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
將C2DXShareSDKSample/proj.android/res下的如下目錄中的文件復制到GameDemo/proj.android/res下:
復制代碼 代碼如下:
drawable-hdpi/ drawable-ldpi/ drawable-mdpi/
drawable-xhdpi/ layout/ values/ values-en/
注意,類似icon.png這種文件就不要復制了,自己做一下判斷就好。
3. C++部分代碼集成
將C2DXShareSDKSample/Classes下的C2DXShareSDK文件夾Copy到GameDemo/Classes下面。
由於Cocos2d-x 3.0rc2的類命名發生了變化,我們需要對C2DXShareSDK中使用到的引擎中的類名以及方法名進行修改。但實際上Cocos2d-x 3.0rc2考慮到了一些兼容性的問題,大部分名字通過cocos2d/cocos/deprecated/CCDeprecated.h中定義的typedef得以保留,雖然這些名字已經被建議deprecated了。rc2中CCObject被改名為Ref了,這個我們需要手工在C2DXShareSDK進行修改。
另外ShareSDK組件在實現時大量使用了CCDictionary、CCArray和CCString,而這三個類在Cocos2d-x 3.0rc2中均被deprecated了,但我們依然可以使用,所以我們可以不做修改。但以後隨著cocos2d-x版本的演進,這些類很可能被徹底移除出引擎,我們就需要重新使用其替代品進行實現了。
此外我們還需要手工修改一下C2DXShareSDK/Android/JSON/CCJSONConverter.cpp文件中的getObjJson方 法,因為rc2中CCDictionary、CCString、CCArray這些類的真實名稱都已經換成了__Dictionary、__String 和__Array,CCDictionary、CCString、CCArray只是些typedef,因此要像下面這樣做些修改(如果你是集成 cocos2d-x 2.x.x版本,則無需做下面修改):
復制代碼 代碼如下:
cJSON * CCJSONConverter::getObjJson(Ref * obj)
{
std::string s = typeid(*obj).name();
if(s.find("__Dictionary")!=std::string::npos){
cJSON * json = cJSON_CreateObject();
convertDictionaryToJson((CCDictionary *)obj, json);
return json;
}else if(s.find("__Array")!=std::string::npos){
cJSON * json = cJSON_CreateArray();
convertArrayToJson((CCArray *)obj, json);
return json;
}else if(s.find("__String")!=std::string::npos){
CCString * s = (CCString *)obj;
cJSON * json = cJSON_CreateString(s->getCString());
return json;
}else if(s.find("CCNumber")!=std::string::npos){
CCNumber * n = (CCNumber *)obj;
cJSON * json = cJSON_CreateNumber(n->getDoubleValue());
return json;
}else if(s.find("CCNull")!=std::string::npos){
cJSON * json = cJSON_CreateNull();
return json;
}
CCLog("CCJSONConverter encountered an unrecognized type");
return NULL;
}
CCNumber和CCNull是ShareSDK組件自己實現的類名,這里無需修改。
接下來我們需要在AppDelegate.cpp中對ShareSDK做初始化了:
復制代碼 代碼如下:
bool AppDelegate::applicationDidFinishLaunching() {
… …
initShareSDK();
… ..
}
void AppDelegate::initShareSDK()
{
// sina weibo
CCDictionary *sinaConfigDict = CCDictionary::create();
sinaConfigDict->setObject(CCString::create("YOUR_WEIBO_APPKEY"), "app_key");
sinaConfigDict->setObject(CCString::create("YOUR_WEBIO_APPSECRET"), "app_secret");
sinaConfigDict->setObject(CCString::create("http://www.sharesdk.cn"), "redirect_uri");
C2DXShareSDK::setPlatformConfig(C2DXPlatTypeSinaWeibo, sinaConfigDict);
// wechat
CCDictionary *wcConfigDict = CCDictionary::create();
wcConfigDict->setObject(CCString::create("YOUR_WECHAT_APPID"), "app_id");
C2DXShareSDK::setPlatformConfig(C2DXPlatTypeWeixiSession, wcConfigDict);
C2DXShareSDK::setPlatformConfig(C2DXPlatTypeWeixiTimeline, wcConfigDict);
C2DXShareSDK::setPlatformConfig(C2DXPlatTypeWeixiFav, wcConfigDict);
C2DXShareSDK::open(CCString::create("YOUR_SHARESDK_APPKEY"), false);
}
在Share按鈕的事件回調函數中調用ShareSDK的介面進行社交平台分享:
復制代碼 代碼如下:
void GameScene::menuShareCallback(Ref* sender)
{
Dictionary *content = Dictionary::create();
content->setObject(String::create("ShareSDK for Cocos2d-x 3.0rc2社交分享測試。")
❹ android代碼運行時出現java.lang.ExceptionInInitializerError錯誤是什麼問題
AnyChatCoreSDK 這個類中有載入庫的操作,可能是因為無法找到該庫文件,所以報這個錯。 確定下路徑和命名無誤。
❺ Android開發視頻通話怎麼實現
/**
* Android視頻聊天
* 1、初始化SDK 2、連接伺服器、 3、用戶登錄;4、進入房間;5、打開本地視頻;6、請求對方視頻
*/
public class VideoChatActivity extends Activity implements AnyChatBaseEvent
{
private AnyChatCoreSDK anychat; // 核心SDK
private SurfaceView remoteSurfaceView; // 對方視頻
private SurfaceView localSurfaceView; // 本地視頻
private ConfigEntity configEntity;
private boolean bSelfVideoOpened = false; // 本地視頻是否已打開
private boolean bOtherVideoOpened = false; // 對方視頻是否已打開
private TimerTask mTimerTask; // 定時器
private Timer mTimer = new Timer(true);
private Handler handler; // 用Handler來不間斷刷新即時視頻
private List<String> userlist = new ArrayList<String>();//保存在線用戶列表
private int userid; // 用戶ID
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video_chat);
remoteSurfaceView = (SurfaceView) findViewById(R.id.surface_remote);
localSurfaceView = (SurfaceView) findViewById(R.id.surface_local);
configEntity = ConfigService.LoadConfig(this);//載入視頻通話設置
loginSystem();// 初始化SDK 連接伺服器
mTimerTask = new TimerTask(){
public void run(){
Message mesasge = new Message();
handler.sendMessage(mesasge);
}
};
mTimer.schele(mTimerTask, 1000, 100);
handler = new Handler(){
@Override
public void handleMessage(Message msg){
VideoChat();// 不間斷顯示即時視頻通話畫面
super.handleMessage(msg);
}
};
}
// 初始化SDK 連接伺服器
private void loginSystem(){
if (anychat == null){
anychat = new AnyChatCoreSDK();
anychat.SetBaseEvent(this); // 設置基本事件回調函數
if (configEntity.useARMv6Lib != 0) // 使用ARMv6指令集
anychat.SetSDKOptionInt(AnyChatDefine.
BRAC_SO_CORESDK_USEARMV6LIB, 1);
anychat.InitSDK(android.os.Build.VERSION.SDK_INT, 0); // 初始化SDK
}
anychat.Connect("demo.anychat.cn", 8906);// 連接伺服器
}
// 顯示即時視頻通話畫面
public void VideoChat(){
if (!bOtherVideoOpened){
if (anychat.GetCameraState(userid) == 2
&& anychat.GetUserVideoWidth(userid) != 0){
SurfaceHolder holder = remoteSurfaceView.getHolder();
holder.setFormat(PixelFormat.RGB_565);
holder.setFixedSize(anychat.GetUserVideoWidth(userid),
anychat.GetUserVideoHeight(userid));
Surface s = holder.getSurface(); // 獲得視頻畫面
anychat.SetVideoPos(userid, s, 0, 0, 0, 0); // 調用API顯示視頻畫面
bOtherVideoOpened = true;
}
if (!bSelfVideoOpened){
if (anychat.GetCameraState(-1) == 2
&& anychat.GetUserVideoWidth(-1) != 0){
SurfaceHolder holder = localSurfaceView.getHolder();
holder.setFormat(PixelFormat.RGB_565);
holder.setFixedSize(anychat.GetUserVideoWidth(-1),
anychat.GetUserVideoHeight(-1));
Surface s = holder.getSurface();
anychat.SetVideoPos(-1, s, 0, 0, 0, 0);
bSelfVideoOpened = true;
}
}
}
public void OnAnyChatConnectMessage(boolean bSuccess){
if (!bSuccess){
Toast.makeText(VideoChatActivity.this, "連接伺服器失敗,自動重連,請稍後...", Toast.LENGTH_SHORT).show();
}
anychat.Login("android", ""); // 伺服器連接成功 用戶登錄
}
public void OnAnyChatLoginMessage(int dwUserId, int dwErrorCode){
if (dwErrorCode == 0) {
Toast.makeText(this, "登錄成功!", Toast.LENGTH_SHORT).show();
anychat.EnterRoom(1, ""); // 用戶登錄成功 進入房間
ApplyVideoConfig();
} else {
Toast.makeText(this, "登錄失敗,錯誤代碼:" + dwErrorCode, Toast.LENGTH_SHORT).show();
}
}
public void OnAnyChatEnterRoomMessage(int dwRoomId, int dwErrorCode){
if (dwErrorCode == 0) { // 進入房間成功 打開本地音視頻
Toast.makeText(this, "進入房間成功", Toast.LENGTH_SHORT).show();
anychat.UserCameraControl(-1, 1); // 打開本地視頻
anychat.UserSpeakControl(-1, 1); // 打開本地音頻
} else {
Toast.makeText(this, "進入房間失敗,錯誤代碼:" + dwErrorCode, Toast.LENGTH_SHORT).show();
}
}
public void OnAnyChatOnlineUserMessage(int dwUserNum, int dwRoomId){
if (dwRoomId == 1){
int user[] = anychat.GetOnlineUser();
if (user.length != 0){
for (int i = 0; i < user.length; i++){
userlist.add(user[i]+"");
. }
String temp =userlist.get(0);
userid = Integer.parseInt(temp);
anychat.UserCameraControl(userid, 1);// 請求用戶視頻
anychat.UserSpeakControl(userid, 1); // 請求用戶音頻
}
else {
Toast.makeText(VideoChatActivity.this, "當前沒有在線用戶", Toast.LENGTH_SHORT).show();
}
}
}
public void OnAnyChatUserAtRoomMessage(int dwUserId, boolean bEnter){
if (bEnter) {//新用戶進入房間
userlist.add(dwUserId+"");
}
else { //用戶離開房間
if (dwUserId == userid)
{
Toast.makeText(VideoChatActivity.this, "視頻用戶已下線", Toast.LENGTH_SHORT).show();
anychat.UserCameraControl(userid, 0);// 關閉用戶視頻
anychat.UserSpeakControl(userid, 0); // 關閉用戶音頻
userlist.remove(userid+""); //移除該用戶
if (userlist.size() != 0)
{
String temp =userlist.get(0);
userid = Integer.parseInt(temp);
anychat.UserCameraControl(userid, 1);// 請求其他用戶視頻
anychat.UserSpeakControl(userid, 1); // 請求其他用戶音頻
}
}
141. else {
userlist.remove(dwUserId+""); //移除該用戶
}
}
}
public void OnAnyChatLinkCloseMessage(int dwErrorCode){
Toast.makeText(VideoChatActivity.this, "連接關閉,error:" + dwErrorCode, Toast.LENGTH_SHORT).show();
}
@Override
protected void onDestroy(){ //程序退出
anychat.LeaveRoom(-1); //離開房間
anychat.Logout(); //注銷登錄
anychat.Release(); //釋放資源
mTimer.cancel();
super.onDestroy();
}
// 根據配置文件配置視頻參數
private void ApplyVideoConfig(){
if (configEntity.configMode == 1) // 自定義視頻參數配置
{
// 設置本地視頻編碼的碼率(如果碼率為0,則表示使用質量優先模式)
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_BITRATECTRL,configEntity.videoBitrate);
if (configEntity.videoBitrate == 0)
{
// 設置本地視頻編碼的質量
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_QUALITYCTRL,configEntity.videoQuality);
}
// 設置本地視頻編碼的幀率
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_FPSCTRL,configEntity.videoFps);
// 設置本地視頻編碼的關鍵幀間隔
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_GOPCTRL,configEntity.videoFps * 4);
// 設置本地視頻採集解析度
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_WIDTHCTRL,configEntity.resolution_width);
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_HEIGHTCTRL,configEntity.resolution_height);
// 設置視頻編碼預設參數(值越大,編碼質量越高,佔用CPU資源也會越高)
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_PRESETCTRL,configEntity.videoPreset);
}
// 讓視頻參數生效
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_APPLYPARAM,configEntity.configMode);
// P2P設置
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_NETWORK_P2PPOLITIC,configEntity.enableP2P);
// 本地視頻Overlay模式設置
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_OVERLAY,configEntity.videoOverlay);
// 迴音消除設置
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_AUDIO_ECHOCTRL,configEntity.enableAEC);
// 平台硬體編碼設置
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_CORESDK_USEHWCODEC,configEntity.useHWCodec);
// 視頻旋轉模式設置
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_ROTATECTRL,configEntity.videorotatemode);
// 視頻平滑播放模式設置
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_STREAM_SMOOTHPLAYMODE,configEntity.smoothPlayMode);
// 視頻採集驅動設置
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_CAPDRIVER,configEntity.videoCapDriver);
// 本地視頻採集偏色修正設置
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_FIXCOLORDEVIA,configEntity.fixcolordeviation);
// 視頻顯示驅動設置
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_VIDEOSHOW_DRIVERCTRL,configEntity.videoShowDriver);
}
}
❻ 蘋果手機之間視頻通話怎麼收費
蘋果之間的視頻用的是FaceTime 目前FaceTime好像只可以在WIFI接入模式下才能打通(我每次都在WIFI下使用),所以 完全免費 。如果不是該模式 那麼按照運營商流量計費!
❼ 如何選擇即時通訊的開發平台
所以說不能一概而論的來說,即時通訊的價位和開發時間,功能簡單常見的 自然塊,而且價位低,但是功能模塊比較多的,價位就比較高,所以要根據自己的需求來選擇,適合自己的APP。
❽ 怎麼實現android實時視頻通話功能
/**
* Android視頻聊天
* 1、初始化SDK 2、連接伺服器、 3、用戶登錄;4、進入房間;5、打開本地視頻;6、請求對方視頻
*/
public class VideoChatActivity extends Activity implements AnyChatBaseEvent
{
private AnyChatCoreSDK anychat; // 核心SDK
private SurfaceView remoteSurfaceView; // 對方視頻
private SurfaceView localSurfaceView; // 本地視頻
private ConfigEntity configEntity;
private boolean bSelfVideoOpened = false; // 本地視頻是否已打開
private boolean bOtherVideoOpened = false; // 對方視頻是否已打開
private TimerTask mTimerTask; // 定時器
private Timer mTimer = new Timer(true);
private Handler handler; // 用Handler來不間斷刷新即時視頻
private List<String> userlist = new ArrayList<String>();//保存在線用戶列表
private int userid; // 用戶ID
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video_chat);
remoteSurfaceView = (SurfaceView) findViewById(R.id.surface_remote);
localSurfaceView = (SurfaceView) findViewById(R.id.surface_local);
configEntity = ConfigService.LoadConfig(this);//載入視頻通話設置
loginSystem();// 初始化SDK 連接伺服器
mTimerTask = new TimerTask(){
public void run(){
Message mesasge = new Message();
handler.sendMessage(mesasge);
}
};
mTimer.schele(mTimerTask, 1000, 100);
handler = new Handler(){
@Override
public void handleMessage(Message msg){
VideoChat();// 不間斷顯示即時視頻通話畫面
super.handleMessage(msg);
}
};
}
❾ 視頻直播APP開發怎麼做
一個直播系統大概可以分為一下幾個模塊,媒體模塊,服務模塊,管理模塊。媒體模塊是其中的核心,又可分為採集,前處理,編碼,傳輸,解碼,渲染這幾個環節。
1、採集
採集是直播系統中的第一環節,獲取視頻源。 因為iOS是軟硬體種類不多,官方也提供了穩定可靠的介面,比較簡單。 Android因為機型種類繁多,需要適配機型,會是很大一部分工作。 而PC也面臨各種攝像頭驅動,難點在於機型適配。
2、前處理
主要用於圖像美化,風格化,圖像處理方面。除了秀場需求以外,在UGC內容生產方式下,大量的內容對美顏都有較高的要求。美顏簡單的可以通過美顏鏡頭,但局限性大,限於PC端的主播,更好的辦法是通過軟體實現,需要圖像處理方面的人員,美顏演算法需要需要用到GPU編程, 難點在於美顏效果是否自然,GPU佔用與效果的平衡。GPU用於高性能計算,但功耗也相對高,需要考慮到手機溫度對數據採集的影響。圖像處理不僅僅是美顏,在交互中可能會涉及到濾鏡,人臉識別,人物風格化等,使得客戶擁有更好的互動體驗。目前iOS上比較好的圖像處理庫是GPUImage,提供了豐富的預處理效果,也可利用該庫自定義設計。Android上也提供了功能強大的圖像處理庫grafika。
3、編碼
在編碼方面,有兩種編碼方式,硬編碼(硬體)與軟編碼(軟體)。編碼主要難點有兩個:1、處理硬體兼容性問題。2、在高 fps、低 bitrate 和音質畫質之間找到平衡。iOS 端硬體兼容性較好,可以直接採用硬編。而 Android 的硬編的支持則難得多,需要支持各種硬體機型,推薦使用軟編。
4、傳輸
傳輸涉及系統的多個部分,連接主播端,服務端,客服端等多個部分。 傳輸效率高與否決定直播系統的性能好不好,傳輸是直播系統非常重要的技術核心。
涉及技術或協議:
傳輸協議:RTP與RTCP、RTSP、RTMP、HTTP、HLS(HTTP Live Streaming)等
控制信令:SIP和SDP、SNMP等
5、解碼和渲染
拉流獲取音視頻數據後,需要通過解碼器解碼,渲染才能在播放器上播放。 H.264和H.265是有所壓縮的,在解碼恢復之後是缺損的原數據。之前提到的體積最小畫質最優的編碼參數,就是在這里恢復畫質的,該參數組合是非常重要的技術。現在的播放器普遍都需要高清支持,解碼也應選擇硬解碼。iOS能夠較好的支持,但Android還需要很多工作去彌補Android在平台差異的缺陷。而在播放端,保證音畫同步的同時,保證穩定流暢的直播流量,需要服務端與播放端做調度優化。
以上是媒體模塊,還有服務模塊的支付,運營,任務等系統,管理模塊的客戶端設計與維護、後台資料庫、後台控制系統等。
現在市場提供直播能力的供應商很多。AnyChat、微吼、網易雲、阿里雲都可以提供直播APP開發能力。