gpt4 book ai didi

c# - 将 MP3 从 C# 服务器流式传输到 Android

转载 作者:行者123 更新时间:2023-12-01 14:48:25 25 4
gpt4 key购买 nike

我已经设置了一台 C# 服务器,目前通过 TCP 提供一个测试 mp3 文件。发送文件的代码如下

    public void RunStreamer()
{
log.MakeLog("Starting streamer");
Run = true;
//Need to look into how to thread this to not block the main window
TcpListener listen = new TcpListener(localAddr, _port);
listen.Start(); //startlistening to client requests

//blocks until a client request comes in
for (; ; )
{
Socket socket = listen.AcceptSocket();
if (socket.Connected)
{

SendFileToClient(socket);
socket.Disconnect(false);
}
}

}

void SendFileToClient(Socket socket)
{
log.MakeLog("Connection made");
NetworkStream netStream = new NetworkStream(socket);
StreamWriter writer = new StreamWriter(netStream);
//Todo - set specfified file - this file just for test
FileStream filestream = File.Open(@"C:\MusicTest\Test.mp3", FileMode.Open, FileAccess.Read, FileShare.Read);
filestream.CopyTo(netStream);
netStream.Flush();
netStream.Close();


}

在我的测试 Android 设置中,我通过单击按钮来调用服务器:

    public void btngo_click(View v)
{
final TcpClient client = new TcpClient();

new Thread(new Runnable(){
@Override
public void run() {
final MediaPlayer mediaPlayer = new MediaPlayer();
client.GetStream();
runOnUiThread(new Runnable(){
public void run()
{
int length = client.GetLength();
if(length > 0)
{
byte[] result = client.GetResult();
try {
// create temp file that will hold byte array
File tempMp3 = File.createTempFile("test", "mp3", getCacheDir());
tempMp3.deleteOnExit();
FileOutputStream fos = new FileOutputStream(tempMp3);
fos.write(result);
fos.close();


mediaPlayer.reset();

FileInputStream fis = new FileInputStream(tempMp3);
mediaPlayer.setDataSource(fis.getFD());

mediaPlayer.prepare();
mediaPlayer.start();
} catch (IOException ex) {
String s = ex.toString();
ex.printStackTrace();
}

}
}
});

}
}).start();

}

流在 TcpClient 类中接收,如下所示:

public class TcpClient {

public final static String SERVER_ADDRESS = "127.0.0.1";
public final static int SERVER_PORT = 65000;
public String TotalResult;
public int Length;
byte[] result = new byte[21000000];


public TcpClient()
{



}

public int GetLength()
{
return Length;

}

public byte[] GetResult()
{

return result;

}

public void GetStream()
{
try
{

final Socket socket = new Socket("192.0.0.5", 85000);
final InputStream input = new BufferedInputStream(socket.getInputStream());
ByteArrayOutputStream buffer = new ByteArrayOutputStream();

int nread;


while((nread = input.read(result, 0, result.length)) != -1)
{

buffer.write(result, 0, nread);
}
buffer.flush();

//input.read(result);
Length = result.length;


input.close();
socket.close();

} catch (UnknownHostException e) {
String exc = e.getMessage();
e.printStackTrace();
} catch (IOException e) {
String exc2 = e.getMessage();
e.printStackTrace();
}

}

}

对这里的所有代码表示歉意,这是我的问题。

我正在接收流。将创建临时 MP3 文件并启动媒体播放器。然后我只得到测试 MP3 文件的一小段(这是一首完整的歌曲)。它还会跳动一点。长度不一样,每次播放的歌曲部分也不一样。

我如何以有序的方式接收完整文件,以便它可以提供歌曲的完整播放。

我试图解决这个问题,并且有一个想法,我需要告诉我的客户它应该怀疑什么文件大小,然后执行一些循环,直到收到所有数据,尽管我不知道如何成功实现这一点是正确的解决方案。

任何有关我出错的地方或我可以采取哪些措施来纠正的指示将不胜感激!!

最佳答案

由于没有收到任何答案,我又进行了进一步的挖掘。有两件事是错误的:首先,我没有将流的大小作为 int 大小的 header 包含在我的流中。我知道对于较小的文件,这不会成为问题,但随着文件大小的增长,有必要确保已收到整个流。

这又引发了另一个问题。我以 c# 形式的 byte[] 形式发送的 int 在 Java 中没有返回正确的值。结果 Java 使用 sbytes -128 到 127 范围而不是 byte。然后,这涉及到一些转换为 int 的代码。然后我可以指示读者以预期流的实际大小读取 byte[] 缓冲区中的参数 = 瞧,它起作用了。 MP3 文件已接收并且播放正常。

关于c# - 将 MP3 从 C# 服务器流式传输到 Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15146799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com