private void ConCatWaveFile(WaveFileReader sou, WaveFileReader des, long startPos, long endPos) { // lưu toàn bộ file đích vào temp WaveFileWriter temp = new WaveFileWriter("temp.wav", des.WaveFormat); // des.Filename = ""; des.Position = 0; var end = (int)des.Length; var buffer = new byte[1024]; while (des.Position < end) { var bytesRequired = (int)(end - des.Position); if (bytesRequired <= 0) { continue; } var bytesToRead = Math.Min(bytesRequired, buffer.Length); var bytesRead = des.Read(buffer, 0, bytesToRead); if (bytesRead > 0) { temp.Write(buffer, 0, bytesRead); } } // lưu 1 phần thêm file nguồn vào temp sou.Position = startPos; buffer = new byte[1024]; while (sou.Position < endPos) { int bytesRequired = (int)(endPos - sou.Position); if (bytesRequired > 0) { int bytesToRead = Math.Min(bytesRequired, buffer.Length); int bytesRead = sou.Read(buffer, 0, bytesToRead); if (bytesRead > 0) { temp.Write(buffer, 0, bytesRead); } } } temp.Dispose(); des.Dispose(); // xoá file đích if (des.Equals(cwvNumber1.WaveStream)) { CopyWaveFile(fileName1, temp.Filename); Wave = new WaveFileReader(fileName1); cwvNumber1.WaveStream = wave; cwvNumber1.Painting(); cwvNumber1.FitToScreen(); cwvNumber1.WaveStream.Position = 0; lbMax.Text = wave.TotalTime.Minutes.ToString() + ":" + wave.TotalTime.Seconds.ToString(); lbCur.Text = "0 : 0"; } else if (des.Equals(cwvNumber2.WaveStream)) { CopyWaveFile(fileName2, temp.Filename); Wave = new WaveFileReader(fileName2); cwvNumber2.WaveStream = wave; cwvNumber2.Painting(); cwvNumber2.FitToScreen(); cwvNumber2.WaveStream.Position = 0; lbMax.Text = wave.TotalTime.Minutes.ToString() + ":" + wave.TotalTime.Seconds.ToString(); lbCur.Text = "0 : 0"; } }
private void DeleteWaveFile(WaveFileReader sou, long startPos, long endPos) { // tạo file temp WaveFileWriter temp = new WaveFileWriter("temp.wav", sou.WaveFormat); sou.Position = 0; var buffer = new byte[1024]; // lưu từ đầu đến star while (sou.Position < startPos) { var bytesRequired = (int)(startPos - sou.Position); if (bytesRequired <= 0) { continue; } var bytesToRead = Math.Min(bytesRequired, buffer.Length); var bytesRead = sou.Read(buffer, 0, bytesToRead); if (bytesRead > 0) { temp.Write(buffer, 0, bytesRead); } } // lưu tiêp từ end đên hết sou.Position = endPos; while (sou.Position < sou.Length) { var bytesRequired = (int)(sou.Length - sou.Position); if (bytesRequired <= 0) { continue; } var bytesToRead = Math.Min(bytesRequired, buffer.Length); var bytesRead = sou.Read(buffer, 0, bytesToRead); if (bytesRead > 0) { temp.Write(buffer, 0, bytesRead); } } // ghi đè lại sou temp.Dispose(); sou.Dispose(); if (sou.Equals(cwvNumber1.WaveStream)) { CopyWaveFile(fileName1, temp.Filename); Wave = new WaveFileReader(fileName1); cwvNumber1.WaveStream = wave; cwvNumber1.Painting(); cwvNumber1.FitToScreen(); cwvNumber1.WaveStream.Position = 0; lbMax.Text = wave.TotalTime.Minutes.ToString() + ":" + wave.TotalTime.Seconds.ToString(); lbCur.Text = "0 : 0"; } else if (sou.Equals(cwvNumber2.WaveStream)) { CopyWaveFile(fileName2, temp.Filename); Wave = new WaveFileReader(fileName2); cwvNumber2.WaveStream = wave; cwvNumber2.Painting(); cwvNumber2.FitToScreen(); cwvNumber2.WaveStream.Position = 0; lbMax.Text = wave.TotalTime.Minutes.ToString() + ":" + wave.TotalTime.Seconds.ToString(); lbCur.Text = "0 : 0"; } }
private bool SaveAudioFiles(string baseDir, Func <int, string, bool> progressDelegate = null) { if (progressDelegate == null) { progressDelegate = (p, m) => false; } var count = AudioSegmentsByAudioFileDictionary.Keys.Count(key => AudioSegmentsByAudioFileDictionary[key].Any()); var index = 0; foreach (var audioFileName in AudioSegmentsByAudioFileDictionary.Keys.Where(key => AudioSegmentsByAudioFileDictionary[key].Any())) { if (progressDelegate((100 * index) / count, $"Saving audio file {audioFileName}")) { return(false); } index++; if (AudioSegmentsByAudioFileDictionary[audioFileName].Count == 1) { var audSeg = AudioSegmentsByAudioFileDictionary[audioFileName].First(); if (audSeg.AudioFileDuration < audSeg.ClipEnd) { throw new InvalidOperationException( $"Audio segment clip-end {audSeg.ClipEnd} is beyond the end of audio file {audSeg.AudioFile}"); } if (audSeg.AudioFileDuration < audSeg.ClipEnd.Add(AllowedFileEndAudio)) { File.Copy(Uri.UnescapeDataString(AudioSegmentsByAudioFileDictionary[audioFileName][0].AudioFile.LocalPath), Path.Combine(baseDir, audioFileName)); continue; } } Stream underlyingStream = new FileStream(Path.Combine(baseDir, audioFileName), FileMode.Create, FileAccess.ReadWrite); byte[] byteSuffix = null; try { Stream audioStream; WaveFormat waveFormat; var firstAudioPath = Uri.UnescapeDataString( AudioSegmentsByAudioFileDictionary[audioFileName].First().AudioFile.LocalPath); switch (AudioFileExtension) { case ".mp3": using (var mp3Fr = new Mp3FileReader(firstAudioPath)) { waveFormat = mp3Fr.WaveFormat; audioStream = new LameMP3FileWriter( underlyingStream, waveFormat, 8 * mp3Fr.Mp3WaveFormat.AverageBytesPerSecond / 1000); if (mp3Fr.Id3v2Tag != null) { underlyingStream.Write(mp3Fr.Id3v2Tag.RawData, 0, mp3Fr.Id3v2Tag.RawData.Length); } byteSuffix = mp3Fr.Id3v1Tag?.ToArray(); } break; case ".wav": waveFormat = new WaveFileReader(firstAudioPath).WaveFormat; audioStream = new WaveFileWriter(underlyingStream, new WaveFileReader(firstAudioPath).WaveFormat); break; default: throw new NotSupportedException($"Audio file extension {AudioFileExtension} is not supported"); } try { foreach (var segment in AudioSegmentsByAudioFileDictionary[audioFileName]) { using (var audioReader = GetAudioPcmStream(Uri.UnescapeDataString(segment.AudioFile.LocalPath))) { if (!waveFormat.Equals(audioReader.WaveFormat)) { throw new NotSupportedException( $"Audio file {segment.AudioFile} has different wave format from first audio file in segment"); } audioReader.Seek( (long)(segment.ClipBegin.TotalSeconds * audioReader.WaveFormat.SampleRate) * audioReader.WaveFormat.BlockAlign, SeekOrigin.Current); var bytesToRead = (long)(segment.Duration.TotalSeconds * audioReader.WaveFormat.SampleRate) * audioReader.WaveFormat.BlockAlign; var totalBytesRead = 0; var buf = new byte[10 * 1024]; while (totalBytesRead < bytesToRead) { var byteCount = (int)Math.Min(bytesToRead - totalBytesRead, buf.Length); var bytesRead = audioReader.Read(buf, 0, byteCount); totalBytesRead += bytesRead; audioStream.Write(buf, 0, bytesRead); } } } } finally { audioStream?.Flush(); } } finally { if (byteSuffix != null) { underlyingStream.Write(byteSuffix, 0, byteSuffix.Length); } underlyingStream.Close(); } } return(true); }