android網路視頻開發
A. 各位大神用Android Studio開發app上視頻通話功能,應該怎麼做啊,能不能講一下具體的步驟,真的很急啊!
先考慮登錄驗證鑒權這些
首先,需要一個伺服器做數據中轉。你不會用個APP端來做伺服器吧,這是肯定的。這就涉及到了服務端SESSION的控制和數據轉發控制等一系列問題。
其次APP端需要發起建立SOCKET連接的請求。兩個APP都需要先主動建立。發起視頻通話的流程的時候,只是再服務端中建立兩個SOCKET的映射關系。
然後就是APP段調取攝像頭數據和音頻數據轉換為二進制格式實時傳輸到伺服器,由伺服器傳送到另外一端APP對二進制數據進行解碼。圖像和音頻都有很多編碼方式可以自己選擇編解碼的庫。解碼完成後播放音頻和展示圖片到APP容器即可。當然這個工作是兩方APP同時需要做的。
伺服器只需要做好SOCKET的維護和數據轉發就ok,不用編解碼數據,當然也可以編解碼來存放。
B. 移動端在線視頻直播軟體怎麼開發
你好,很高興能為你解答這個問題。移動端在線視頻直播軟體開發,共有以下幾個步驟:
音視頻的採集,這時開發過程中的首要環節;
數據編碼,手機直播APP開發定製肯定要採用硬編碼,手機視頻APP編碼要在解析度,幀率,碼率,GOP等參數設計上找到最佳平衡點;
數據解碼,手機視頻APP需要硬解碼,目前手機普遍支持硬解了,只是android上還是有兼容性的問題存在;
數據傳輸,CDN服務商為視頻直播APP定製了專門的帶寬和伺服器,方便於彼此之間傳輸,發送和接收端的網路連接抖動緩沖;
渲染,技術難點就是實現手機視頻APP直播的音畫同步。
希望此次解答可以幫助到你。
C. 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);
}
}
D. 安卓開發怎麼點擊按鈕就播放視頻videoview
Android使用VideoView實現VideoPlayer 在Android系統中,是通過MediaPalyer類播放媒體文件的(包括視頻和音頻)。雖然這個類已經比較簡單了,但是還需要控制各種狀態,對於視頻還需要設置輸出窗口,還是需要仔細研究的。為了避免這些麻煩事兒,Android框架提供了VideoView類來封MediaPalyer,這個VideoView類非常好用。Android自帶的程序Gallery也是用VideoView實現的。 通過VideoView播放視頻的步驟: 1、在界面布局文件中定義VideoView組件,或在程序中創建VideoView組件 2、調用VideoView的如下兩個方法來載入指定的視頻 setVidePath(String path):載入path文件代表的視頻 setVideoURI(Uri uri):載入uri所對應的視頻 3、調用VideoView的start()、stop()、psuse()方法來控制視頻的播放 VideoView通過與MediaController類結合使用,開發者可以不用自己控制播放與暫停 簡單實例: activity_main/apk/res/android" xmlns:tools="schemas/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <VideoView android:id="@+id/video1" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout> Activity 控制代碼: package com.Uri; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.MediaController; import android.widget.VideoView; public class MainActivity extends Activity { private VideoView video1; MediaController mediaco; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); video1=(VideoView)findViewById(R.id.video1); mediaco=new MediaController(this); File file=new File("/mnt/sdcard/通話錄音/1.mp4"); if(file.exists()){ //VideoView與MediaController進行關聯 video1.setVideoPath(file.getAbsolutePath()); video1.setMediaController(mediaco); mediaco.setMediaPlayer(video1); //讓VideiView獲取焦點 video1.requestFocus(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } }
E. 短視頻平台框架如何開發都有哪些功能
你好,很高興回答你的問題:
短視頻平台框架開發有很多方式,功能也要看運營團隊的需要,在這里推薦一套開發框架給您,僅供參考:
1、 直播系統前端APP是分成安卓端和蘋果端,後端是PC端,開發語言:後台PHP語言 ,Android是java語言, IOS是 objective-c,
APP原生開發, PHP 視頻互動系統由 WEB 系統、REDIS 服務、MYSQL 服務、視頻服務、聊天服務、後台管理系統和定時監控組成,手機安卓端開發語言採用:java、 IOS 蘋果採用:object c 原生開發,後台管理採用PHP 語言開發,所有服務提供橫向擴展。
二、功能細節:
1、推薦:通過後台推薦+視頻權重的方式為用戶推薦相關視頻,並在首頁直接觀看,同事直接進行關注坐著、評論、點贊以及分享;
2、搜索:
1)根據用戶:可輸入用戶昵稱來搜索用戶,支持模糊查詢,對搜索出的用戶可進行關注;
2)分類:對應相應的不同分類
3)視頻:可輸入視頻名稱來進行搜索;
3、視頻觀看
1)分享:可分享到微信、朋友圈等社交平台;
2)點贊:對喜歡的視頻進行點贊,表示喜歡和認可;
3)評論:可對短視頻進行評論,對於評論可再次回復;
4、關注
展示當前用戶關注的人發的短視頻列表
5、消息
1)我發表的評論以及發表的評論回復的
2)我收到的評論,後期對我發布短視頻的評論,可以添加用戶發布短視頻的時候添加
2、系統消息:平台可以發布平台公告
6、個人中心
1)用戶資料:展示自己的頭像昵稱等,並可對資料進行修改
2)關註:關注的數量顯示,點擊關注跳轉到關注列表頁面,並可對自己的關注的人取消關注
3、點贊列表:查看自己點贊過的視頻
F. Android緋葷粺涓鐨勯煶瑙嗛戞敮鎸佹湁鍝浜
Android緋葷粺涓瀹屽杽鐨勯煶瑙嗛戞敮鎸
鑷浠嶢ndroid緋葷粺闂涓栦互鏉ワ紝瀹冨凡緇忔垚涓轟簡縐誨姩璁懼囬嗗煙鏈涓烘垚鍔熺殑鎿嶄綔緋葷粺涔嬩竴銆傝ョ郴緇熷叿鏈夊己澶х殑澶氬獟浣撳勭悊鍔熻兘錛屽備赴瀵岀殑闊抽戝拰瑙嗛戞敮鎸侊紝鍙璁╁紑鍙戣呰交鏉懼壋寤哄嚭鍔熻兘涓板瘜鐨勯煶瑙嗛戝簲鐢ㄧ▼搴忋傛湰鏂囧皢鎺㈣ˋndroid緋葷粺涓浣跨敤鐨勫父瑙侀煶瑙嗛戞嗘灦鍜孉PI鎺ュ彛銆
1.OpenMAX緙栬В鐮佸櫒錛
OpenMAX緙栬В鐮佸櫒鏄涓縐嶅彲鐢ㄤ簬Android璁懼囦腑鐨勭‖浠跺姞閫熸妧鏈銆傝ユ妧鏈鍙浠ュ府鍔╁湪璁懼囦笂鎾鏀鵑珮娓呮垨嫻佸獟浣撹嗛戞椂鍑忓皯濯掍綋鏂囦歡鐨勫崰鐢ㄧ┖闂淬備綔涓轟竴縐嶅紑鏀炬爣鍑嗭紝OpenMAX鏀鎸佷粠搴旂敤紼嬪簭鍒扮‖浠剁殑鍏ㄩ潰瑙e喅鏂規堛傚湪Android緋葷粺涓錛孫penMAX鏄鐢辯‖浠跺巶鍟嗘彁渚涙敮鎸侊紝騫朵笖瀹冨厑璁鎬笉鍚岀殑紜浠跺拰杞浠剁粍鍚堝簱鐩鎬簰鍗忎綔銆
2.Medistore錛
Mediastore鏄疉ndroid緋葷粺鐨勪竴涓澶氬獟浣撲腑闂村眰銆傚畠浣跨敤鎴峰彲浠ュ揩閫熸柟渚垮湴鑾峰彇銆佸瓨鍌ㄥ拰澶勭悊縐誨姩璁懼囩殑澶氬獟浣撴暟鎹銆傚畠鏀鎸佽稿氭牸寮忓侻P3銆丳NG絳夛紝鑰屼笖瀹冨彲浠ラ氳繃URI鐨勬柟寮忚塊棶鍒扮郴緇熺殑澶氬獟浣撴暟鎹銆傚逛簬寮鍙戜漢鍛樻潵璇達紝Mediastore榪樻彁渚涗簡璁稿氭帴鍙e拰綾伙紝鍙甯鍔╀粬浠綆$悊澶氬獟浣撴暟鎹銆
3.MediaPlayer錛
MediaPlayer鏄疉ndroid緋葷粺涓鏈甯哥敤鐨勫氬獟浣撴挱鏀懼櫒銆傚畠鑳藉熶互嫻佺殑鏂瑰紡澶勭悊澶氱嶉煶棰戝拰瑙嗛戞牸寮忥紝濡侻P3銆乄AV絳夐煶棰戞牸寮忥紝浠ュ強MP4銆丠.264絳夎嗛戞牸寮忋侻ediaPlayer榪樺彲浠ヤ笌SurfaceView鍗忓悓宸ヤ綔錛屼互渚挎洿鍔犵伒媧誨湴鎺у埗瑙嗛戠殑鎾鏀俱傚湪寮鍙戣繃紼嬩腑錛屽紑鍙戜漢鍛樺彲浠ヤ嬌鐢∕ediaPlayer綾葷殑璁稿氭柟娉曞拰灞炴ф潵鎺у埗闊抽戝拰瑙嗛戠殑鎾鏀俱佹殏鍋滃拰鍋滄㈢瓑鍔熻兘銆
4.AudioTrack錛
AudioTrack鏄涓涓鍦ˋndroid緋葷粺涓婂勭悊闊抽戞暟鎹鐨勭被銆傚畠鏀鎸佷互鏁版嵁緙撳瓨鏂瑰紡鎾鏀鵑煶棰戣В鐮佹暟鎹錛屽苟鍏佽稿紑鍙戜漢鍛橀氳繃璁稿氭柟娉曞拰灞炴ф潵鎺у埗闊抽戞挱鏀俱侫udioTrack鏈甯哥敤浜庨煶棰戞祦浼犺緭鍜岄煶棰戞枃浠舵挱鏀撅紝渚嬪侻P3鎴朩AV鏂囦歡銆
鎬諱箣錛孉ndroid緋葷粺鐨勯煶瑙嗛戝姛鑳藉湪縐誨姩璁懼囦腑宸茬粡寰楀埌浜嗗箍娉涚殑搴旂敤銆傞氳繃瀵逛笉鍚岀殑API鎺ュ彛鍜屾嗘灦鐨勪簡瑙o紝寮鍙戜漢鍛樺彲浠ヨ交鏉懼壋寤洪珮璐ㄩ噺鐨勯煶瑙嗛戝簲鐢ㄧ▼搴忋