Как вручную записать WAV-файл, используя данные PCM? - PullRequest
2 голосов
/ 24 февраля 2020

Итак, я следовал подобным урокам, чтобы попытаться создать файл .wav. Тем не менее, я не могу заставить его работать, потому что файл WAV будет открываться должным образом, но будет указан как 0 секунд и ничего не воспроизводить.

http://www.topherlee.com/software/pcm-tut-wavformat.html

http://soundfile.sapp.org/doc/WaveFormat/

Код (это плохо, потому что это всего лишь тест, чтобы попытаться заставить его работать):

using System;
using System.IO;
using System.Linq;
using System.Text;

namespace Namespace
{
    class Program
    {
        static void Main()
        {
            StringBuilder SB = new StringBuilder();
            for (int e = 0; e < 200000; e++)
            {
                SB.Append(" ff");
            }

            int Size = SB.Length / 3;
            StringBuilder SBHexSize = new StringBuilder(Convert.ToString(Size, 16));
            while (SBHexSize.Length < 8)
            {
                SBHexSize.Append("0");
            }
            string HexSize = SBHexSize.ToString();

            const string RIFF = "52 49 46 46";
            const string RestOfHeader = "57 41 56 45 66 6d 74 20 10 00 00 00 01 00 02 00 22 56 00 00 88 58 01 00 04 00 10 00 64 61 74 61 00 08 00 00";
            //Console.WriteLine($"{RIFF} {HexSize[6..8]} {HexSize[4..6]} {HexSize[2..4]} {HexSize[..2]} {RestOfHeader}{SB.ToString()}");
            //System.Threading.Thread.Sleep(-1);
            //ByteArray bytes = new ByteArray($"{RIFF} {HexSize[6..8]} {HexSize[4..6]} {HexSize[2..4]} {HexSize[..2]} {RestOfHeader}{SB.ToString()}");
            ByteArray bytes = new ByteArray($"{RIFF} FF FF FF FF {RestOfHeader}{SB.ToString()}");
            bytes.Write();
        }
    }

    class ByteArray
    {
        private byte[] array;

        public ByteArray(string hex)
        {
            array = Enumerable.Range(0, hex.Length)
                             .Where(x => x % 3 == 0)
                             .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                             .ToArray();
        }

        public void Write()
        {
            File.WriteAllBytes(@"C:\Users\name\source\repos\MusicCreator\MusicCreator\musictest.wav", array);
        }
    }
}

Это проблема с кодом вроде как я пытаюсь записать байты, или это что-то с самими байтами? Если у вас есть идеи, пожалуйста, дайте мне знать. Я очень новичок в цифровом аудио, поэтому любые отзывы приветствуются!

1 Ответ

0 голосов
/ 24 февраля 2020

Заголовок файла WAV должен содержать длину данных:

37-40   "data"  "data" chunk header. Marks the beginning of the data section.
41-44   File size (data)    Size of the data section.

У вас есть жестко заданная длина: 64 61 74 61 ("данные") 00 08 00 00 (длина)

Но вы должны записывать здесь длину данных, например, 30 D4 00 00

. Поэтому в примере, который вы связали, есть раздел "финализировать", где они записывают длину данных обратно в заголовок.

...