#c# #android #tcpclient #audio-streaming #exoplayer
#c# #Android #tcpclient #потоковое аудио #exoplayer
Вопрос:
Моя цель — потоковая передача выходного звука моего компьютера на мой Android-смартфон. Что у меня есть? Я могу получить выходной звук своего компьютера и могу выполнить сброс в файл wav. На клиенте Android я могу воспроизводить потоки интернет-радио или WAV-файл, хранящиеся на удаленных серверах, по их URL-адресам.
Перед потоковой передачей выходного звука моего компьютера я хотел передать wav-файл, который хранится на моем компьютере, на мой смартфон. Мой смартфон может подключаться к моему компьютеру, но после отправки нескольких пакетов клиент закрыл соединение, и я не слышал никакого звука.
Мне нужна помощь в том, как передавать wav-файл по моей локальной сети, чтобы клиент ExoPlayer мог воспроизводить его без проблем, и в конечном итоге я хочу транслировать свой выходной звук моего компьютера в прямом эфире. Я открыт для советов, ресурсов для чтения, фрагментов кода, блогов о том, как я могу это сделать, чего угодно. Заранее спасибо.
Сервер C #:
using System;
using System.Net;
using System.Net.Sockets;
using System.IO;
namespace TestApp
{
class Program
{
static void Main(string[] args)
{
IPAddress ipAd = IPAddress.Parse("192.168.1.127");
// use local m/c IP address, and
// use the same in the client
/* Initializes the Listener */
TcpListener myList=new TcpListener(ipAd,8001);
/* Start Listeneting at the specified port */
myList.Start();
Console.WriteLine("The server is running at port 8001...");
Console.WriteLine("The local End point is :"
myList.LocalEndpoint );
Console.WriteLine("Waiting for a connection.....");
Socket socket=myList.AcceptSocket();
Console.WriteLine("Connection accepted from " socket.RemoteEndPoint);
using (FileStream fsSource = new FileStream(
@"C:UserstncDesktopTestAppdump.wav",
FileMode.Open,
FileAccess.Read
)) {
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
long numBytesToRead = fsSource.Length;
while (numBytesToRead > 0)
{
int n = fsSource.Read(buffer, 0, bufferSize);
socket.Send(buffer, 0, n, 0);
// Break when the end of the file is reached.
if (n == 0)
break;
numBytesToRead -= bufferSize;
}
}
socket.Close();
myList.Stop();
}
}
}
Клиент Android: (Я не хотел помещать весь исходный файл, эта часть отвечает за воспроизведение потокового аудио)
private void initializePlayer() {
player = new SimpleExoPlayer.Builder(this).build();
playerView.setPlayer(player);
// Create a data source factory.
DataSource.Factory dataSourceFactory = new DefaultHttpDataSourceFactory();
// Create a progressive media source pointing to a stream uri.
MediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory)
.createMediaSource(MediaItem.fromUri("http://192.168.1.127:8001"));
// Create a player instance.
SimpleExoPlayer player = new SimpleExoPlayer.Builder(this).build();
// Set the media source to be played.
player.setMediaSource(mediaSource);
player.setPlayWhenReady(true);
// Prepare the player.
player.prepare();
}
Комментарии:
1. В Android ваш URL-адрес http, поэтому предполагается протокол http. Однако на ПК у вас есть необработанный поток tcp, без http.
2. @Evk, я не знал об этом, я попытался удалить «http: //», но теперь я получаю «java.net.MalformedURLException: нет протокола: 192.168.1.127: 8001». ExoPlayer пытается установить http-соединение, поэтому аудио должно передаваться по протоколу http.
3. Да, я не предлагаю менять часть Android, я бы предложил сменить сервер на http. Например, asp.net ядро. Он также работает как консольное приложение, поэтому такие тяжелые вещи, как nginx apache IIS, не нужны.
4. Спасибо, я попробую.