2015-05-15 50 views
0

我想创建一个通过播放背景音乐来记录视频的应用程序。预期的输出将是具有上述音乐的捕获视频。Android上的背景音频视频捕获

我不确定这是否是一个垃圾问题,但是,任何人都请提出一个想法,以在Android上捕获具有背景音频的视频?

+2

您需要创建两项服务,一是为录制视频等播放音乐。 – koutuk

回答

0

我的解决方案是好的,试试吧:

服务机器人:

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; 
} 
}