Video capture with background audio on Android

2019-08-21 17:51发布

问题:

I am trying to create an app which record videos by playing a background music. The expected output will be the captured video with the above mentioned music.

I am not sure whether it is an rubbish question but, anyone please suggest an idea to capture video with a background audio on Android?

回答1:

my solution is fine, try it:

Service android:

import java.util.Calendar;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.CameraInfo;
import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.view.Gravity;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;

public class BackgroundVideoRecorder extends Service implements
SurfaceHolder.Callback {

private WindowManager windowManager;
private SurfaceView surfaceView;
private Camera camera = null;
private MediaRecorder mediaRecorder = null;



int contTime = 0, duracaoGravacao = 30; //interval  in seconds to record video

private class thread implements Runnable {
public void run() {

    contTime++;

    if (contTime >= duracaoGravacao) {
        StopService();
    }

    tick_Handler.postDelayed(tick_thread, 1000);
}
}

Handler tick_Handler;
thread tick_thread;

Preferences pref;

@Override
public void onCreate() {

windowManager = (WindowManager) this
        .getSystemService(Context.WINDOW_SERVICE);
surfaceView = new SurfaceView(this);
LayoutParams layoutParams = new WindowManager.LayoutParams(1, 1,
        WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
        WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
        PixelFormat.TRANSLUCENT);
layoutParams.gravity = Gravity.LEFT | Gravity.TOP;
windowManager.addView(surfaceView, layoutParams);

surfaceView.getHolder().addCallback(this);

tick_Handler = new Handler();
tick_thread = new thread();

VIDEO_RECORDER_FOLDER = new _Path().getPathVideo();

}

@Override
public void onStart(Intent intent, int startId) {

tick_Handler.post(tick_thread);

}

// Method called right after Surface created (initializing and starting
// MediaRecorder)
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {

boolean found = false;

int i = 0;

try {
    for (i = 0; i < Camera.getNumberOfCameras(); i++) {

        Camera.CameraInfo newInfo = new Camera.CameraInfo();

        Camera.getCameraInfo(i, newInfo);

        if (newInfo.facing == CameraInfo.CAMERA_FACING_FRONT) {
            found = true;
            break;
        }
    }
} catch (Exception e) {
    e.printStackTrace();
}

if (found) {
    camera = Camera.open(i);
} else {
    camera = Camera.open();
}

Calendar lCDateTime = Calendar.getInstance();

String t = String.valueOf(lCDateTime.getTimeInMillis());

nomeArquivo = "hire_me_now_" + t + ".mp4";

nomeArquivo = nomeArquivo.replace(" ", "_").replace(":", "_")
        .replace("-", "_");

String caminhoArquivo = VIDEO_RECORDER_FOLDER + "/" + nomeArquivo;

mediaRecorder = new MediaRecorder();
camera.unlock();

mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
mediaRecorder.setCamera(camera);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mediaRecorder.setProfile(CamcorderProfile
        .get(CamcorderProfile.QUALITY_QVGA));
mediaRecorder.setVideoFrameRate(15);

mediaRecorder.setOutputFile(caminhoArquivo);

try {
    mediaRecorder.prepare();

} catch (Exception e) {
    e.printStackTrace();
}

mediaRecorder.start();
}

// Stop recording and remove SurfaceView
@Override
public void onDestroy() {

mediaRecorder.stop();
mediaRecorder.reset();
mediaRecorder.release();

camera.lock();
camera.release();

windowManager.removeView(surfaceView);

}

protected void StopService() {
try {
    this.stopSelf();
} catch (Exception e) {
    e.printStackTrace();
}
}

@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int format,
    int width, int height) {
}

@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
}

@Override
public IBinder onBind(Intent intent) {
return null;
}
}