6

Pracuję nad społeczną aplikacją mobilną. Posiada opcję nagrywania wideo dla profilu. Problem z moją nagrywarką polega na tym, że odzwierciedla ona rzeczywiste wideo. Wiem, że to domyślne zachowanie, ale chcę, żeby działało jak sanpchat.Nagrywaj wideo z aparatu bez lustra, jak snap czat

Podgląd

Video when preview

Po rejestracji i odtwarzania

After recording and playback

Oto mój kod

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

Chcę, żeby w odtwarzaniu było to samo, co podgląd. Sanpchat już robi to samo, z góry dzięki.

+0

co to jest "cameraPreview"? – pskink

+0

to podklasa 'SurfaceView' – Max

+0

użyć' TextureView' i 'setTransform (transformacja macierzy)' – pskink

Odpowiedz

1

Nic dla mnie nie działa, w końcu muszę to zrobić po stronie api, gdzie przesyłam film. Po przesłaniu wideo używam ffmpeg, aby odwrócić pion i ustawić kąt w metadanych. oto polecenie dla tego.

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

Dzięki za odpowiedź. Naprawdę utknąłem w tym wydaniu. Nie znalazłem sposobu, aby odwrócić wideo –

+0

@ Max. Jak użyć tego polecenia do rzutowania wideo? – Arti

2

Można użyć TextureView, dokumentacja here i zastosować transformację skali -1 na osi X, funkcja here

+0

Chociaż jest to poprawne, odpowiedzi dotyczące tylko łącza są [nie uważane za dobre praktyki] (http://meta.stackexchange.com/questions/7515/why-is-linking-bad) w Stack Overflow. Pytanie "odpowiedź" powinno w rzeczywistości zawierać odpowiedź lub co najmniej podsumowanie treści i sposobu, w jaki odnosi się do pytania. –

+0

Przepraszam za to, myślałem, że to prawda, ponieważ linki zawierają kod łatwy do zrozumienia. –

+0

zmieni to podgląd, czy zmieni także nagrane wideo? – Max

3

Ustawiono orientację skierowaną do przodu do kamery 270 Tutaj

setOrientationHint = 270 ; 

Zamiast tego proponuję ustawić orientację do 180 stopni jak poniżej,

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

będzie to również zmienić cały plik wideo.

Powiązane problemy