6

我正在從事社交移動應用。它可以選擇爲配置文件錄製視頻。我的錄音機的問題是它反映了實際的視頻。我知道這是默認行爲,但希望它像Sanpchat一樣工作。從沒有鏡像的相機錄製視頻就像快速聊天

預覽

Video when preview

錄製和回放後

After recording and playback

這裏是我的代碼

// 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(Matrix transform)' – pskink

回答

1

對我來說沒有任何工作,最後我需要在提交視頻的api端執行此操作。上傳視頻後,我使用ffmpeg垂直翻轉它並設置元數據中的角度。這裏是這個命令。

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

感謝您的回答。我在這個問題上非常困惑。我沒有找到翻轉視頻的方法 –

+0

@Max如何使用此命令進行視頻翻轉? – Arti

2

可以使用TextureView,文檔here並應用在X軸上變換-1規模,功能here

+0

雖然這是正確的,但只有鏈接的答案是[不被認爲是良好的做法](http://meta.stackexchange.com/questions/7515/why-is-linking-bad)堆棧溢出。 「答案」這個問題實際上應該包含一個答案,或者至少包含內容的總結以及它與問題的關係。 –

+0

我對此表示歉意,我認爲這是正確的,因爲鏈接中包含易於理解的代碼。 –

+0

它會改變預覽,它也會改變錄製的視頻嗎? – Max

3

您已設置了前置攝像頭,以270這裏的方位,

setOrientationHint = 270 ; 

相反,我會建議方向設置爲180度像下面,

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

這也將改變整個視頻文件。