ros audio_common play Problem [closed]

asked 2013-04-07 22:00:35 -0500

maoqizhen gravatar image

I want to transmit mp3 stream to a tablet running android, and play it on tablet. I have implemented an android program to receive stream and write in a receiver.mp3 file. but I cannot play it. I guess is is something about decorder problem. Confused. Here is my source code.

public class audio_receiver<T> implements NodeMain {
 private String topicName;
 private String messageType;
 private MessageCallable<byte[], audio_common_msgs.AudioData> callable;
 private File file;
 private MediaPlayer mediaPlayer;
 private String mFilePath;
 private int mSampleRate;
 private FileOutputStream output;
 private boolean isRecording;
public audio_receiver(){
    isRecording= true;
    this.mFilePath = Environment.getExternalStorageDirectory() + "/receiver.mp3";
    this.mSampleRate = 8000;
    this.file = new File(mFilePath);
    mediaPlayer = new MediaPlayer();
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    mediaPlayer.setOnCompletionListener (new OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer arg0) {
            // TODO Auto-generated method stub
            arg0.stop();
        }
    });
    try {
        mediaPlayer.setDataSource(mFilePath);
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    try {
        output = new FileOutputStream(file);
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    };
}
@Override
public GraphName getDefaultNodeName() {
    // TODO Auto-generated method stub
    return GraphName.of("rosjava_tutorial_image_transport/audio_receiver");
}
public void setTopicName(String topicName) {
    this.topicName = topicName;
  }
public void setMessageType(String messageType) {
    this.messageType = messageType;
  }
public void setMessageToByteCallable(MessageCallable<byte[], audio_common_msgs.AudioData> callable) {
    this.callable = callable;
  }
@Override
public void onError(Node arg0, Throwable arg1) {
    // TODO Auto-generated method stub

}
@Override
public void onShutdown(Node arg0) {
    // TODO Auto-generated method stub

}
@Override
public void onShutdownComplete(Node arg0) {
    // TODO Auto-generated method stub

}
@Override
public void onStart(ConnectedNode connectedNode) {
    // TODO Auto-generated method stub
    Subscriber<T> subscriber = connectedNode.newSubscriber(topicName, messageType);
    subscriber.addMessageListener(new MessageListener<T>() {
      @Override
      public void onNewMessage(final T message) {
        if(isRecording){
            playAudio(callable.call((AudioData) message));
        }
      }
    });

}
public void playAudio(byte[] inputAudio){
    /*FileOutputStream output = null;
    try {
        output = new FileOutputStream(file);
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    };*/
    try {
        output.write(inputAudio, 0, inputAudio.length);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    /*try {
        output.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        try {
            mediaPlayer.prepare();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
    mediaPlayer.start();*/

}
public void stop(){
    isRecording= false;
    try {
        output.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        mediaPlayer.prepare();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    mediaPlayer.start();
}

} here is program similar to rosimageview.java

public class audioByteFromRosMsg implements MessageCallable<byte[], audio_common_msgs.AudioData> {

@Override
public byte[] call(AudioData message) {
    // TODO Auto-generated method stub
    ChannelBuffer buffer = message.getData();
    byte[] data = buffer.array();
    return data;
}

}here is program to transfer message to byte[] and I execute audioReceiver in nodeMainExecutor in mainActivity. I use audio_common but I prefer PWM format, mp3 has so many problem with codec and decode. have any idea of using other tools? my aim is just transmitting and receiving audio signal between ros and android.

edit retag flag offensive reopen merge delete

Closed for the following reason question is not relevant or outdated by tfoote
close date 2015-11-19 19:58:48.063226