ASP NET MVC 和 HTML5 音频 - 文件未播放

ASP NET MVC and HTML5 audio - file not playing

我正在尝试创建一个 table 包含音频文件,当用户单击播放按钮时应该开始播放。这是我到目前为止尝试过的:

控制器:

    [HttpGet]
    public ActionResult PlayFile(string FilePath)
    {
        WebClient WC = new WebClient();
        WC.Credentials = new System.Net.NetworkCredential("username", "password");
        byte[] buff = WC.DownloadData(FilePath);
        var SplitFileName = FilePath.Split('\');
        string FileName = "Recording_" + SplitFileName[SplitFileName.Count() - 1];

        Response.AddHeader("Content-Disposition", "inline; filename=" + FileName);
        MemoryStream stream = new MemoryStream(buff);
        return new FileStreamResult(stream, "audio/wav");

        //I have also tried:
        //return File(buff, "audio/wav");
    }

音频标签如下所示:

<td>
  <audio controls preload='none'>
     <source src='/Components/PlayFile?FilePath=[filename.wav]' type='audio/wav'>
  </audio>
</td>

当运行站点在Chrome本地时,所有文件的长度都是0:00,您可以点击播放按钮一次但文件不播放。单击播放按钮后,将无法再次单击它。但是可以下载文件 并播放它。当 运行 在 Firefox 本地站点时,文件的长度也为 0:00,当您单击播放按钮时,控件会消失。也可以在 Firefox 中下载该文件。有谁知道这可能是什么原因造成的?

你能试试下面的方法吗?因为它对我有用。

public FileResult PlayFile(string FilePath)
{
    return new FilePathResult(FilePath, "audio/wav");
}

此外,如果有帮助,请尝试将 "audio/wav" 更改为 "audio/mp3"。

问题是音频文件是GSM格式,需要转换成PCM格式。此代码有效:

[HttpGet]
public ActionResult PlayFile(string FilePath)
{
    WebClient WC = new WebClient();
    WC.Credentials = new System.Net.NetworkCredential("username", "password");
    byte[] buff = WC.DownloadData(FilePath);
    var SplitFileName = FilePath.Split('\');
    string FileName = "Recording_" + SplitFileName[SplitFileName.Count() - 1];

    MemoryStream ms = new MemoryStream();
    ms.Write(buff, 0, buff.Length);
    ms.Seek(0, SeekOrigin.Begin);

    MemoryStream outputStream = new MemoryStream();

    using (NAudio.Wave.WaveFileReader reader = new WaveFileReader(ms))
    using (NAudio.Wave.WaveStream waveStream = NAudio.Wave.WaveFormatConversionStream.CreatePcmStream(reader))
    using (NAudio.Wave.WaveFileWriter waveFileWriter = new WaveFileWriter(outputStream, waveStream.WaveFormat))
    {
            byte[] bytes = new byte[waveStream.Length];
            waveStream.Position = 0;
            waveStream.Read(bytes, 0, (int)waveStream.Length);
            waveFileWriter.Write(bytes, 0, bytes.Length);
            waveFileWriter.Flush();
    }

    return File(outputStream.ToArray(), "audio/wav");
}