2011-03-28 18 views
6

Tengo un mezclador y guardo toda la secuencia en una matriz y luego la reproduzco nuevamente, ahora quiero guardar la mezcla como un MP3, he buscado cualquier forma de guardar la mezcla y el la respuesta es cargar los sonidos como byteArrays (sound.extract). Lo he logrado, pero realmente no sé cómo almacenar todos los sonidos en solo un ByteArray para guardarlo como MP3, obtuve este código solo por ejemplo, cargar 2 archivos de audio y almacenarlos en ByteArrays por separado, y reproducir cada sonido, ¿sabe algún cuerpo cómo almacenar los 2 byteArrays en solo uno?mezclando 2 sonidos de ByteArray

var mySound:Sound = new Sound(); 
var sourceSnd:Sound = new Sound(); 
var urlReq:URLRequest = new URLRequest("Track1.mp3"); 
sourceSnd.load(urlReq); 
sourceSnd.addEventListener(Event.COMPLETE, loaded); 
function loaded(event:Event):void 
{ 
    mySound.addEventListener(SampleDataEvent.SAMPLE_DATA, processSound); 
    //mySound.play(); 
} 

var mySound2:Sound = new Sound(); 
var sourceSnd2:Sound = new Sound(); 
var urlReq2:URLRequest = new URLRequest("Track2.mp3"); 
sourceSnd2.load(urlReq2); 
sourceSnd2.addEventListener(Event.COMPLETE, loaded2); 
function loaded2(event:Event):void 
{ 
    mySound2.addEventListener(SampleDataEvent.SAMPLE_DATA, processSound2); 
    mySound2.play(); 
    mySound.play(); 
} 



function processSound(event:SampleDataEvent):void 
{ 
     var bytes:ByteArray = new ByteArray(); 
     sourceSnd.extract(bytes, 8192); 
    event.data.writeBytes(bytes); 
} 

function processSound2(event:SampleDataEvent):void 
{ 
     var bytes:ByteArray = new ByteArray(); 
     sourceSnd2.extract(bytes, 8192); 
    event.data.writeBytes(bytes); 
} 
+0

Hola luosKrad, estoy teniendo los mismos desafíos que tuviste cuando hiciste esta pregunta, podrías compartir algo de luz. ¿Cuál fue su solución final y qué NO pudo resolver? ¡Gracias! – GV3

Respuesta

2

Si entiendo su pregunta correctamente, es necesario leer los datos de punto flotante para cada muestra, sumarlos, y escribir el valor resultante en su nuevo flujo de audio. Esto daría una mezcla estricta 50/50.

que no tienen acceso a una máquina con un compilador en este momento, pero debería ser algo como esto (suponiendo bytes1 y bytes2 son dos objetos ByteArray de igual longitud):

for (int bcnt = bytes1.size(); bcnt; bcnt--) 
    bytes1.setByte(bcnt - 1, bytes2.getByte(bcnt - 1) + bytes1.getByte(bcnt - 1)); 

Por supuesto, es probable que desee hacer algún tipo de control de desbordamiento, pero eso debería ser suficiente para ponerlo en el camino correcto.

+0

Sí, también creo que si sumara y escribiera debería funcionar, pero no estoy seguro de cómo hacer la suma de las matrices de bye cómo extraer los bytes de cada byteArray y cómo sumarlos, eso es lo que no hago entiendo – luosKrad

+0

@ user679463: he editado mi respuesta, vea arriba. – Unsigned

0

si tiene audio descomprimido, puede simplemente sumar los valores de los elementos individuales de la matriz en su ByteArray 's. Pero también debe manejar el límite para valores máximo/mínimo (sin desbordamientos). Es casi seguro que no hay nada equivalente para mezclar MP3, por lo que es posible que tenga que decodificar, mezclar y codificar en MP3 nuevamente.

7

estado trabajando en un sistema similar para un rato, voy a hacer mi mejor esfuerzo para darle una cierta dirección:

Su código de ejemplo, no es realmente de mezclado del MP3 - es la creación de 2 sonidos más para reproducir la carga de MP3 a través del SampleDataEvent. Lo que necesita hacer es crear solo un archivo de sonido de "salida" que mantenga/reproduzca el sonido mixto resultante. Puede guardar fácilmente esos datos a medida que ocurren y, posteriormente, guardar ese archivo como un nuevo WAV/MP3/lo que usted tiene.

