日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

webrtc回声消除线程android,android WebRTC 示例demo源码(回音消除)

發布時間:2024/9/19 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 webrtc回声消除线程android,android WebRTC 示例demo源码(回音消除) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【實例簡介】

有相關文檔和測試demo,回音消除等處理,學習WebRTC、回音消除的同學可以好好參考

【實例截圖】

【核心代碼】

/*

* Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.

*

* Use of this source code is governed by a BSD-style license

* that can be found in the LICENSE file in the root of the source

* tree. An additional intellectual property rights grant can be found

* in the file PATENTS. All contributing project authors may

* be found in the AUTHORS file in the root of the source tree.

*/

package org.webrtc.webrtcdemo;

import android.app.ActionBar.Tab;

import android.app.ActionBar.TabListener;

import android.app.ActionBar;

import android.app.Activity;

import android.app.Fragment;

import android.app.FragmentTransaction;

import android.content.pm.ActivityInfo;

import android.media.AudioManager;

import android.os.Bundle;

import android.os.Handler;

import android.view.KeyEvent;

import android.view.Menu;

import android.view.MenuInflater;

import android.view.MenuItem;

import android.view.WindowManager;

public class WebRTCDemo extends Activity implements MenuStateProvider {

// From http://developer.android.com/guide/topics/ui/actionbar.html

public static class TabListener

implements ActionBar.TabListener {

private Fragment fragment;

private final Activity activity;

private final String tag;

private final Class instance;

private final Bundle args;

public TabListener(Activity activity, String tag, Class clz) {

this(activity, tag, clz, null);

}

public TabListener(Activity activity, String tag, Class clz,

Bundle args) {

this.activity = activity;

this.tag = tag;

this.instance = clz;

this.args = args;

}

public void onTabSelected(Tab tab, FragmentTransaction ft) {

// Check if the fragment is already initialized

if (fragment == null) {

// If not, instantiate and add it to the activity

fragment = Fragment.instantiate(activity, instance.getName(), args);

ft.add(android.R.id.content, fragment, tag);

} else {

// If it exists, simply attach it in order to show it

ft.attach(fragment);

}

}

public void onTabUnselected(Tab tab, FragmentTransaction ft) {

if (fragment != null) {

// Detach the fragment, because another one is being attached

ft.detach(fragment);

}

}

public void onTabReselected(Tab tab, FragmentTransaction ft) {

// User selected the already selected tab. Do nothing.

}

}

private NativeWebRtcContextRegistry contextRegistry = null;

private MediaEngine mediaEngine = null;

private Handler handler;

public MediaEngine getEngine() { return mediaEngine; }

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// Global settings.

getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

// State.

// Must be instantiated before MediaEngine.

contextRegistry = new NativeWebRtcContextRegistry();

contextRegistry.register(this);

// Load all settings dictated in xml.

mediaEngine = new MediaEngine(this);

mediaEngine.setRemoteIp(getResources().getString(R.string.loopbackIp));

mediaEngine.setTrace(getResources().getBoolean(

R.bool.trace_enabled_default));

mediaEngine.setAudio(getResources().getBoolean(

R.bool.audio_enabled_default));

mediaEngine.setAudioCodec(mediaEngine.getIsacIndex());

mediaEngine.setAudioRxPort(getResources().getInteger(

R.integer.aRxPortDefault));

mediaEngine.setAudioTxPort(getResources().getInteger(

R.integer.aTxPortDefault));

mediaEngine.setSpeaker(getResources().getBoolean(

R.bool.speaker_enabled_default));

mediaEngine.setDebuging(getResources().getBoolean(

R.bool.apm_debug_enabled_default));

mediaEngine.setReceiveVideo(getResources().getBoolean(

R.bool.video_receive_enabled_default));

mediaEngine.setSendVideo(getResources().getBoolean(

R.bool.video_send_enabled_default));

mediaEngine.setVideoCodec(getResources().getInteger(

R.integer.video_codec_default));

// TODO(hellner): resolutions should probably be in the xml as well.

mediaEngine.setResolutionIndex(MediaEngine.numberOfResolutions() - 2);

mediaEngine.setVideoTxPort(getResources().getInteger(

R.integer.vTxPortDefault));

mediaEngine.setVideoRxPort(getResources().getInteger(

R.integer.vRxPortDefault));

mediaEngine.setNack(getResources().getBoolean(R.bool.nack_enabled_default));

mediaEngine.setViewSelection(getResources().getInteger(

R.integer.defaultView));

// Create action bar with all tabs.

ActionBar actionBar = getActionBar();

actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

actionBar.setDisplayShowTitleEnabled(false);

Tab tab = actionBar.newTab()

.setText("Main")

.setTabListener(new TabListener(

this, "main", MainMenuFragment.class));

actionBar.addTab(tab);

tab = actionBar.newTab()

.setText("Settings")

.setTabListener(new TabListener(

this, "Settings", SettingsMenuFragment.class));

actionBar.addTab(tab);

tab = actionBar.newTab()

.setText("Video")

.setTabListener(new TabListener(

this, "video", VideoMenuFragment.class));

actionBar.addTab(tab);

tab = actionBar.newTab()

.setText("Audio")

.setTabListener(new TabListener(

this, "Audio", AudioMenuFragment.class));

actionBar.addTab(tab);

enableTimedStartStop();

// Hint that voice call audio stream should be used for hardware volume

// controls.

setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

MenuInflater inflater = getMenuInflater();

inflater.inflate(R.menu.main_activity_actions, menu);

return super.onCreateOptionsMenu(menu);

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

// Handle presses on the action bar items

switch (item.getItemId()) {

case R.id.action_exit:

MainMenuFragment main = (MainMenuFragment)getFragmentManager()

.findFragmentByTag("main");

main.stopAll();

finish();

return true;

default:

return super.onOptionsItemSelected(item);

}

}

