Как правильно отправлять аудио по моей локальной сети клиенту ExoPlayer

#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. Спасибо, я попробую.