『壹』 android能與電腦區域網嗎
可以通過一款叫做『ES文件管理器』的app實現
1、打開es文件瀏覽器,點擊上面的三條橫線(菜單)
『貳』 開發一個基於android的即時通訊軟體,怎麼通過區域網來讓電腦上的虛擬機和手機上的軟體都能運用伺服器
做一個路由跳轉。實現網路通信
『叄』 android 區域網實時語音聊天音頻流用什麼編
一般如果應用需要進行大量數學運算時,推薦使用JNI在Java中調用C/C++編寫的動態庫,Java只負責邏輯和界面用戶操作的相應,
你這個APP很簡單分為以下幾個模塊
界面,與用戶進行交互,需要具備Android界面的編程;
網路傳輸,需要掌握Java網路socket編程的知識,使用TCP傳輸編碼後的音頻幀;
語音編解碼模塊,由兩部分構成。一是c/c++編寫的動態庫,二是Java聲明本地native函數,並將c/c++實現的native函數進行封裝,方便Java調用。這部分需要掌握Java中JNI使用的知識,c/c++編程,語音處理的方面的知識,例如數字信號處理。
而c/c++寫的庫一般不是我們自己實現的,而是引入第三方開源代碼,這里的選擇有很多,我了解到的有
ffmeg,很常用,就連暴風影音和QQ音樂據說用了他們的開源庫,而沒有遵守開源協議而進入了他們的黑名單。
speex,是國外的開源庫,現已被Opus取代,但是speex多了一個預處理功能,例如降噪、自動增益、迴音消除等等。
Superpowered,跨平台的,低延遲,功能多。
補充一點,Android現已支持純C++的開發了,這個就需要NDK的配合,寫出NativeActivity,然後就可以直接在C++中調用第三方的庫了,而不用JNI這樣繁瑣,但是由於剛出來,教程不多,需要具備很多嵌入式、音視頻採集處理的開發經驗。
『肆』 (三)Android區域網內語音對講 基於UDP語音傳輸
之前研究了基於UDP的文字傳輸 點擊打開鏈接 ,以及Android端的語音錄制 點擊打開鏈接 ,這篇文章就記錄一下Android端區域網內的語音傳輸,簡單的實現語音對講,當然裡面還存在著很多問題,包括語音不清晰啊、雜音多啊,不管了,先聽見聲音就行了。測試的時候兩部手機,上圖:
程序寫了兩個線程,一個用於錄制AudioRecordThread,一個用於播放AudioTrackThread.
(一)錄制與發送
@Override
public void run() {
if (mSocket == null)
return;
try {
mStartTime = System.currentTimeMillis();
audioRec.startRecording();
while (flag) {
try {
byte[] bytes_pkg = buffer.clone();
if (mRecordQueue.size() >= 2) {
int length = audioRec.read(buffer, 0, minBufferSize);
//獲取音量大小
mVolume = getAudioColum(buffer);
System.out.println(TAG + "= " + mVolume);
Message message = mHandler.obtainMessage();
message.arg1 = (int) mVolume;
mHandler.sendMessage(message);
DatagramPacket writePacket;
InetAddress inet = InetAddress.getByName(inetAddressName);
writePacket = new DatagramPacket(buffer, length, inet, PORT);
writePacket.setLength(length);
System.out.println("AudioRTwritePacket = " + writePacket.getData().toString());
mSocket.send(writePacket);
}
mRecordQueue.add(bytes_pkg);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
audioRec.stop();
} catch (Exception e) {
e.printStackTrace();
}
}
裡麵包含了獲取音量大小,便於在頁面上面展示,方法參考了 點擊打開鏈接
private double getAudioColum(byte[] buffer) {
double sumVolume = 0.0;
double avgVolume = 0.0;
double volume = 0.0;
for (int i = 0; i < buffer.length; i += 2) {
int v1 = buffer[i] & 0xFF;
int v2 = buffer[i + 1] & 0xFF;
int temp = v1 + (v2 << 8);// 小端
if (temp >= 0x8000) {
temp = 0xffff - temp;
}
sumVolume += Math.abs(temp);
}
avgVolume = sumVolume / buffer.length / 2;
volume = Math.log10(1 + avgVolume) * 10;
return volume;
}
(二)接收與播放
@Override
public void run() {
if (mSocket == null)
return;
//從文件流讀數據
audioTrk.play();
while (flag) {
DatagramPacket recevPacket;
try {
recevPacket = new DatagramPacket(buffer, 0, buffer.length);
mSocket.receive(recevPacket);
audioTrk.write(recevPacket.getData(), 0, recevPacket.getLength());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
audioTrk.stop();
}
(三)主頁面 接收按鈕事件
@OnClick({R.id.btn_receive})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.btn_receive:
if (btnReceive.getText().toString().equals("開始接收")) {
btnReceive.setText("停止接收");
try {
if (audioTrackThread == null) {
audioTrackThread = new AudioTrackThread();
}
new Thread(audioTrackThread).start();
} catch (SocketException e) {
e.printStackTrace();
}
} else {
btnReceive.setText("開始接收");
audioTrackThread.setFlag(false);
}
break;
}
}
(四)發送按鈕事件
ivSpeak.setOnTouchListener(new View.OnTouchListener() {
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//按下按鈕開始錄制
ivSpeak.setText("正在說話");
//顯示錄音提示
relativeLayout.setVisibility(View.VISIBLE);
try {
if (audioRecordThread == null) {
audioRecordThread = new AudioRecordThread(handler);
}
audioRecordThread.setInetAddressName(tvReceiveIp.getText().toString());
audioRecordThread.setFlag(true);
new Thread(audioRecordThread).start();
} catch (SocketException e) {
e.printStackTrace();
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
//松開按鈕結束錄制
ivSpeak.setText("按住說話");
relativeLayout.setVisibility(View.GONE);
audioRecordThread.setFlag(false);
mStopTime = audioRecordThread.getmStopTime();
mStartTime = audioRecordThread.getmStartTime();
creatMessageBean((mStopTime - mStartTime) / 1000, true);
break;
}
return true;
}
});
『伍』 android多台設備區域網和非區域網socket通信問題
技術上是不需要外部的web伺服器做中轉的,你可以路由進來的。
在路由器上做地址映射就可以了,普通家用型的路由器也是支持的。
需要考慮的是路由的外部地址的問題,可以通過動態域名來解決