@Override

public void onDestroy() {

disableTimedStartStop();

mediaEngine.dispose();

contextRegistry.unRegister();

super.onDestroy();

}

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

if (keyCode == KeyEvent.KEYCODE_BACK) {

// Prevent app from running in the background.

MainMenuFragment main = (MainMenuFragment)getFragmentManager()

.findFragmentByTag("main");

main.stopAll();

finish();

return true;

}

return super.onKeyDown(keyCode, event);

}

private int getCallRestartPeriodicity() {

return getResources().getInteger(R.integer.call_restart_periodicity_ms);

}

// Thread repeatedly calling start/stop.

void enableTimedStartStop() {

if (getCallRestartPeriodicity() > 0) {

// Periodicity == 0 Disabled.

handler = new Handler();

handler.postDelayed(startOrStopCallback, getCallRestartPeriodicity());

}

}

void disableTimedStartStop() {

if (handler != null) {

handler.removeCallbacks(startOrStopCallback);

}

}

private Runnable startOrStopCallback = new Runnable() {

public void run() {

MainMenuFragment main = (MainMenuFragment)getFragmentManager()

.findFragmentByTag("main");

main.toggleStart();

handler.postDelayed(startOrStopCallback, getCallRestartPeriodicity());

}

};

}

總結

以上是生活随笔為你收集整理的webrtc回声消除线程android,android WebRTC 示例demo源码(回音消除)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 人妻在线一区二区 | 欧美日本国产 | 亚洲欧美日本韩国 | 黑丝少妇喷水 | 摸丰满大乳奶水www免费 | 天天操天天干天天爽 | 性国产精品 | 欧美干干 | 婷婷亚洲一区 | 国产精品久久网站 | 欧美日韩激情在线 | 人妻少妇精品视频一区二区三区 | 中文字幕在线观看高清 | 69视频一区二区 | 国产真实交换夫妇视频 | 欧美欧美欧美欧美 | 天天干天天操天天玩 | 国产1区2区3区 | 精品免费一区二区 | 成人国产精品蜜柚视频 | 偷拍中国夫妇高潮视频 | 九九热在线视频观看 | 丰满熟妇人妻中文字幕 | 神马午夜888 | av不卡在线观看 | 春色激情| 国产99在线播放 | 修女也疯狂3免费观看完整版 | 女同性做爰全过程 | 精品人妻无码一区二区三 | 亚洲亚裔videos黑人hd | 国产精品一级二级三级 | 婷婷人体 | 亚洲a视频 | 精品一区二区三区在线免费观看 | 免费黄色入口 | 亚洲视频网站在线 | 久久久久久久久久久久电影 | 免费av大片| 欧美入口 | 性一交一乱一色一免费无遮挡 | 国产最新在线视频 | 男男啪啪无遮挡 | 99爱在线观看 | 911国产视频| 欧美一区二不卡视频 | 亚洲黄色免费在线观看 | 丰满少妇乱子伦精品看片 | 美国做爰xxxⅹ性视频 | 亚洲爱爱片 | 老汉av | 国产精品丝袜视频无码一区69 | 爱爱一区 | 免费的性爱视频 | 欧美福利网 | 成人欧美一区二区三区在线播放 | 制服.丝袜.亚洲.另类.中文 | 国产精品一区无码 | av性在线 | 人人插人人搞 | 久久午夜激情 | 男人的天堂av网 | 国产三级直播 | 亚洲成av人片在线观看无码 | 大牛影视剧免费播放在线 | 一本色道久久88 | 熟妇一区二区三区 | 丝袜制服中文字幕 | 深夜福利1000| 一区二区三区在线 | 白嫩初高中害羞小美女 | 亚洲永久精品视频 | 五月天综合激情 | 韩国三级hd中文字幕有哪些 | 日韩在线观看免费高清 | 久久久视频在线观看 | av在线播放国产 | 国产成人精品无码播放 | 国产寡妇亲子伦一区二区三区四区 | 日韩欧美国产中文字幕 | 精品久久久久久亚洲 | 一级毛毛片 | 国产精品成人va在线观看 | 五级黄高潮片90分钟视频 | 色网站在线看 | 日本女优中文字幕 | 亚洲黄色成人 | 日韩三级黄 | 97国产一区 | 精品人妻一区二区三区四区不卡 | 欧美成人三级在线视频 | 日日摸天天爽天天爽视频 | 性色一区二区三区 | 免费av一区二区三区 | 国产精品播放 | 成人区人妻精品一熟女 | 国产一级免费大片 | 亚洲理论视频 | 91艹|