Android:同时录制视频和播放 mp3?

Posted

技术标签:

【中文标题】Android:同时录制视频和播放 mp3?【英文标题】:Android: Record video and play mp3 simultaneously? 【发布时间】:2013-01-19 02:36:02 【问题描述】:

有没有办法在 android 4.x 上录制视频(无声)时播放 mp3(或其他)音频文件? 有没有人尝试过实现这一目标?

【问题讨论】:

您可以在录制时使用该服务在后台播放音乐。 【参考方案1】:

我曾尝试在录制声音时播放声音并且它正在工作,所以我很确定在录制视频时也可以。您只需要有单独的线程来进行视频录制和声音播放。

【讨论】:

您是使用两个应用程序还是使用 SDK 来实现的? @kristopher 但它可能会有大约毫秒的延迟。如何减少延迟?【参考方案2】:
package com.technologies.mash.MySounds.Music;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.media.AudioManager;
import android.media.CamcorderProfile;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.Toast;
import com.technologies.mash.CameraPreview;
import com.technologies.mash.PlayVideo;
import com.technologies.mash.R;
import com.technologies.mash.Sound;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class AlbumDetailVideo extends Activity 

    private Camera mCamera;
    private CameraPreview mPreview;
    private MediaRecorder mediaRecorder;
    private Button capture, switchCamera;
    private Context myContext;
    private RelativeLayout cameraPreview;
    AudioManager audioManager;
    private boolean cameraFront = false;
    // private ArrayList<Sound> mSounds = null;
    int z = 0;
    Sound s1;
    MediaPlayer mPlayer;
    int sound;
    String urls;
    String audio, root, video, video_new, output;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_album_detail_video);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        // getting songpath from server 

        Intent i = getIntent();
        urls = i.getStringExtra("songpath");

