1. 程式人生 > >Android音訊實時傳輸與播放(二):服務端

Android音訊實時傳輸與播放(二):服務端

我偷懶就用java寫了個簡單的伺服器,大家明白原理就好。

服務端共開放兩個埠,一個udp上行埠用來接收amr音訊流,另一個tcp下行埠用來發送amr音訊流。

我這裡寫的服務端實現了組播的功能,即一個人在錄音,可以同時讓很多人同時聽到。

簡而言之,服務端做的唯一一件事情就是轉發音訊流,囧rz。。。

在這裡,我只貼出一部分程式碼,後面我會上傳資源供大家下載。

接收udp傳送的音訊碼流:

  1. while (isServerRunning()) {  
  2.     try {  
  3.         DatagramPacket pack = new DatagramPacket(data, data.length);  
  4.         udpServer.receive(pack);  
  5.         addPacketToBuffer(new FramePacket(pack.getData(), pack.getLength()));  
  6.     } catch (Exception e) {  
  7.         System.out.println(e.toString());  
  8.     }  
  9. }  

用tcp轉發收到的音訊流:

  1. publicvoid sendDataToAllClient() throws Exception {  
  2.     if (isBufferEmpty() || clientList.size() <= 
    0) {  
  3.         return;  
  4.     }  
  5.     boolean bufEmpty = isBufferEmpty();  
  6.     byte[] block = takeAwayFirstFrame();  
  7.     ArrayList<Integer> disConnectClient = new ArrayList<Integer>();  
  8.     for (int ix = 0; ix < clientList.size(); ++ix) {  
  9.         Client client = clientList.get(ix);  
  10.         Socket clientSocket = client.getSocket();  
  11.         if (clientSocket.isConnected()) {  
  12.             try {  
  13.                 if (!bufEmpty) {  
  14.                     if (block == null) {  
  15.                         continue;  
  16.                     }  
  17.                     OutputStream output = clientSocket.getOutputStream();  
  18.                     output.write(block);  
  19.                     output.flush();  
  20.                 }  
  21.             } catch (Exception err) {  
  22.                 disConnectClient.add(ix);  
  23.             }  
  24.         } else {  
  25.             disConnectClient.add(ix);  
  26.         }  
  27.     }  
  28.     for (int ix = 0; ix < disConnectClient.size(); ++ix) {  
  29.         int index = disConnectClient.get(ix);  
  30.         clientList.remove(index);  
  31.     }  
  32.     disConnectClient.clear();  
  33.     disConnectClient = null;  
  34.     block = null;  
  35. }  

相關推薦

Android音訊實時傳輸播放服務

我偷懶就用java寫了個簡單的伺服器,大家明白原理就好。 服務端共開放兩個埠,一個udp上行埠用來接收amr音訊流,另一個tcp下行埠用來發送amr音訊流。 我這裡寫的服務端實現了組播的功能,即一個人在錄音,可以同時讓很多人同時聽到。 簡而言之,服務端做的唯一一件

Android音訊實時傳輸播放AMR硬編碼硬解碼

轉載請註明出處! 在Android中我所知道的音訊編解碼有兩種方式: (一)使用AudioRecord採集音訊,用這種方式採集的是未經壓縮的音訊流;用AudioTrack播放實時音訊流。用這兩個類的話,如果需要對音訊進行編解碼,就需要自己移植編解碼庫了,比如可以移植il

Android音訊實時傳輸播放

服務端共開放兩個埠,一個udp上行埠用來接收amr音訊流,另一個tcp下行埠用來發送amr音訊流。 我這裡寫的服務端實現了組播的功能,即一個人在錄音,可以同時讓很多人同時聽到。 簡而言之,服務端做的唯一一件事情就是轉發音訊流,囧rz。。。 在這裡,我只貼出一部分程式碼,後

Netty4.x 原始碼實戰系列服務bind流程詳解

在上一篇《ServerBootstrap 與 Bootstrap 初探》中,我們已經初步的瞭解了ServerBootstrap是netty進行服務端開發的引導類。 且在上一篇的服務端示例中,我們也看到了,在使用netty進行網路程式設計時,我們是通過bind方法

Netty服務客戶例項分析

package com.netty; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.ch

NFC技術使用Android Beam技術傳輸文件

imp 圖片 .com fault gen catch ret generate puts 1 public class MainActivity extends ActionBarActivity implements 2 CreateBeamUr

Android開發中佈局元件—— padding margin 的區別

