2009-07-21 2 views
3

У меня есть библиотека разных слов/фраз, и для создания предложений в настоящее время я добавляю комбинацию этих фраз в список воспроизведения, чтобы сделать предложение. К сожалению, если пользователь работает с приложениями с интенсивным использованием процессора (большинство из моих пользователей), может быть отставание в несколько секунд от среднего предложения (между фразами).Как объединить/объединить файлы MP3 с C#?

Для борьбы с этим я думал о подходе, который объединит правильную комбинацию файлов MP3 на лету в соответствующую фразу, сохранит ее в каталоге% temp%, а затем воспроизведет этот 1 файл MP3, который должен преодолеть проблему, с которой я сталкиваюсь.

Что является самым простым способом сделать это в C#? Есть простой способ сделать это? Файлы довольно маленькие, по 3-4 секунды каждая, а предложение может состоять из 3-20-значных фраз.

ответ

1

Файлы MP3 состоят из «кадров», каждый из которых представляет короткий фрагмент (я думаю, около 25 мс) аудио.

Да, вы можете просто соединить их без проблем.

+0

Я буду в основном контролировать, какие mp3-файлы используются, будет ли когда-нибудь проблема, если бы использовались разные скорости передачи битов? – James

+0

Нет проблем, если ваш аудиоплеер может обрабатывать файлы VBR, потому что именно так работает VBR. – bart

+3

Это совершенно неверно. Из-за бит-резервуара вы не можете просто приклеивать рамы друг к другу. См. Раздел 4: http://lame.sourceforge.net/tech-FAQ.txt – Brad

0

Как MP3 - это сжатый источник звука, я полагаю, что вы не можете просто объединить их в один файл без предварительного декодирования каждого в первую волновую форму, в которую он будет играть. Это может быть довольно интенсивным. Возможно, вы можете обмануть, используя критический раздел при воспроизведении своей фразы, чтобы процессор не был украден у вас до тех пор, пока фраза не будет завершена. Это не обязательно играет хорошо с другими потоками, но может работать, если ваши фразы короткие.

+1

Это не правильно. Вы * можете * разделить/объединить поток MP3, но это нужно сделать очень осторожно из-за бит-бачка. См. Http://lame.sourceforge.net/tech-FAQ.txt – Brad

-1

На простой вариант заключается в оболочки в командной строке:

copy /b *.mp3 c:\new.mp3 

Лучше бы объединить потоки. Вот был дан ответ здесь: What would be the fastest way to concatenate three files in C#?

+0

Конкатенация mp3-файлов привела бы к некоторому выходу, учитывая, что в каждом файле могут быть заголовки и теги –

5

вот как вы можете сцепить MP3 файлы с помощью NAudio:

public static void Combine(string[] inputFiles, Stream output) 
{ 
    foreach (string file in inputFiles) 
    { 
     Mp3FileReader reader = new Mp3FileReader(file); 
     if ((output.Position == 0) && (reader.Id3v2Tag != null)) 
     { 
      output.Write(reader.Id3v2Tag.RawData, 0, reader.Id3v2Tag.RawData.Length); 
     } 
     Mp3Frame frame; 
     while ((frame = reader.ReadNextFrame()) != null) 
     { 
      output.Write(frame.RawData, 0, frame.RawData.Length); 
     } 
    } 
} 

см here для получения дополнительной информации

+0

, где находится знак остатка? как вы сохраняете поток в качестве нового mp3-файла? скажите, пожалуйста, как вы называете эту функцию Combine, где раньше? – MonsterMMORPG