Puedo grabar un vídeo utilizando el código de abajo y graba perfectamente, pero cuando se reproduce el video, se reproduce al revés.

Traté de configuración mrec.setOrientationHint(180) antes de mrec.prepare(); pero fue inútil. Cualquier sugerencias?

import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import android.app.Activity;
import android.hardware.Camera;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.Window;
/**
* @author SANA HASSAN
*/
public class CameraSurfaceView extends Activity {
private Preview mPreview;
private MediaRecorder mrec = new MediaRecorder();
private int cameraId = 0;
private Camera mCamera;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
mPreview = new Preview(this);
setContentView(mPreview);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, 0, 0, "Start");
menu.add(0, 1, 0, "Stop");
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 0:
try {
startRecording();
} 
catch (Exception e) {
e.printStackTrace();
mrec.release();
}
break;
case 1: 
mrec.stop();
mrec.release();
mrec = null;
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
protected void startRecording() throws IOException  {
mrec = new MediaRecorder();
mrec.setCamera(mCamera);
mCamera.unlock();
File directory = new File(Environment.getExternalStorageDirectory()+"/NICUVideos");
directory.mkdirs();
mrec.setAudioSource( MediaRecorder.AudioSource.MIC);
mrec.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mrec.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mrec.setOutputFile(Environment.getExternalStorageDirectory()+"/NICUVideos/"+System.currentTimeMillis()+".mp4"); 
mrec.setPreviewDisplay(mPreview.getHolder().getSurface());
mrec.setVideoSize(640, 480);
Method[] methods = mrec.getClass().getMethods();
for (Method method: methods){
try{
if(method.getName().equals("setAudioEncodingBitRate")){
method.invoke(mrec, 12200);
}
else if(method.getName().equals("setVideoEncodingBitRate")){
method.invoke(mrec, 800000);
}
else if(method.getName().equals("setAudioSamplingRate")){
method.invoke(mrec, 8000);
}
else if(method.getName().equals("setVideoFrameRate")){
method.invoke(mrec, 20);
}
}
catch (IllegalArgumentException e) {
e.printStackTrace();
} 
catch (IllegalAccessException e) {
e.printStackTrace();
} 
catch (InvocationTargetException e) {
e.printStackTrace();
}
}
mrec.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mrec.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
mrec.setMaxDuration(60000); //60 seconds
mrec.setMaxFileSize(10000000); //Approximately 10 megabytes
mrec.prepare();
mrec.start();
}
protected void stopRecording() {
mrec.stop();
mrec.release();
mCamera.release();
}
class Preview extends SurfaceView implements SurfaceHolder.Callback {
SurfaceHolder mHolder;
Activity activity;
Preview(Activity activity) {
super(activity);
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) {
Camera.CameraInfo info=new Camera.CameraInfo();
for (int i=0; i < Camera.getNumberOfCameras(); i++) {
Camera.getCameraInfo(i, info);
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
mCamera=Camera.open(i);
cameraId = i;
}
}
try {
mCamera.setPreviewDisplay(holder);
} catch (IOException exception) {
mCamera.release();
mCamera = null;
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
setCameraDisplayOrientation(mCamera);
mCamera.startPreview();
}
public void setCameraDisplayOrientation(Camera camera) {
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(cameraId, info);
int rotation = CameraSurfaceView.this.getWindowManager().getDefaultDisplay().getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0: degrees = 0; break;
case Surface.ROTATION_90: degrees = 90; break;
case Surface.ROTATION_180: degrees = 180; break;
case Surface.ROTATION_270: degrees = 270; break;
}
int result;
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360;  //compensate the mirror
} else {  //back-facing
result = (info.orientation - degrees + 360) % 360;
}
Log.d(Vars.TAG, "Result = "+result);
camera.setDisplayOrientation(result);
}
}
}
Esto sucede sólo en el dispositivo? Tiene u intentado en diferente?
Está usted seguro de que no es la configuración del reproductor de medios.? Otros vídeos de reproducción en la orientación correcta?
Sí, estoy 100% seguro de que no es la configuración del reproductor de medios. Mis teléfonos son Atrix2, no estoy preocupado acerca de otros teléfonos de ahora.

OriginalEl autor Sana | 2012-07-11