verdadero/pseudo-código (es decir: perezoso):

output = new Sound(); 

output.addEventListener(SampleDataEvent.SAMPLE_DATA , mixAudio); 

song1 = new Sound/load the first mp3 

song2 = new Sound/load the second mp3 

// a byteArray for "recording" the output and subsequent file creation 
recordedBytes = new ByteArray(); 

o bien esperar a que ambos son de mp3 completamente cargada, o ejecutar un fotograma introducir para determinar cuando ambos sonidos ya no están protegiendo (Sound.isBuffering)

cuando la década de mp3 están listos:

// numbers to store some values 

var left1:Number; 
var right1:Number; 

var left2:Number; 
var right2:Number; 

// bytearrays for extracting and mixing 
var bytes1:ByteArray = new ByteArray(); 
var bytes2:ByteArray = new ByteArray(); 

// start the show 
output.play(); 


function mixAudio(e:SampleDataEvent):void{ 
    //set bytearray positions to 0 

    bytes1.position = 0; 
    bytes2.position = 0; 

    //extract 

    song1.extract(bytes1, 8192); 
    song2.extract(bytes2, 8192); 

    // reset bytearray positions to 0 for reading the floats 

    bytes1.position = 0; 
    bytes2.position = 0; 

    // run through all the bytes/floats 

    var b:int = 0; 

    while(b < 8192){ 

    left1 = bytes1.readFloat(); // gets "left" signal 
    right1 = bytes1.readFloat(); // gets "right" signal 

    left2 = bytes2.readFloat(); 
    right2 = bytes2.readFloat(); 


    // mix! 

    var newLeft:Number = (left1 + left2) * .5; 
    var newRight:Number = (right1 + right2) * .5; 

    // write the new stuff to the output sound's 

    e.data.writeFloat(newLeft); 
    e.data.writeFloat(newRight); 

    // write numbers to the "recording" byteArray 
    recordedBytes.writeFloat(newLeft); 
    recordedBytes.writeFloat(newRight); 

    b++; 

    } 
} 

Sí - que realmente debería limitar la posible salida a -1/1. Hazlo. ¡Esto no está optimizado!

Ok. ¡así que esa es la parte fácil! La parte difícil es realmente convertir el byteArray final a MP3. El audio existe dentro de Flash como PCM/datos sin comprimir, MP3 es obviamente un formato comprimido. Esta "respuesta" ya es demasiado larga y toda esta información la obtuve de varias personas muy inteligentes.

Puede adaptarse fácilmente 'MicRecorder' para ser un genérico registrador de datos de sonido: http://www.bytearray.org/?p=1858

convertir a MP3 será una perra: Thibault tiene otro mensaje el ByteArray.org - búsqueda de MP3 LAME.

excelente ejemplo/recurso: http://www.anttikupila.com/flash/soundfx-out-of-the-box-audio-filters-with-actionscript-3/

Mirar hacia arriba de código abierto de Andre Michelle proyecto 'Tonfall' en Google Code.

Busque el blog y los laboratorios de Kevin Goldsmith: tiene un gran ejemplo al utilizar Pixel Bender con toda esta locura.

Espero que esto ayude!

PS - siguiendo el ejemplo de Andre, la longitud óptima del buffer de audio debe ser 3072. Pruébalo en tu máquina!

+0

Hola Nick, gracias por toda la información que intentaré con tu pseudoCódigo, acerca de cómo guardar el MP3. Lo he resuelto con una biblioteca de fr.kikko https://github.com/kikko/Shine-MP3-Encoder-on -AS3-Alchemy Mi siguiente paso es usar la mezcladora de píxeles – luosKrad

+0

Acerca de la MicRecorder La usé como mi primera opción y funcionó hermosa, pero me di cuenta de que solo mi Lap tenía un micrófono instalado en la caja de resonancia y lo usa como un micrófono línea para que otros usuarios no funcionen verifique este archivo: http://www.grupoogl.com/beat/wav2mp3/ATR_Recorder.swf – luosKrad

+0

Hola, luosKrad, estoy teniendo los mismos desafíos que tuviste cuando hiciste esta pregunta, podría compartes algo de luz ¿Cuál fue su solución final y qué NO pudo resolver? ¡Gracias! – GV3