Получил кадр с частотой дискретизации 16000, в MP3 с частотой дискретизации 44100. Mp3filereader не поддерживает изменения частоты дискретизации
Привет, Марк
Я встречаюсь с проблемой для NAudio, когда я использовал приведенные ниже коды для MP3file,
Stream stream = Новый Поток памяти (байт);
var mp3Reader = новый Mp3FileReader(поток);
Mp3FileReader выдает исключение:
Got a frame at sample rate 16000, in an MP3 with sample rate 44100. Mp3FileReader does not support sample rate changes
Не могли бы вы сказать мне, где я делаю что-то не так? спасибо.
С наилучшими пожеланиями!
Джефф Цзян
Что я уже пробовал:
использование (wavestream reader = new Mp3FileReader(inputStream))
using (var temp = new LameMP3FileWriter(tempStream, reader.WaveFormat, LAMEPreset.СТАНДАРТ))
{
читатель.CopyTo(tempStream);
}
var mp3Reader = новый Mp3FileReader(tempStream);
Последний код показывает это сообщение об ошибке:
Got a frame at sample rate 16000, in an MP3 with sample rate 44100. Mp3FileReader does not support sample rate changes
Я видел эту статью"Как конвертировать между (большинством) аудиоформатами в .NET", но не нашел решения этой проблемы.
Я нахожу странную проблему:
var testStream = новый Mp3FileReader(inputStream);
var outStream = новый Mp3FileReader(testStream);
последний код покажет эту ошибку. почему?
Member 13383318
Кроме того, я вставил все свои коды для этой ошибки, надеюсь, ваши предложения.
Мое требование таково: "измените канал Как 1, битрейт как 32 Кбит / с и разделите промежуток времени mp3-файла на 2 минуты"
public Stream AudioStream(Stream inputStream, int channel, int bitRate, int spliteLength) { Stream fs = new MemoryStream(); Stream outputStream = new MemoryStream(); try { int rates = bitRate / 1024; int averageBytesPerSecond = bitRate / 8; Stream tempStream = new MemoryStream(); using (var waveStream = new Mp3FileReader(inputStream)) using (WaveFileWriter waveFileWriter = new WaveFileWriter(tempStream, WaveFormat.CreateCustomFormat(waveStream.WaveFormat.Encoding, waveStream.WaveFormat.SampleRate, channel, averageBytesPerSecond, waveStream.WaveFormat.BlockAlign, waveStream.WaveFormat.BitsPerSample))) //using (WaveFileWriter waveFileWriter = new WaveFileWriter(tempStream, waveStream.Mp3WaveFormat)) // I use above the code , show the same error { byte[] bytes = new byte[waveStream.Length]; waveStream.Read(bytes, 0, (int)waveStream.Length); waveFileWriter.Write(bytes, 0, bytes.Length); waveFileWriter.Flush(); fs = BytesToStream(bytes); } fs.Position = 0; using (var mp3 = new Mp3FileReader(fs)) //Got a frame at sample rate 16000, in an MP3 with sample rate 44100. Mp3FileReader does not support sample rate changes. { Mp3Frame frame; while ((frame = mp3.ReadNextFrame()) != null) { if ((int)mp3.CurrentTime.TotalSeconds <= spliteLength) { outputStream.Write(frame.RawData, 0, frame.RawData.Length); } } } } catch (Exception e) { string msg = e.Message; } return outputStream; }
Member 13383318
Мой адрес электронной почты :zefeng_jiang2000@163.com
дайте мне знать, если у вас есть какие-либо комментарии по этому вопросу. спасибо
Member 13383318
Я проверяю исходный код " Mp3FileReader. cs"
Я нашел проблему:
Вызовите функцию " ValidateFrameFormat(frame);"
когда проверялись все mp3frames один за другим, первый кадр и второй кадр были в порядке , но когда проверялся третий кадр, битрейт менялся на 16000, возвращалась эта ошибка. Я не понимал этого вопроса.
private void CreateTableOfContents() { try { // Just a guess at how many entries we'll need so the internal array need not resize very much // 400 bytes per frame is probably a good enough approximation. tableOfContents = new List<Mp3Index>((int)(mp3DataLength / 400)); Mp3Frame frame; do { var index = new Mp3Index(); index.FilePosition = mp3Stream.Position; index.SamplePosition = totalSamples; frame = ReadNextFrame(false); if (frame != null) { ValidateFrameFormat(frame); totalSamples += frame.SampleCount; index.SampleCount = frame.SampleCount; index.ByteCount = (int)(mp3Stream.Position - index.FilePosition); tableOfContents.Add(index); } } while (frame != null); } catch (EndOfStreamException) { // not necessarily a problem } }