6

소셜 모바일 앱에서 일하고 있습니다. 그것은 프로필에 대한 비디오를 녹화하는 옵션이 있습니다. 내 레코더의 문제점은 실제 비디오를 반영한다는 것입니다. 나는 그것이 기본 행동이지만, 그것이 sanpchat처럼 작동하고 싶다.거울없이 카메라에서 비디오 녹화하기 (스냅 채팅)

미리보기

다음

After recording and playback

내 코드 녹화 및 재생 후

Video when preview

// return camera instance when activity open first time 
private Camera getCameraInstance() { 
    // TODO Auto-generated method stub 
    releaseCamera(); 
    releaseMediaRecorder(); 
    Camera c = null; 
    try { 
     cameraId = findFrontFacingCamera(); 
     if (cameraId < 0) { 
      cameraId = findBackFacingCamera(); 
     } 
     c = Camera.open(cameraId); 

     // setCameraDisplayOrientation(this,cameraId,c); 
     //setCameraDisplayOrientation(this, cameraId, c); 
     c.setDisplayOrientation(90); 
    } catch (Exception e) { 
     // Camera is not available (in use or does not exist) 
    } 
    return c; // returns null if camera is unavailable 
} 
// return __cameraPreview Id 1 to open front camera 
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; 
      setOrientationHint = 270 ; 
      cameraFront = true; 
      break; 
     } 
    } 
    return cameraId; 
} 
// prepare and start recording 
private boolean prepareMediaRecorder() { 
    mediaRecorder = new MediaRecorder(); 
    try { 
     myCamera.unlock(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    mediaRecorder.setCamera(myCamera); 

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

    if (cameraPreview.getVideoSize() != null) { 
     mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
     mediaRecorder.setOutputFile(saveUrl); 

     mediaRecorder.setVideoEncodingBitRate(10000000); 
     mediaRecorder.setVideoFrameRate(30); 
     mediaRecorder.setVideoSize(cameraPreview.getVideoSize().width, cameraPreview.getVideoSize().height); 

     mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); 
     mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); 
    } else { 
     CamcorderProfile cp = CamcorderProfile.get(cameraId, CamcorderProfile.QUALITY_HIGH); 
     mediaRecorder.setProfile(cp); 
    } 
    Log.e(TAG, "Video profile CamcorderProfile.QUALITY_HIGH: " + "cp.quality:" + cp.quality 
      + ", cp.videoFrameWidth:" + cp.videoFrameWidth 
      + ", cp.videoFrameHeight:" + cp.videoFrameHeight); 

    mediaRecorder.setMaxDuration(MAX_VIDEO_LENGTH); 
    mediaRecorder.setOrientationHint(setOrientationHint); 
    try { 
     mediaRecorder.prepare(); 

    } catch (IllegalStateException | IOException e) { 
     e.printStackTrace(); 
     releaseMediaRecorder(); 
     return false; 
    } 
    mediaRecorder.start(); 
    return true; 
} 

재생시 미리보기와 동일해야합니다. Sanpchat은 이미 사전에 감사하고 있습니다.

+0

무엇이 'cameraPreview'입니까? – pskink

+0

의 하위 클래스입니다. 'SurfaceView' – Max

+0

'TextureView'와'setTransform (매트릭스 변환)'을 사용합니다. – pskink

답변

1

마지막으로 동영상을 제출하는 곳에서 API 작업을 수행 할 필요가 없습니다. 동영상을 업로드 한 후 ffmpeg을 세로로 뒤집어 메타 데이터에 각도를 설정합니다. 여기에 대한 명령이 있습니다.

ffmpeg -i VIDEO_PATH -vf "vflip" -metadata:s:v rotate=180 DEST_PATH 
+0

답변 해 주셔서 감사합니다. 나는이 문제에 정말로 갇혀있다. 동영상을 뒤집을 수있는 방법을 찾지 못했습니다. –

+0

@Max 동영상을 뒤집기 위해이 명령을 사용하는 방법은 무엇입니까? – Arti

2

당신은 상기 X 축에 -1 스케일 변환 TextureView, 문서 here를 사용하여 적용 할 수 있으며, 여기서 (270) 전면에 직면 카메라의 방향을 설정 한 here

+0

올바른데도 링크 오버플로에 대한 링크 대답은 [우수 사례로 간주되지 않습니다] (http://meta.stackexchange.com/questions/7515/why-is-linking-bad)입니다. "대답"이라는 질문은 실제로 대답을 포함하거나 최소한 내용의 요약과 그것이 내용과 관련된 내용을 포함해야합니다. –

+0

나는 그것을 사과한다, 링크가 이해하기 쉬운 코드를 포함하고 있기 때문에 그것이 정확하다고 생각했다. –

+0

미리보기가 변경되며 녹화 된 비디오도 변경됩니까? – Max

3

기능

setOrientationHint = 270 ; 
대신

나는 다음과 같은 180도에 방향을 설정하는 것이 좋습니다 것,

setOrientationHint = (info.orientation - 180 + 360) % 360; 

이 또한 변경됩니다 전체 비디오 파일.