10 Comentarios

  1. 15

    Este problema es debido a Android el manejo de la rotación con sólo la creación de algunos metadatos en lugar de realmente rotando el video, y algunos software de reproducción, a continuación, ignorando que la configuración.

    Como se señaló en el docs:

    Tenga en cuenta que algunos reproductores de vídeo puede elegir ignorar la compostion de la matriz en un vídeo durante la reproducción.

    Sus opciones son utilizar diferentes software de reproducción que comprende los metadatos, o para re-codificar el vídeo después de que ha sido grabado con la orientación correcta. No está claro a partir de su descripción que de estos sería la mejor solución en su caso.

    OriginalEl autor blahdiblah

  2. 7

    Este debe ser llamada antes de la mrec.prepare(); método

    setOrientationHint(degrees);

    Enlace

    EDITAR:
    Trate de mCamera.setDisplayOrientation(degrees);

    0 for landscape
    90 for portrait
    180 & 270 don't work very well and give weird results.

    Algunos jugadores de mayor edad y los codificadores no interpretar este indicador es por eso que el vídeo se reproduce al revés.

    Yo lo hice, pero que no funciona, ya he dicho que en mi pregunta.
    Intenta mrec.setDisplayOrientation(0);? Usted no debería especificar 180 allí, como el que se mete con muchos reproductores de vídeo. También, intente reproducir el video con un reproductor de vídeo distinto que puede interpretar la composición de la matriz.
    En lugar de los 180 ¿qué trato? y no hay nada de mrec.setDisplayOrientation(0); tipos, creo que se está refiriendo a que la cámara ajuste el ángulo, ya he cuidar de que si ves mi código!!! Yo soy de orientación 2.3 dispositivos
    Ya lo he intentado mCamera.setDisplayOrientation(90) por mi frente frente a la cámara y graba perfectamente, pero cuando voy al archivo de la presente, en virtud de una de mis carpetas en /mnt/sdcard/carpeta/vídeo.mp4 y haga clic en él, se juega a 180 grados girados.
    Ya lo intenté, última parte de mi código. Comprobar mi método setCameraDisplayOrientation

    OriginalEl autor Anirudh Ramanathan

  3. 2

    Tengo el mismo problema, tengo en cuenta que la vista previa de la cámara el ángulo de orientación y grabación de vídeo ángulo no es lo mismo.
    Así que el uso de este método para el cambio de orientación en la grabación de vídeo:

    public static int getVideoOrientationAngle(Activity activity, int cameraId) { //The param cameraId is the number of the camera.
    int angle;
    Display display = activity.getWindowManager().getDefaultDisplay();
    int degrees = display.getRotation();
    android.hardware.Camera.CameraInfo info =
    new android.hardware.Camera.CameraInfo();
    android.hardware.Camera.getCameraInfo(cameraId, info);
    switch (degrees) {
    case Surface.ROTATION_0: 
    angle = 90; 
    break;
    case Surface.ROTATION_90:
    angle = 0;
    break;
    case Surface.ROTATION_180:
    angle = 270;
    break;
    case Surface.ROTATION_270:
    angle = 180;
    break;
    default:
    angle = 90;
    break;
    }
    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT)
    angle = (angle + 180) % 360;
    return angle;
    }

    Y que para el cambio de orientación en la vista previa de la cámara:

     public static int setCameraDisplayOrientation(Activity activity,
    int cameraId, android.hardware.Camera camera) {
    android.hardware.Camera.CameraInfo info =
    new android.hardware.Camera.CameraInfo();
    android.hardware.Camera.getCameraInfo(cameraId, info);
    int rotation = activity.getWindowManager().getDefaultDisplay()
    .getRotation();
    int degrees = 0;
    switch (rotation) {
    case Surface.ROTATION_0:
    degrees = 0;
    break;
    case Surface.ROTATION_90:
    degrees = 90;
    break;
    case Surface.ROTATION_180:
    degrees = 180;
    break;
    case Surface.ROTATION_270:
    degrees = 270;
    break;
    }
    int result;
    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
    result = (info.orientation + degrees) % 360;
    result = (360 - result) % 360;  //compensate the mirror
    } else {  //back-facing
    result = (info.orientation - degrees + 360) % 360;
    }
    camera.setDisplayOrientation(result);
    return result;
    }

    Tenga en cuenta que es importante saber si la cámara está en el frente o la espalda.

    ¿dónde tengo que poner el valor de retorno de getVideoOrientationAngle?
    a mrec.setOrientationHint(…)

    OriginalEl autor Alevittoria

  4. 1

    Sé que tu problema,

    Uso de Video Media Recorder de Camera, por lo que necesita rotate Media Recorder. usar debajo de los códigos debe ser solucionado el problema.

    /**
    * 
    * @param mMediaRecorder
    * @return
    */
    public static MediaRecorder rotateBackVideo(MediaRecorder mMediaRecorder) {
    /**
    * Define Orientation of video in here,
    * if in portrait mode, use value = 90,
    * if in landscape mode, use value = 0
    */
    switch (CustomCamera.current_orientation) {
    case 0:
    mMediaRecorder.setOrientationHint(90);
    break;
    case 90:
    mMediaRecorder.setOrientationHint(180);
    break;
    case 180:
    mMediaRecorder.setOrientationHint(270);
    break;
    case 270:
    mMediaRecorder.setOrientationHint(0);
    break;
    }
    return mMediaRecorder;
    }

    Debe agregar antes de prepare() método :

    //Step 5: Set the preview output
    /**
    * Define Orientation of image in here,
    * if in portrait mode, use value = 90,
    * if in landscape mode, use value = 0
    */
    CustomCamera.mMediaRecorder = Utils.rotateBackVideo(CustomCamera.mMediaRecorder);
    CustomCamera.mMediaRecorder.setPreviewDisplay(mCameraPreview.getHolder().getSurface());

    Gracias

    OriginalEl autor Huy Tower

  5. 1

    Uso OrientationEventListener y pista de valor de rotación cuando el dispositivo se gira aquí el código.Este código de aplicar la rotación de la cámara, pero para la grabación usted necesita aplicar la rotación a MediaRecorder.Cuando se inicia la grabación sólo mMediaRecorder.setOrientationHint(rotation) antes de mMediaRecorder.prepare(). Esta solucionar mi problema.

    OriginalEl autor Abu Yousuf

  6. 0

    Finalmente he encontrado que los teléfonos Motorola tiene problema en la reproducción del vídeo que se graba en el modo de retrato.

    Con el fin de superar la rotación del video, la mejor solución que he adoptado es subir el video al servidor y ejecutar ffmpeg sobre el uso del comando ffmpeg -i input.mp4 -c:v mpeg4 -c:a copy -c:s copy -vf "transpose=2" output.mp4

    Si usted siente que hay otra forma, por favor hágamelo saber.

    OriginalEl autor Sana

  7. 0

    uno más solución es rotar su actividad, por lo que su orientación es la misma que el sensor de orientación. Es decir, el paisaje para la cámara trasera y al revés vertical para la cámara frontal. Esto por cierto no va a arreglar efecto de espejo para la cámara frontal. Uno de los más dificultad es que usted tendrá que implementar la interfaz de usuario en los girado actividades en una forma de seguimiento de la actividad de orientación.

    OriginalEl autor Cynichniy Bandera

  8. 0

    girar su MediaRecorder como el de abajo, correspondiente al grado que se utiliza en la visualización de la Cámara de orientación para la parte delantera frente a la cámara de grabación de vídeo

    Display display = ((WindowManager)getContext().getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
    parameters.setPreviewSize(height, width);
    if(display.getRotation() == Surface.ROTATION_0)
    {
    mCamera.setDisplayOrientation(90);
    mMediaRecorder.setOrientationHint(270);
    }
    if(display.getRotation() == Surface.ROTATION_90)
    {
    mMediaRecorder.setOrientationHint(180);
    }
    if(display.getRotation() == Surface.ROTATION_180)
    {
    mMediaRecorder.setOrientationHint(270);
    }
    if(display.getRotation() == Surface.ROTATION_270)
    {
    mCamera.setDisplayOrientation(180);
    mMediaRecorder.setOrientationHint(0);
    }

    OriginalEl autor shadeup

  9. 0

    Aquí está el código para personalizar retrato de la cámara, se establezca la correcta rotación de imagen y vídeo:


    private OrientationEventListener orientationEventListener;
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //...
    orientationEventListener = new OrientationEventListener(this) {
    @Override
    public void onOrientationChanged(int orientation) {
    if (orientation == ORIENTATION_UNKNOWN) return;
    flashButton.setRotation(-(orientation));
    cameraButton.setRotation(-(orientation));
    if (camera != null) {
    Parameters parameters = camera.getParameters();
    CameraInfo info = new CameraInfo();
    Camera.getCameraInfo(selectedCamera, info);
    orientation = (orientation + 45) / 90 * 90;
    int rotation = 0;
    if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
    rotation = (info.orientation - orientation + 360) % 360;
    } else {  //back-facing camera
    rotation = (info.orientation + orientation) % 360;
    }
    parameters.setRotation(rotation);
    if (!isRecording) {
    mediaRecorder.setOrientationHint(rotation);
    }
    camera.setParameters(parameters);
    }
    }
    };
    }
    @Override
    protected void onResume() {
    super.onResume();
    //...
    orientationEventListener.enable();
    }
    @Override
    protected void onPause() {
    super.onPause();
    orientationEventListener.disable();
    //...
    }

    Teste con orientación vertical. Recuerde que para que la ponga en su manifiesto de probar el código. No sé si el trabajo en el paisaje.

    <activity android:name=".activities.CameraActivity"
    android:screenOrientation="portrait">
    Esta manija de la parte trasera y delantera de la cámara de fotos, pero de nuevo sólo los vídeos de las cámaras. La cámara frontal videos aplastar ahora en mi código. Voy a publicar el código para ese caso si he encontrado el problema.
    No sé si el código de trabajo en el paisaje de la actividad, si no, todo lo que usted necesita es a +90 o -90 grados a la final de la rotación de solucionarlo.

    OriginalEl autor IgniteCoders

  10. 0

    para el modo de retrato de conjunto de su mediaRecorder.setOrientationHint(90); grado es igual a su orientación de la cámara myCamera.setDisplayOrientation(90);

    OriginalEl autor Shilpy Samaddar

Dejar respuesta

Please enter your comment!
Please enter your name here