Как вставить один аудио файл wav в другой файл wav? - PullRequest
0 голосов
/ 29 мая 2019

Я работаю над ксамарином.И я разработал приложение, в котором я записываю голос пользователя.Теперь я хочу, чтобы пользователь мог снова вставить его в уже записанный файл.Я имею в виду, что если у пользователя есть запись звука в течение 10 минут, и теперь он хочет вставить еще немного контента через 6 минут, он должен быть в состоянии сделать это.Я попробовал несколько примеров, но не добился успеха.Когда я несколько раз вставляю его работоспособность, а иногда вставленное содержимое после вставки портится.

Ниже приведен мой код, который я реализую.Это работает некоторое время, и некоторое время вставленный контент становится поврежденным.

     string[] files = new string[] { originalFile, insertFile };
        if (!files[0].Contains("tempfile_") && files.Length > 1)
        {
            if (File.Exists(files[0]))
            {
                string newPath = files[1].Replace("tempfile_1", 
     "tempfile_0");
                MoveExistingFile(files[0], newPath);
                files[0] = newPath;
            }
            else
            {
                files = files.Skip(1).ToArray();
            }
        }

        var duration = DependencyService.Get<IPlayService> 
    ().GetDuration(files[0]);
        var bufferTime = Math.Round(duration);

        FileStream originalStream = new FileStream(files[0], 
        FileMode.Open, FileAccess.Read);
        byte[] originalByteArray = new byte[originalStream.Length - 44];

        var perSecondLength = originalByteArray.Length / (int)bufferTime;
        var splitIndex = (perSecondLength * SplitSecond);

        var byteArray1 = new byte[(splitIndex)];
        var byteArray2 = new byte[originalByteArray.Length - splitIndex];

        FileStream insertStream = new FileStream(files[1], FileMode.Open, 
        FileAccess.Read);
        byte[] insertByteArray = new byte[insertStream.Length - 44];
        var byteArray3 = new byte[insertByteArray.Length];

        originalStream.Position = 44;
        originalStream.Read(byteArray1, 0, byteArray1.Length);
        originalStream.Position = byteArray1.Length;
        originalStream.Read(byteArray2, 0, byteArray2.Length);
        originalStream.Close();

        insertStream.Position = 44;
        insertStream.Read(byteArray3, 0, byteArray3.Length);
        insertStream.Close();

        WaveIO wa_IN = new WaveIO();
        WaveIO wa_out = new WaveIO();

        wa_out.DataLength = 0;
        wa_out.length = 0;

        //Gather header data
        foreach (string path in files)
        {
            wa_IN.WaveHeaderIN(@path);
            wa_out.DataLength += wa_IN.DataLength;
            wa_out.length += wa_IN.length;
        }

        //Recontruct new header
        wa_out.BitsPerSample = wa_IN.BitsPerSample;
        wa_out.channels = wa_IN.channels;
        wa_out.samplerate = wa_IN.samplerate;
        wa_out.WaveHeaderOUT(@outfile);

        FileStream fo = new FileStream(@outfile, FileMode.Append, 
        FileAccess.Write);
        BinaryWriter bw = new BinaryWriter(fo);
        bw.Write(byteArray1);
        bw.Write(byteArray3);
        bw.Write(byteArray2);
        bw.Close();
        fo.Close();
...