示例#1
0
        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";
            }
        }
示例#2
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";
            }
        }
示例#3
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);
        }