C #: объединить 2 файла MP3 - PullRequest
       37

C #: объединить 2 файла MP3

6 голосов
/ 21 сентября 2009

Я попытался объединить 2 файла MP3, используя код ниже. Я получил новый файл, который я могу воспроизвести в первой половине (завершить первый файл), но вторая половина молчит Длина нового файла была правильной. Что я делаю не так?

List<Byte[]> files = new List<byte[]>();
var tempfile = File.ReadAllBytes(Path.Combine(path, "1.mp3"));
files.Add(tempfile);
tempfile = File.ReadAllBytes(Path.Combine(path, "2.mp3"));
files.Add(tempfile);
Byte[] a=new Byte[files[0].Length+files[1].Length];
Array.Copy(files[0], a, files[0].Length);
Array.Copy(files[1], a, files[1].Length);

File.WriteAllBytes(Path.Combine(path, "3.mp3") , a);

Ответы [ 6 ]

11 голосов
/ 21 сентября 2009

Готов поспорить, вы слышите только вторую песню. (и что оба файла имеют одинаковую длину или первый файл короче)

Вы копируете данные второй песни поверх первой. А данные MP3 передаются в потоковом режиме, так что вы можете просто добавлять файлы друг к другу, не беспокоясь о битрейтах (хотя они могут сбиваться), битрейт должен автоматически регулироваться.

Подробно о Заголовки кадров MP3

... попробуйте это ...

Array.Copy(files[0], 0, a, 0, files[0].Length);
Array.Copy(files[1], 0, a, files[0].Length, files[1].Length);

... или еще лучше ...

using (var fs = File.OpenWrite(Path.Combine(path, "3.mp3")))
{
    var buffer = File.ReadAllBytes(Path.Combine(path, "1.mp3"));
    fs.Write(buffer, 0, buffer.Length);
    buffer = File.ReadAllBytes(Path.Combine(path, "2.mp3"));
    fs.Write(buffer, 0, buffer.Length);
    fs.Flush();
}
4 голосов
/ 18 января 2015

Simple:

public static void Combine(string[] mp3Files, string mp3OuputFile)
{
    using (var w = new  BinaryWriter(File.Create(mp3OuputFile)))
    {
        new List<string>(mp3Files).ForEach(f => w.Write(File.ReadAllBytes(f)));
    }
}
3 голосов
/ 08 ноября 2010

Вот как вы можете объединить файлы 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);
        }
    }
}

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

2 голосов
/ 21 сентября 2009

Каждый файл MP3 имеет заголовок в начале файла, содержащего метаданные песни. По крайней мере, вам придется удалить это во втором файле.

Вот предыдущий вопрос переполнения стека, Как мне объединить / объединить файлы MP3 с C #? .

Вот еще одна ссылка на Чтение информации тегов MP3 (ID3v1 и ID3v2) , это может помочь вам удалить ее.

1 голос
/ 28 ноября 2015

Как все знают, файлы Mp3 - это всего лишь несколько кадров , и вы можете объединить потоки вместе:

public static void Concatenate(params string[] mp3filenames)
{
    Stream w = File.OpenWrite("D:\\out.mp3");

    foreach (string filename in mp3filenames)
        File.OpenRead(filename).CopyTo(w);    

    w.Flush();
    w.Close();
}

и слышит использование:

Concatenate("D:\\1.mp3", "D:\\2.mp3");
1 голос
/ 21 сентября 2009

Этот вопрос задавался раньше здесь и здесь . Также см. чтение заголовков MP3 в C # , но вместо чтения заголовка вы просто хотите удалить его, объединить остальные, а затем создать новый заголовок для объединенного файла.

Редактировать : После дальнейшего чтения, по-видимому, не имеет значения, если вы просто объедините файлы без удаления тегов ID3. Но все равно кажется хорошей идеей сначала убрать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...