Dr.*_*len 1 runtime-error audio-streaming c#-4.0 asp.net-web-api2
我在 asp.net webapi 中使用以下代码进行音频流,以允许 Android 应用程序调用 api 并播放歌曲。
public class AudioController : ApiController
{
ITrackRepository _TrackRepo = new TrackRepository();
public AudioController()
{
}
public HttpResponseMessage Get(int id)
{
var trackd = _TrackRepo.GetPlayfilepath(id);
string filename = System.Web.HttpContext.Current.Server.MapPath(trackd.Select(x => x.FilePath).FirstOrDefault());
var audio = new AudioStream(filename);
string fileExtension = System.IO.Path.GetExtension(filename);
var response = Request.CreateResponse();
response.Content = new PushStreamContent(audio.WriteToStream, new MediaTypeHeaderValue("audio/" + fileExtension));
return response;
}
}
public class AudioStream
{
private readonly string _filename;
public AudioStream(string filename)
{
_filename = filename;
}
public async void WriteToStream(Stream outputStream, HttpContent content, TransportContext context)
{
try
{
var buffer = new byte[65536];
using (var video = File.Open(_filename, FileMode.Open, FileAccess.Read))
{
var length = (int)video.Length;
var bytesRead = 1;
while (length > 0 && bytesRead > 0)
{
bytesRead = video.Read(buffer, 0, Math.Min(length, buffer.Length));
await outputStream.WriteAsync(buffer, 0, bytesRead);
length -= bytesRead;
}
}
}
catch (HttpException ex)
{
return;
}
finally
{
outputStream.Close();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我能够播放歌曲,我用 vlc(流)测试了它,它工作正常,问题是当我尝试在另一个播放器中并行播放同一首歌曲时,它给了我以下错误
该进程无法访问该文件,因为该文件正在被另一个进程使用。
我完全理解错误,但我无法找到任何令人满意的解决方案。
一种解决方案是在播放/流媒体之前创建歌曲的副本并在完成后将其删除,但我认为这不是一个好的解决方案。
请建议。
我目前不在装有 Visual Studio 的计算机上,但请查看 File.Open 的此重载尝试更改此行:
using (var video = File.Open(_filename, FileMode.Open, FileAccess.Read))
Run Code Online (Sandbox Code Playgroud)
到
using (var video = File.Open(_filename, FileMode.Open, FileAccess.Read, FileShare.Read))
Run Code Online (Sandbox Code Playgroud)
看看是否有帮助。
| 归档时间: |
|
| 查看次数: |
622 次 |
| 最近记录: |