【问题标题】:Android Media Recording using threads使用线程的 Android 媒体录制
【发布时间】:2013-01-02 07:56:15
【问题描述】:

我正在开发一个简单地使用按钮开始和停止录制的 android 应用程序。 我用线程。我创建了三个类..一个开始录制..一个停止录制和主类..

问题是我可以在我的手机中看到该文件,但它是空的,手机给我一个消息“无法播放视频”..我希望它与线程一起工作..我不想要其他方法。 .

这是我的代码 主类:

public class MediaRecorderSampleActivity extends Activity {


    Button start;
    Button stop ; 
    private MediaRecorder recorder ;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        start = (Button)findViewById(R.id.startbtn); 
        stop = (Button)findViewById(R.id.stopbtn); 
        start.setOnClickListener(new btnClick());
        stop.setOnClickListener(new StopbtnClick());
        }



    class btnClick implements View.OnClickListener {
                public void onClick(View arg0) {
            Log.i("Media", "Start Clicked...");
            Thread startThread = new Thread ( new startRe (recorder));
            Log.i("Media", "start Thread Created");
            startThread.start() ; 
             Log.i("Media", "start Recording");

                }           
    }


    class StopbtnClick implements View.OnClickListener {
        public void onClick(View arg0) {
              Log.i("Media", "Stop Clicked...");
        // TODO Auto-generated method stub
            Thread stopThread = new Thread ( new stopRecording (recorder));
              Log.i("Media", "stop Thread Created");
    stopThread.start();
    Log.i("Media", "stop Recording");
        }

  }

      }

StartRecording 类

public class startRe implements Runnable {
private MediaRecorder recorder;


startRe( MediaRecorder r ) {
    Log.i("Media", "start cons");
    this.recorder = r ; 

}
public void run() {
    // TODO Auto-generated method stub
    Log.i("Media", "IN RUN start Recording");
    startRecording();
}


public void startRecording() {
    Log.i("Media", "IN Method start Recording");
    recorder = new MediaRecorder();
    Log.i("Media", "create variable");
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    Log.i("Media", "1");
    recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    Log.i("Media", "2");
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    Log.i("Media", "3");
    recorder.setOutputFile(getFilePath());
    try{
        Log.i("Media", "prepar");
        recorder.prepare();
        Log.i("Media", "before");
        recorder.start();
        Log.i("Media", "after");
    }catch (Exception e){
        e.printStackTrace();
    }

}


private String getFilePath() {
    String filePath = Environment.getExternalStorageDirectory().getPath();
    File file = new File(filePath, "MediaRecorderSample");

    if(!file.exists())
        file.mkdirs();

    return (file.getAbsolutePath() + "/" + System.currentTimeMillis() + ".mp4" );
}


}

停止类

 public class stopRecording implements Runnable {
private MediaRecorder recorder ;

public stopRecording(MediaRecorder recorder2) {
    Log.i("Media", "Stop in Cos");
    // TODO Auto-generated constructor stub
    try {
    this.recorder = recorder2 ; }
    catch ( Exception e )
    {       
        Log.i("Media", "Stop out  Cos" + e.getMessage()) ;
        } 

}
public void run() {
    Log.i("Media", "Stop in RUN");
    stopRecording();
    Log.i("Media", "Stop out of RUN");

}

【问题讨论】:

    标签: android media-player media android-mediaplayer audio-recording


    【解决方案1】:

    您如何使用MediaRecorder 的对象存在问题。需要在Activity类中创建对象,然后将对象传递给两个Runnable..

    因此您需要进行以下更改:

    在Activity类中创建对象,代码如下:

     private MediaRecorder recorder ;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            start = (Button)findViewById(R.id.startbtn); 
            stop = (Button)findViewById(R.id.stopbtn); 
            start.setOnClickListener(new btnClick());
            stop.setOnClickListener(new StopbtnClick());
             // Create the object in Activity so that both Runnable works on the same object...
             recorder = new MediaRecorder();
            }
    

    将相同的对象传递给两个Runnable 类,就像你已经做的那样。

    不要在startRecording() 方法中创建对象,因为它会创建一个本地对象并将其分配给一个无法从stopRecording 访问的本地变量Runnable..

    public void startRecording() {
        Log.i("Media", "IN Method start Recording");
        // comment this recorder = new MediaRecorder();
        Log.i("Media", "create variable");
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        Log.i("Media", "1");
        recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        Log.i("Media", "2");
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        Log.i("Media", "3");
        recorder.setOutputFile(getFilePath());
        try{
            Log.i("Media", "prepar");
            recorder.prepare();
            Log.i("Media", "before");
            recorder.start();
            Log.i("Media", "after");
        }catch (Exception e){
            e.printStackTrace();
        }
    
    }
    

    试着告诉我们结果...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-17
      • 1970-01-01
      • 2016-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多