Autore Topic: mediarecorder: video salvato nel verso errato  (Letto 560 volte)

Offline frecciak

  • Utente normale
  • ***
  • Post: 231
  • Respect: +16
    • Mostra profilo
  • Dispositivo Android:
    galaxy s
  • Sistema operativo:
    windows 7
mediarecorder: video salvato nel verso errato
« il: 09 Gennaio 2012, 18:56:24 CET »
0
mi serve un'aiutino per salvare i video in modo portrait..
ho provato a impostare l'activity in portrait e in landscape, ma il video viene sempre salvato ruotato di 90 gradi..
nel telefono si vede bene e sembra orientato nel modo giusto, ma importando il file nel pc, me lo trovo ruotato..
il codice che uso è questo:
Codice (Java): [Seleziona]
public class videomanostart extends Activity{
       
        private Camera myCamera;
    private MyCameraSurfaceView myCameraSurfaceView;
    private MediaRecorder mediaRecorder;
    protected PowerManager.WakeLock mWakeLock;
        Button myButton;
        SurfaceHolder surfaceHolder;
        boolean recording;
        String TAG;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        recording = false;        
        setContentView(R.layout.videomanostart);  
        videomanostart.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);


        //Get Camera for preview
        myCamera = getCameraInstance();
        if(myCamera == null){
                Toast.makeText(videomanostart.this,
                                "Impossibile usare la VideoCamera",
                                Toast.LENGTH_LONG).show();
        }

        myCameraSurfaceView = new MyCameraSurfaceView(this, myCamera);
        FrameLayout myCameraPreview = (FrameLayout)findViewById(R.id.videoview);
        myCameraPreview.addView(myCameraSurfaceView);
       
        myButton = (Button)findViewById(R.id.mybutton);
        myButton.setOnClickListener(myButtonOnClickListener);
    }
   
    Button.OnClickListener myButtonOnClickListener
    = new Button.OnClickListener(){

                public void onClick(View v) {
                        // TODO Auto-generated method stub
                        if(recording){
                // stop recording and release camera
                mediaRecorder.stop();  // stop the recording
                releaseMediaRecorder(); // release the MediaRecorder object
               
                //Exit after saved
                finish();
                        }else{
                               
                                //Release Camera before MediaRecorder start
                                releaseCamera();
                               
                        if(!prepareMediaRecorder()){
                                Toast.makeText(videomanostart.this,
                                                "Fail in prepareMediaRecorder()!\n - Ended -",
                                                Toast.LENGTH_LONG).show();
                                finish();
                        }
                               
                                mediaRecorder.start();
                                recording = true;
                                myButton.setText("STOP");
                        }
                }};
   
    private Camera getCameraInstance(){
                // TODO Auto-generated method stub
        Camera c = null;
        try {
            c = Camera.open(); // attempt to get a Camera instance
        }
        catch (Exception e){
            // Camera is not available (in use or does not exist)
        }
        return c; // returns null if camera is unavailable
        }
       
        private boolean prepareMediaRecorder(){
                int picture_width = myCameraSurfaceView.getWidth();  
        int picture_height = myCameraSurfaceView.getHeight();
            myCamera = getCameraInstance();
            mediaRecorder = new MediaRecorder();
            myCamera.unlock();
            mediaRecorder.setCamera(myCamera);
           
            mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
                mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
                mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
                 mediaRecorder.setVideoSize(320, 480);
                 mediaRecorder.setVideoFrameRate(15);
                 mediaRecorder.setMaxDuration(50000);
                    mediaRecorder.setOutputFile("/sdcard/myvideo.mp4");
                    mediaRecorder.setPreviewDisplay(myCameraSurfaceView.getHolder().getSurface());
           
            try {

                mediaRecorder.prepare();
            } catch (IllegalStateException e) {
                releaseMediaRecorder();
                return false;
            } catch (IOException e) {
                releaseMediaRecorder();
                return false;
            }
            return true;
               
        }
       
    @Override
    protected void onPause() {
        super.onPause();
        releaseMediaRecorder();       // if you are using MediaRecorder, release it first
        releaseCamera();              // release the camera immediately on pause event
        this.mWakeLock.release();
    }

    private void releaseMediaRecorder(){
        if (mediaRecorder != null) {
            mediaRecorder.reset();   // clear recorder configuration
            mediaRecorder.release(); // release the recorder object
            mediaRecorder = null;
            myCamera.lock();           // lock camera for later use
        }
    }

    private void releaseCamera(){
        if (myCamera != null){
            myCamera.release();        // release the camera for other applications
            myCamera = null;
        }
    }
       
        public class MyCameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback{

                private SurfaceHolder mHolder;
            private Camera mCamera;
               
                public MyCameraSurfaceView(Context context, Camera camera) {
                super(context);
                mCamera = camera;

                // Install a SurfaceHolder.Callback so we get notified when the
                // underlying surface is created and destroyed.
                mHolder = getHolder();
                mHolder.addCallback(this);
                // deprecated setting, but required on Android versions prior to 3.0
                mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
            }

                public void surfaceChanged(SurfaceHolder holder, int format, int weight,
                                int height) {
                // If your preview can change or rotate, take care of those events here.
                // Make sure to stop the preview before resizing or reformatting it.

                if (mHolder.getSurface() == null){
                  // preview surface does not exist
                  return;
                }

                // stop preview before making changes
                try {
                    mCamera.stopPreview();
                } catch (Exception e){
                  // ignore: tried to stop a non-existent preview
                }

                // make any resize, rotate or reformatting changes here

                // start preview with new settings
                try {
                    mCamera.setPreviewDisplay(mHolder);
                    mCamera.startPreview();

                } catch (Exception e){
                }
                }

                public void surfaceCreated(SurfaceHolder holder) {
                        // TODO Auto-generated method stub
                        // The Surface has been created, now tell the camera where to draw the preview.
                try {
                    mCamera.setPreviewDisplay(holder);
                    mCamera.startPreview();
                } catch (IOException e) {
                }
                }

                public void surfaceDestroyed(SurfaceHolder holder) {
                        // TODO Auto-generated method stub
                       
                }
        }
}
« Ultima modifica: 09 Gennaio 2012, 20:16:53 CET da frecciak »
Se le risposte ti hanno aiutato, metti un ..a te non costa nulla, ma a chi ti ha aiutato fa molto piacere riceverlo!!

Offline frecciak

  • Utente normale
  • ***
  • Post: 231
  • Respect: +16
    • Mostra profilo
  • Dispositivo Android:
    galaxy s
  • Sistema operativo:
    windows 7
Re:mediarecorder: video salvato nel verso errato
« Risposta #1 il: 10 Gennaio 2012, 02:02:23 CET »
0
penso di aver capito quale codice serve:
Codice (Java): [Seleziona]
mediaRecorder.setOrientationHint(90);il problema è che ho provato a metterlo in vari posti, ma mi crassha semrpe con questo errore:
Codice: [Seleziona]
01-10 01:59:41.632: E/MediaRecorder(28760): setParameters(video-param-rotation-angle-degrees=90) failed: -2147483648
avete idea se questa riga va messa prima o dopo di qualcosa per non creare problemi?
in questo maledetto mediarecorder ci sono delle sequenza da rispettare che a volte non capisco -.-
Se le risposte ti hanno aiutato, metti un ..a te non costa nulla, ma a chi ti ha aiutato fa molto piacere riceverlo!!