我正在寻找半天的好答案,但我是这方面的初学者,我将不胜感激。
我想要实现的是在ffmpeg或vlc中流式传输音频(mp3文件),并通过udp / rtp在Android设备上接收它。
这是我能够弄清楚自己的问题:
1)有Android类AudioStream和RTPStream。我不知道的是如何使用它。例如,我通过ffmpeg创建了一个流:ffmpeg -re -i mymp3.mp3 -ar 8000 -acodec copy -f rtp rtp://192.168.0.100:5533
,其中192.168.0.100
是我的Android设备的地址。现在我想收到它并播放它。
我在Stack上找到了类似的东西:
AudioStream audioStream;
AudioGroup audioGroup;
AudioCodec codec = AudioCodec.PCMU;
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitNetwork().build();
StrictMode.setThreadPolicy(policy);
AudioManager audio = (AudioManager)getSystemService(AUDIO_SERVICE);
audio.setMode(AudioManager.MODE_IN_COMMUNICATION);
audioGroup = new AudioGroup();
audioGroup.setMode(AudioGroup.MODE_NORMAL);
InetAddress inetAddress;
try {
inetAddress = InetAddress.getByName("163.11.62.208");
audioStream = new AudioStream(inetAddress);
audioStream.setMode(RtpStream.MODE_RECEIVE_ONLY);
audioStream.setCodec(codec);
InetAddress inetAddressRemote = InetAddress.getByName("163.11.169.206");
audioStream.associate(inetAddressRemote, 5004);
audioStream.join(audioGroup);
}
第一个inetAddress 163.11.62.208
是什么,第二个163.11.169.206
是什么? Shoudln我只是给一个流的地址?
2)我可以只提交PCMU格式的流吗?我可以播放mp3文件吗?
3)甚至可能吗?
答案 0 :(得分:3)
我已经将Cisco Jabber与我们的服务器和Android集成,并进行了类似的设置。
audioStream = new AudioStream(inetAddress)
inetAddress(163.11.62.208)是该android设备的本地网络地址。 我们使用以下内容获得它:
WifiManager wifiMgr = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiMgr.getConnectionInfo();
int ip = wifiInfo.getIpAddress();
String ipAddress = Formatter.formatIpAddress(ip);
Log.w(TAG, "ipAddress=" + ipAddress);
inetAddress = InetAddress.getByName(ipAddress);
可能有其他方式,我不是Android开发者。
audioStream.associate(inetAddressRemote, 5004)
inetAddressRemote(163.11.169.206)是您将向其发送音频的服务器的远程地址。
5004
是在Android和服务器端发送和接收音频的端口。
现在有一个问题 - 确保您从服务器向Android发送音频的本地端口也是5004.例如测试音频流:
ffmpeg -re -f lavfi -i aevalsrc="sin(400*2*PI*t)" -map 0:0 -c:a pcm_mulaw -b:a 64k -ar 8000 -f rtp rtp://163.11.62.208:5004?localrtpport=5004