partir archivo de audio en varios pedacitos

Iniciado por lexoazul, 16 Diciembre 2010, 20:40 PM

0 Miembros y 1 Visitante están viendo este tema.

lexoazul

Antes que nada Gracias a todos y muchos saludos.

Quisiera saber si me pueden ayudar con este problema.
Bueno el problema es que quiero partir en multiples pedacitos un archivo
de audio para este ejemplo es un .wav, tengo hecho estos metodos que lo hacen pero el problema es que cuando quiero reproducir esos archivos me dice el reproductor que tiene un error.
En el metodo partir tengo colocado el numero 345 para que solo haga dos pedacitos de todos los 347.
Lo gracioso es que si le digo que haga solo un archivo(coloco 346 en lugar del 345) ese si lo reproduce correcto.
Si alguien tiene una idea de porque lo hace se lo agradeceria mucho.
Muchas gracias a todos

Codigo:
import java.io.*;
import java.util.*;
public class Audio2 extends Thread{
    FileOutputStream fileOut ;
    BufferedOutputStream b;
    File fi;
    Vector v;
    byte[] bytes;
    byte[] subbyte;
    int tam,div,div2,tam2;
    int contador2=0;
public void partir(){
        byte []p=convertir("Akane.wav");//+++++++++++++++++++++++++Musica que quiero partir en pedacitos
        int tam=p.length;
        div=tam/50000;
        div2=tam%50000;
        tam2=50000;
        int inicio=0;
        subbyte= new byte[tam2];
        int contador=0;
        try{
        if(div>0){
            while(div>345){//Este numero lo coloque porque conozco en cuantos pedacitos va a partie este audio son 347
                for(int x=inicio;x<tam2;x++){
                    System.out.println("for: "+x+"     contador: "+contador);
                    subbyte[contador]=p[x];
                    contador++;
                }
               
                contador=0;
                div--;
                v.add(subbyte);
                if(div==1){
                    inicio=tam2;
                    tam2=tam2+div2;
                    subbyte=new byte[tam2];
                }else{
                    inicio=tam2;
                    tam2=tam2+50000;
                }
            }
        }else{
            for(int x=inicio;x<div2;x++){
                subbyte[x]=p[x];
            }
            v.add(subbyte);//+++++++++++++++++++++++++++++++++++++++++++Aqui lo agrego a un vector
        }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    public byte[] convertir(String nombre){
        try{
            File fil= new File(nombre);
            InputStream is = new FileInputStream(fil);
            long length = fil.length();
            System.out.println(length);
            bytes = new byte[(int)length];
            int offset = 0;
            int numRead = 0;
                while (offset < bytes.length
                   && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
                offset += numRead;
                }
                if (offset < bytes.length) {
                throw new IOException("Could not completely read file "+fil.getName());
                }
            is.close();
           
        }catch(Exception ee){
            ee.printStackTrace();
        }
        return bytes;
    }
   
public void tratar(){
        try {
            Thread hilo = new Thread();
            hilo.start();
            while(true){
                if(v.isEmpty()==true){
                hilo.sleep(2000);
                }else{
                    byte[] gg=(byte[])v.remove(0);
                    crearMusica("nuevo",gg);//+++++++++++++++++++++++Metodo que me crea el archivo WAV
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
   
}

public void crearMusica(String nom,byte[] a){
        try{
            String nombre=nom+(""+contador2)+".wav";
            fi=new File(nombre);
            fileOut= new FileOutputStream (fi);
            b = new BufferedOutputStream(fileOut);   
            b.write(a);
            b.flush();
            b.close();
        }catch(Exception e){
            e.printStackTrace();
        }
}
public void run(){
    partir();
    tratar();
}
public static void main(String args[]){
    Audio2 a= new Audio2();
    a.start();
}
}

lexoazul

hola a todos.
Bueno ya estuve leyendo sobre envio de archivos de audio y reproduccion en tiempo real y me he encontrado con el tema de los streaming, lo que pudo entender es que se maneja un buffer por UDP; lo que no he podido buscar es como crear ese buffer apartir de un archivo de audio(ejemplo un .wav); ademas de como recibir ese buffer, si alguien tiene una idea de como hacerlo se lo agradeceria mucho.
Con respecto a lo de arriba esa era mi intencion partir el archivo para poder enviarlo por TCP y luego reproducirlo pero aun no me ha salido.
Muchas gracias a todos los lectores.

;D       ;D       ;D        ;D

1mpuls0

Hola, que tal.
Me parece intersante tú caso, así que intenté un poco, sin mucho éxito.

Se puede utilizar la clase AudioInputStream y su metodo AudioFileFormat (que contiene a AudioFormat) para saber el formato (y frecuencia) y  puedes utilizar AudioSystem para escribir.
Con base en la frecuencia del formato se puede saber cuantos bytes son en 2 segundos, e ir escribiendo mediante un ciclo la lectura de bytes en un nuevo archivo.

Aunque si no mal recuerdo los archivos wav tienen una cabecera, lo cual no se si impida que las demas partes puedan reproducirse correctamente.

Aquí te dejo un código que estoy implementando, no es funcional, pero creo que te serviria para darte una idea.

Código (java) [Seleccionar]

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.UnsupportedAudioFileException;

public class AudioSplit {

public static void main(String args[]) {
new AudioSplit();
}

public AudioSplit() {
split();
}

public File[] split() {

File[] output1 = new File[3];
try {
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File("dance.wav"));
long frames = audioInputStream.getFrameLength();

int[] splits = {(int) (frames/3),(int) (frames/3), (int) (frames/3)};
splits[2] -= (splits[0]+splits[1]);

for (int i = 0; i < splits.length; i++) {
byte[] data = new byte[splits[i]*audioInputStream.getFormat().getFrameSize()];
int nBytesRead = 0;
int counter = 0;
while ((nBytesRead != -1)&&(counter < data.length)) {
nBytesRead = audioInputStream.read(data, counter, data.length-counter);
if (nBytesRead != -1) {
counter += nBytesRead;
}
}

File outputFile = new File("element" + i+ ".wav");
ByteArrayInputStream bais = new ByteArrayInputStream(data);
AudioInputStream ais = new AudioInputStream(audioInputStream, audioInputStream.getFormat(), audioInputStream.getFrameLength() );
        AudioSystem.write(ais, AudioFileFormat.Type.WAVE, outputFile);
        }
} catch(UnsupportedAudioFileException ex) {
Logger.getLogger(AudioSplit.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(AudioSplit.class.getName()).log(Level.SEVERE, null, ex);
}

return output1;
}

}


Estaré intentando hasta que pueda obtener algun resultao óptimo.

Saludos
abc

lexoazul

muchas gracias Darhius por el ejemplo, lo voy a checar y luego comento, pero tienes razon el wav tiene una cabecera y no me ha dejado reproducirlo.
Solo me ha resultado con mp3. luego subo el ejemplo como lo hice con mp3.
Otra duda es posible pasar de formato wav,midi,au,ogg a mp3 con java.

Gracias nuevamente a todos los lectores

;D       ;D        ;D          ;D