2011-05-23 41 views
9

Soy muy nuevo en material de audio o mp3, estaba buscando una manera de tener una característica para dividir un archivo mp3 en C#, asp.net. Después de buscar en Google por 3 días sin mucha ayuda, espero que alguien aquí me indique la dirección correcta.NAudio para dividir archivos mp3

¿Puedo usar NAudio para lograr esto? ¿Hay algún código de muestra para eso? Gracias por adelantado.

+0

posible duplicado de [Recorte un MP3 Programatically] (http://stackoverflow.com/questions/551074/trim-an-mp3-programatically) – ErikE

Respuesta

8

Mi solución final para dividir archivos mp3 en C# es usar NAudio. Aquí es un script de ejemplo para los que, espero que ayude a alguien en la comunidad:

string strMP3Folder = "<YOUR FOLDER PATH>"; 
string strMP3SourceFilename = "<YOUR SOURCE MP3 FILENAMe>"; 
string strMP3OutputFilename = "<YOUR OUTPUT MP3 FILENAME>"; 

using (Mp3FileReader reader = new Mp3FileReader(strMP3Folder + strMP3SourceFilename)) 
{ 
    int count = 1; 
    Mp3Frame mp3Frame = reader.ReadNextFrame(); 
    System.IO.FileStream _fs = new System.IO.FileStream(strMP3Folder + strMP3OutputFilename, System.IO.FileMode.Create, System.IO.FileAccess.Write); 

    while (mp3Frame != null) 
    { 
     if (count > 500) //retrieve a sample of 500 frames 
      return; 

     _fs.Write(mp3Frame.RawData, 0, mp3Frame.RawData.Length); 
     count = count + 1; 
     mp3Frame = reader.ReadNextFrame(); 
    } 

    _fs.Close(); 
} 

Gracias a la sugerencia de Mark Heath para esto.

El espacio de nombres requerido es NAudio.Wave.

+1

¿Por qué estás cerrando y volviendo a abrir Filestream para cada fotograma? Esto no funcionará bien. – BrokenGlass

+0

Fue solo para una prueba rápida en el NAudio. Tienes razón, no debería seguir abriendo y cerrando la secuencia de archivos, editado el código. –

2

estos serían útiles Alvas Audio (comercial) y ffmpeg

+0

Gracias por el comentario, primero le daré una oportunidad a NAudio. :) –

+0

-1 - Alvas Audio es comercial. –

+0

lo siento. acaba de editar –

10

un archivo MP3 se compone de una secuencia de fotogramas de MP3 (más a menudo las etiquetas ID3 en el comienzo y el final). La forma más limpia de dividir un archivo MP3 es copiar una cierta cantidad de fotogramas en un archivo nuevo (y opcionalmente también traer las etiquetas ID3 si es importante).

La clase MP3FileReader de NAudio tiene un método ReadNextFrame. Esto devuelve una clase MP3Frame, que contiene los datos sin procesar como una matriz de bytes en la propiedad RawData. También incluye una propiedad SampleCount que puede usar para medir con precisión la duración de cada fotograma MP3.

+0

Gracias por el comentario, voy a probar sobre esto .. Volveré a actualizar mis hallazgos más adelante. ¡Gracias! –

+0

¿Cuántos milisegundos tiene cada mp3Frame? ¿Hay alguna fórmula o algo que pueda usar para obtener la longitud de cada mp3frame en milisegundos? – SolidSnake

+0

@ ermac2014 usa la frecuencia de muestreo. Si conoce muestras por segundo y conoce la cantidad de muestras, divida el número de muestras por la frecuencia de muestreo para obtener la duración. –

4

Las respuestas anteriores me ayudaron a comenzar. NAudio es el camino a seguir.

Para mi PodcastTool Necesitaba dividir podcasts en intervalos de 2 minutos para hacer que buscar un lugar específico fuera más rápido.

Aquí está el código para dividir un mp3 cada N segundos:

var mp3Path = @"C:\Users\ronnie\Desktop\mp3\dotnetrocks_0717_alan_dahl_imagethink.mp3"; 
    int splitLength = 120; // seconds 

    var mp3Dir = Path.GetDirectoryName(mp3Path); 
    var mp3File = Path.GetFileName(mp3Path); 
    var splitDir = Path.Combine(mp3Dir,Path.GetFileNameWithoutExtension(mp3Path)); 
    Directory.CreateDirectory(splitDir); 

    int splitI = 0; 
    int secsOffset = 0; 

    using (var reader = new Mp3FileReader(mp3Path)) 
    { 
     FileStream writer = null;  
     Action createWriter = new Action(() => { 
      writer = File.Create(Path.Combine(splitDir,Path.ChangeExtension(mp3File,(++splitI).ToString("D4") + ".mp3"))); 
     }); 

     Mp3Frame frame; 
     while ((frame = reader.ReadNextFrame()) != null) 
     {   
      if (writer == null) createWriter(); 

      if ((int)reader.CurrentTime.TotalSeconds - secsOffset >= splitLength) 
      { 
       // time for a new file 
       writer.Dispose(); 
       createWriter(); 
       secsOffset = (int)reader.CurrentTime.TotalSeconds;    
      } 

      writer.Write(frame.RawData, 0, frame.RawData.Length); 
     } 

     if(writer != null) writer.Dispose(); 
    } 
+1

No debería ser muy difícil modificar mi muestra para lograr eso. ¿Lo has probado? Podría intentarlo en algún momento, pero no en este momento. ¿Cuál es la unidad de medida para comenzar y detener los puntos de compensación? –

+0

Lo he estado intentando todavía no lo tengo. Mi primera vez con NAudio. Las medidas serían un intervalo de tiempo. Comience y pare. así que, básicamente, un comienzo de recorte y un final de corte. –

+1

Aquí tienes: http://stackoverflow.com/a/14169073/64334 –

Cuestiones relacionadas