在 Android開發中我們會設定某個檢視相對於別的檢視的距離,這時我們就要用到 margin 和 padding ,但是有時候很容易把這兩個屬性弄混淆,那我們就看看他們的區別。 外邊距(margin): 屬於佈局引數,決定兩個元件之間的距離。作用於多個元件之間。 內邊距(

JVM高級特性實踐對象存活判定算法引用 回收

添加 引用計數器 程序計數器 正文 bmc 進入 block 結構 內存 關於垃圾回收器GC(Garbage Collection),多數人意味它是Java語言的伴生產物。事實上,GC的歷史遠比Java悠遠,於1960年誕生在MIT的Lisp是第一門真正使用內存動態分配和垃

Spring Cloud服務註冊發現 Eureka【Finchley 版】

LEDE .com Go eureka clean 英文逗號 開始 效果 sam Spring Cloud(二):服務註冊與發現 Eureka【Finchley 版】 發表於 2018-04-15 | 更新於 2018-05-07 | 上一篇主要介紹了相關理論,這一

spring cloud實戰思考服務之間通過fiegn上傳多個文件1

jar 多文件 上傳文件 ret nmap spa 不同 port 問題 需求場景: 微服務之間調用接口一次性上傳多個文件。 上傳文件的同時附帶其他參數。 多個文件能有效的區分開,以便進行不同處理。   Spring cloud的微服務之間接口調用使用Feign。原裝的

Android開發—智慧家居系列】用手機對WIFI模組進行配置

【Android開發—智慧家居系列】(二):用手機對WIFI模組進行配置   版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/u010924834/article/details/49496729   在實際開發中,我開

高並發處理思路手段緩存

這也 也會 多說 訂閱 如果 選型 穿透 分享圖片 需要 傳統web請求流程 一般來說,現在的互聯網應用網站或者APP,它的整體流程可以用我們這個圖裏展示的來表示,用戶請求開始,從這個界面是最裏面的瀏覽器和APP,到網絡轉發,再到應用服務,最後到存儲,這純屬可能是數據

SpringCloud服務的註冊發現Eureka

一、什麼是服務註冊與發現 Spring Cloud Eureka 模組提供的功能是被動式的服務發現。 服務註冊:每個使用者去聊天室伺服器上註冊。 服務發現:這樣他的好友們就能看到你,你同時也將獲取好友的上線列表. 微服務中,服務就相當於聊天室的使用者,而服務註冊中心就像

騰訊雲伺服器的配置部署MySQL的配置安裝、雲伺服器雲資料庫的連線

MySQL的配置安裝、雲伺服器與雲資料庫的連線 【系統、環境】 電腦作業系統:Windows10 64位 伺服器詳情: 所屬專案:微信小程式 開發語言:PHP 5.6.27 作業系統:CentOS 7.2 64位 【前言】 這篇部落格主

深入理解maven應用靈活的構建

 一個優秀的構建系統必須足夠靈活,應該能夠讓專案在不同的環境下都能成功構建。maven為了支援構建的靈活性,內建了三大特性,即:屬性、profile和資源過濾。 1、maven屬性  maven屬性分6類:     1、內建屬性:如${basedir}表示專案根目錄,$

Flask框架的學習實戰實戰小專案

昨天寫了一篇flask開發環境搭建,今天繼續,進行一個實戰小專案-blog系統。 blog系統很簡單,只有一個頁面,然後麻雀雖小五臟俱全。這裡目的不是為了做專案而做專案,這篇文章本意是通過這次練習傳達以下幾個知識點: 1、從全域性上了解flask專案的目錄結構 2、flas

C++ STL開發溫習總結 2.C++儲存技術

 C++ STL開發溫習與總結(二):2.C++儲存技術       使用了多年C++,沒有系統的溫習總結過,所以準備溫習《C++STL程式設計師開發指南》,本系列篇章將會是溫習總結該書本概念和技術。       本節討論的C++儲存技術保局哦C++儲存型別,C++儲存

Android熱補丁動態修復技術實戰!CLASS_ISPREVERIFIED問題!熱修復技術

在apk安裝的時候,虛擬機器會將dex優化成odex後才拿去執行。在這個過程中會對所有class一個校驗。 校驗方式:假設A該類在它的static方法,private方法,建構函式,override方法中直接引用到B類。如果A類和B類在同一個dex中,那麼A類就會被打上CLASS_ISPREVERIFIED標

Python數據分析展示數據分析展示

轉載 數組 .net pan die oat 文件存取 format 默認 數據的CSV文件存取: 1 np.savetxt(frame, array, fmt=‘%.18e‘, delimiter=None) 2 ? frame : 文件、字符串或產生器,可以是.gz或

Spring核心探索總結Spring容器初始化原始碼探索

Spring容器概述 容器是spring的核心,Spring容器使用DI管理構成應用的元件,它會建立相互協作的元件之間的關聯,負責建立物件,裝配它們,配置它們並管理它們的生命週期,從生存到死亡(在這裡,可能就是new 到 finalize())。 Sprin