//        String urls = getIntent().getExtras().getString("songpath");
        Toast.makeText(AlbumDetailVideo.this, "Sound id" + urls, Toast.LENGTH_SHORT).show();
        Log.e("url", urls);
        //   mSounds = new ArrayList<Sound>();

        myContext = this;
        initialize();
    

    private int findFrontFacingCamera() 
        int cameraId = -1;
        // Search for the front facing camera
        int numberOfCameras = Camera.getNumberOfCameras();
        for (int i = 0; i < numberOfCameras; i++) 
            Camera.CameraInfo info = new Camera.CameraInfo();
            Camera.getCameraInfo(i, info);
            if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) 
                cameraId = i;
                cameraFront = true;
                break;
            
        
        return cameraId;
    

    private String readTxt() 

        InputStream inputStream = getResources().openRawResource(z);//getting the .txt file


        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

        int i;
        try 
            i = inputStream.read();
            while (i != -1) 
                byteArrayOutputStream.write(i);
                i = inputStream.read();
            
            inputStream.close();
         catch (IOException e) 

            e.printStackTrace();
        

        return byteArrayOutputStream.toString();
    

    private int findBackFacingCamera() 
        int cameraId = -1;
        // Search for the back facing camera
        // get the number of cameras
        int numberOfCameras = Camera.getNumberOfCameras();
        // for every camera check
        for (int i = 0; i < numberOfCameras; i++) 
            Camera.CameraInfo info = new Camera.CameraInfo();
            Camera.getCameraInfo(i, info);
            if (info.facing == Camera.CameraInfo.CAMERA_FACING_BACK) 
                cameraId = i;
                cameraFront = false;
                break;
            
        
        return cameraId;
    

    public void onResume() 
        super.onResume();
        if (!hasCamera(myContext)) 
            Toast toast = Toast.makeText(myContext, "Sorry, your phone does not have a camera!", Toast.LENGTH_LONG);
            toast.show();
            finish();
        
        if (mCamera == null) 
            // if the front facing camera does not exist
            if (findFrontFacingCamera() < 0) 
                Toast.makeText(this, "No front facing camera found.", Toast.LENGTH_LONG).show();
                switchCamera.setVisibility(View.GONE);
            
            mCamera = Camera.open(findBackFacingCamera());
            mCamera.setDisplayOrientation(90);
            mPreview.refreshCamera(mCamera);
        
    

    public void initialize() 
        cameraPreview = (RelativeLayout) findViewById(R.id.camera_preview);

        mPreview = new CameraPreview(myContext, mCamera);
        cameraPreview.addView(mPreview);

        capture = (Button) findViewById(R.id.button_capture);
        capture.setOnClickListener(captrureListener);


        switchCamera = (Button) findViewById(R.id.button_ChangeCamera);
        switchCamera.setOnClickListener(switchCameraListener);
    

    View.OnClickListener switchCameraListener = new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            // get the number of cameras
            if (!recording) 
                int camerasNumber = Camera.getNumberOfCameras();
                if (camerasNumber > 1) 
                    // release the old camera instance
                    // switch camera, from the front and the back and vice versa

                    releaseCamera();
                    chooseCamera();
                 else 
                    Toast toast = Toast.makeText(myContext, "Sorry, your phone has only one camera!", Toast.LENGTH_LONG);
                    toast.show();
                
            
        
    ;

    public void chooseCamera() 
        // if the camera preview is the front
        if (cameraFront) 
            int cameraId = findBackFacingCamera();
            if (cameraId >= 0) 
                // open the backFacingCamera
                // set a picture callback
                // refresh the preview

                mCamera = Camera.open(cameraId);
                mCamera.setDisplayOrientation(90);
                // mPicture = getPictureCallback();
                mPreview.refreshCamera(mCamera);
            
         else 
            int cameraId = findFrontFacingCamera();
            if (cameraId >= 0) 
                // open the backFacingCamera
                // set a picture callback
                // refresh the preview

                mCamera = Camera.open(cameraId);
                mCamera.setDisplayOrientation(90);
                // mPicture = getPictureCallback();
                mPreview.refreshCamera(mCamera);
            
        
    

    @Override
    protected void onPause() 
        super.onPause();
        // when on Pause, release camera in order to be used from other
        // applications
        releaseCamera();
    

    private boolean hasCamera(Context context) 
        // check if the device has camera
        if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) 
            return true;
         else 
            return false;
        
    

    boolean recording = false;
    View.OnClickListener captrureListener = new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            Toast.makeText(AlbumDetailVideo.this, "Playing.." + urls, Toast.LENGTH_SHORT).show();


            if (recording) 
                // stop recording and release camera
                mediaRecorder.stop(); // stop the recording
                releaseMediaRecorder(); // release the MediaRecorder object
                mPlayer.stop();

                Intent intent = new Intent(getApplicationContext(), PlayVideo.class);
                startActivity(intent);
                finish();
                Toast.makeText(AlbumDetailVideo.this, "Video captured!", Toast.LENGTH_LONG).show();
                recording = false;
             else 


                if (!prepareMediaRecorder()) 
                    Toast.makeText(AlbumDetailVideo.this, "Fail in prepareMediaRecorder()!\n - Ended -", Toast.LENGTH_LONG).show();
                    finish();
                
                // work on UiThread for better performance
                runOnUiThread(new Runnable() 
                    public void run() 


                        mPlayer = new MediaPlayer();
                        mPlayer.setAudiostreamType(AudioManager.STREAM_MUSIC);

                        try 
                            mPlayer.setDataSource(urls);
                         catch (IllegalArgumentException e) 
                            Toast.makeText(AlbumDetailVideo.this, "You might not set the URI correctly!", Toast.LENGTH_LONG).show();
                         catch (SecurityException e) 
                            Toast.makeText(AlbumDetailVideo.this, "You might not set the URI correctly!", Toast.LENGTH_LONG).show();
                         catch (IllegalStateException e) 
                            Toast.makeText(AlbumDetailVideo.this, "You might not set the URI correctly!", Toast.LENGTH_LONG).show();
                         catch (IOException e) 
                            e.printStackTrace();
                        
                        try 
                            mPlayer.prepare();
                         catch (IllegalStateException e) 
                            Toast.makeText(AlbumDetailVideo.this, "You might not set the URI correctly!", Toast.LENGTH_LONG).show();
                         catch (IOException e) 
                            Toast.makeText(AlbumDetailVideo.this, "You might not set the URI correctly!", Toast.LENGTH_LONG).show();
                        
                        mediaRecorder.start();
                        mPlayer.start();


                    
                );
                recording = true;
            
        
    ;


    private void releaseMediaRecorder() 
        if (mediaRecorder != null) 
            mediaRecorder.reset(); // clear recorder configuration
            mediaRecorder.release(); // release the recorder object
            mediaRecorder = null;
            mCamera.lock(); // lock camera for later use
        
    

    private boolean prepareMediaRecorder() 

        mediaRecorder = new MediaRecorder();

        // CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_LOW);
        mCamera.unlock();
        mediaRecorder.setCamera(mCamera);

     //   mediaRecorder.setAudioSource(MediaRecorder.AudioEncoder.AAC_ELD);
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.VOICE_RECOGNITION);
        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    /*    mediaRecorder.setOutputFormat(profile.fileFormat);
        mediaRecorder.setVideoEncoder(profile.videoCodec);
        mediaRecorder.setVideoEncodingBitRate(profile.videoBitRate);
        mediaRecorder.setVideoFrameRate(profile.videoFrameRate);
        mediaRecorder.setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight);*/
        mediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());

        try 
            mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));
         catch (Exception e) 

        

        mediaRecorder.setOutputFile("/sdcard/rohit.mp4");
        mediaRecorder.setMaxDuration(600000); // Set max duration 60 sec.
        mediaRecorder.setMaxFileSize(50000000); // Set max file size 50M


        try 
            mediaRecorder.prepare();
         catch (IllegalStateException e) 
            releaseMediaRecorder();
            return false;
         catch (IOException e) 
            releaseMediaRecorder();
            return false;
        
        return true;

    

 /*   private boolean prepareMediaRecorder() 

        mediaRecorder = new MediaRecorder();

        mCamera.unlock();
        mediaRecorder.setCamera(mCamera);

        //mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

        try 
            mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
        catch (Exception e)

        

        mediaRecorder.setOutputFile("/sdcard/myvideo.mp4");
        mediaRecorder.setMaxDuration(600000); // Set max duration 60 sec.
        mediaRecorder.setMaxFileSize(50000000); // Set max file size 50M



        try 
            mediaRecorder.prepare();
         catch (IllegalStateException e) 
            releaseMediaRecorder();
            return false;
         catch (IOException e) 
            releaseMediaRecorder();
            return false;
        
        return true;

    */

    private void releaseCamera() 
        // stop and release camera
        if (mCamera != null) 
            mCamera.release();
            mCamera = null;
        
    



【讨论】:

以上是关于Android:同时录制视频和播放 mp3?的主要内容,如果未能解决你的问题,请参考以下文章

在 android 的视频视图中播放视频时不录制语音

同时录制视频和播放音频文件

如何同时录制视频和播放音频(快速教程)

我可以在 iPhone 4 上录制视频的同时播放音频吗?

在 Android 中录制、保存和播放视频

在 Android 中使用 GPU 进行视频录制和播放