Я работаю над ксамарином.И я разработал приложение, в котором я записываю голос пользователя.Теперь я хочу, чтобы пользователь мог снова вставить его в уже записанный файл.Я имею в виду, что если у пользователя есть запись звука в течение 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();