如何使用ContentPushStream在C#中播放大块音频?

时间:2019-01-28 13:00:39

标签: c# html5 audio stream audio-player

我在属于视频文件的内存中有一个字节流。

请注意,字节流并不代表整个视频文件,而是我当时可用的字节形式的视频文件的一部分。 我希望能够在视频播放器上播放此块,或者如果可以的话,将其流式传输。但是,由于我从不同的服务器接收视频的来源,所以我想自己控制流的流。

我们尝试了以下示例:

https://www.codeproject.com/Articles/820146/HTTP-Partial-Content-In-ASP-NET-Web-API-Video

就我而言,文件的第一块下载并播放了音频。加载下一个块后,即使文件已更新,也不会在播放器中更新。它需要合并块并在播放器中更新文件。请在此处找到代码段:

  [
      {"customer_id":"30","product_id":"10","unit_id":"2","quantity":"1","price":"2700","total_price":"2700"},
      {"customer_id":"30","product_id":"43","unit_id":"1","quantity":"5","price":"7","total_price":"35"}
    ]

1 个答案:

答案 0 :(得分:3)

您需要考虑所有文件的大小来重新创建WAVE文件头,然后附加音频数据,如下所示:

int item = 1;

var inputWaveFiles = new List<WaveFile>();

while (File.Exists($@"D:\test\pp{item}.wav"))
{
    var waveFile = WaveFile.ReadWaveFile($@"D:\test\pp{item}.wav");
    inputWaveFiles.Add(waveFile);
    item++;
}

WaveFile.Merge(inputWaveFiles, @"D:\test\output.wav");

public class WaveFile
{
    public string Path { get; set; }
    public int Length { get; set; }
    public short Channels { get; set; }
    public int SampleRate { get; set; }
    public int DataLength { get; set; }
    public short BitsPerSample { get; set; }

    private void WriteHeader(string filename)
    {
        using (var file = new FileStream(filename, FileMode.Create, FileAccess.Write))
        {
            using (var writer = new BinaryWriter(file))
            {
                file.Position = 0;
                writer.Write(new char[4] { 'R', 'I', 'F', 'F' });

                writer.Write(Length);

                writer.Write(new char[8] { 'W', 'A', 'V', 'E', 'f', 'm', 't', ' ' });

                writer.Write((int)16);

                writer.Write((short)1);
                writer.Write(Channels);

                writer.Write(SampleRate);

                writer.Write((int)(SampleRate * ((BitsPerSample * Channels) / 8)));

                writer.Write((short)((BitsPerSample * Channels) / 8));

                writer.Write(BitsPerSample);

                writer.Write(new char[4] { 'd', 'a', 't', 'a' });
                writer.Write(DataLength);
            }
        }
    }

    public static WaveFile ReadWaveFile(string filename)
    {
        var waveFile = new WaveFile();
        waveFile.Path = filename;

        using (var file = new FileStream(filename, FileMode.Open, FileAccess.Read))
        {
            using (var reader = new BinaryReader(file))
            {
                waveFile.Length = (int)file.Length - 8;
                file.Position = 22;
                waveFile.Channels = reader.ReadInt16();
                file.Position = 24;
                waveFile.SampleRate = reader.ReadInt32();
                file.Position = 34;
                waveFile.BitsPerSample = reader.ReadInt16();
                waveFile.DataLength = (int)file.Length - 44;
            }
        }
        return waveFile;
    }

    public static void Merge(List<WaveFile> waveFiles, string outputFilename)
    {
        var outputWave = new WaveFile();

        foreach(var waveFile in waveFiles)
        {
            outputWave.DataLength += waveFile.DataLength;
            outputWave.Length += waveFile.Length;
        }

        // Generate file with header (I just copy the sample rate etc.. from the first sound file)
        outputWave.BitsPerSample = waveFiles[0].BitsPerSample;
        outputWave.Channels = waveFiles[0].Channels;
        outputWave.SampleRate = waveFiles[0].SampleRate;
        outputWave.WriteHeader(outputFilename);

        // Append data
        foreach (var waveFile in waveFiles)
        {
            // Read wave file
            using (var fileReader = new FileStream(waveFile.Path, FileMode.Open, FileAccess.Read))
            {
                var inputData = new byte[fileReader.Length - 44];
                fileReader.Position = 44;
                fileReader.Read(inputData, 0, inputData.Length);

                // Write wave file
                using (var fileWriter = new FileStream(outputFilename, FileMode.Append, FileAccess.Write))
                {
                    using (var writer = new BinaryWriter(fileWriter))
                    {
                        writer.Write(inputData);
                    }
                }
            }
        }
    }
}

参考

http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html

https://www.codeproject.com/Articles/15187/Concatenating-Wave-Files-Using-C-2005