Temas interesantes

Graba video y audio con Android / Save video and audio with Android

{lang: ‘es’}

Llevo varios dias liado intentando programar mi Htc Hero para poder grabar video y audio.  Después de mucho rebuscar y probar un montón de ejemplos, al final logré hacerlo funcionar usando una mezcla de varios.

He hecho dos pequeñas aplicaciones una para audio y video y otra para solo imagen.

Camcorder es el mas completo, usamos 4 archivos: Camcorder_preview.xml, camcorderpreview.java, camcorderactivity.java y androidmanifest.xml.

AndroidManifest.xml

  1.  
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  4.       package="video.camcorder"
  5.       android:versionCode="1"
  6.       android:versionName="1.0">
  7.   <uses-permission android:name="android.permission.CAMERA" />
  8.          <uses-permission android:name="android.permission.RECORD_AUDIO" />
  9.          <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">
  10.   </uses-permission>
  11.  
  12.    <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
  13.         <activity android:name=".CamcorderActivity"
  14.                   android:label="@string/app_name" >
  15.             <intent-filter>
  16.                 <action android:name="android.intent.action.MAIN" />
  17.                 <category android:name="android.intent.category.LAUNCHER" />
  18.             </intent-filter>
  19.         </activity>
  20.  
  21.     </application>
  22. </manifest>
  23.  

Camcorder_preview.xml

  1.  
  2. <?xml version="1.0" encoding="utf-8"?>
  3.  
  4. <linearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  5.  
  6.         android:orientation="vertical" android:layout_width="fill_parent"
  7.  
  8.         android:layout_height="fill_parent">
  9.  
  10.          <video.camcorder.CamcorderPreview android:id="@+id/camcorder_preview"
  11.  
  12.                 android:layout_width="fill_parent" android:layout_height="fill_parent"
  13.  
  14.                 android:enabled="false" android:focusable="true" android:clickable="true" />
  15.  
  16. </linearLayout>
  17.  
  18.  
  19.  

CamcorderActivity.java

  1.  
  2. package video.camcorder;
  3.  
  4. import android.app.Activity;
  5. import android.content.pm.ActivityInfo;
  6. import android.os.Bundle;
  7. import android.util.Log;
  8. import android.view.MotionEvent;
  9. import android.view.View;
  10. import android.view.Window;
  11. import android.view.View.OnTouchListener;
  12. public class CamcorderActivity extends Activity {
  13.  
  14. private CamcorderPreview camcorderPreview;
  15. private boolean recording = false;
  16.  
  17. /** Called when the activity is first created. */
  18.  
  19. @Override
  20.  
  21. public void onCreate(Bundle savedInstanceState) {
  22.  
  23.    super.onCreate(savedInstanceState);
  24.  
  25.     requestWindowFeature(Window.FEATURE_NO_TITLE);
  26.     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
  27.     setContentView(R.layout.camcorder_preview);
  28.  
  29.      camcorderPreview = (CamcorderPreview) findViewById(R.id.camcorder_preview);
  30.      camcorderPreview.setOnTouchListener(new OnTouchListener() {
  31.  
  32. @Override
  33.  
  34. public boolean onTouch(View view, MotionEvent event) {
  35.  
  36.           if (event.getAction() == MotionEvent.ACTION_DOWN) {
  37.                  if (recording) {
  38.                         Log.i("YO", "Saliendo.");
  39.                           camcorderPreview.getRecorder().stop();
  40.                           camcorderPreview.getRecorder().release();
  41.                           finish();
  42.                   } else {
  43.  
  44.                       recording = true;
  45.                       Log.i("YO", "Grabando.");
  46.                       camcorderPreview.getRecorder().start();
  47.                   }
  48.                       return true;
  49.              }
  50.           return false;
  51.        }
  52.      });
  53.   }
  54. }

Y la clase que realmente hace el trabajo duro.

Camcorderpreview.java:

  1. package video.camcorder;
  2.  
  3. import java.io.File;
  4. import java.io.IOException;
  5. import android.content.Context;
  6. import android.media.MediaRecorder;
  7. import android.os.Environment;
  8. import android.util.AttributeSet;
  9. import android.util.Log;
  10. import android.view.SurfaceHolder;
  11. import android.view.SurfaceView;
  12.  
  13. public class CamcorderPreview extends SurfaceView implements
  14.  
  15. SurfaceHolder.Callback {
  16. MediaRecorder recorder;
  17. SurfaceHolder holder;
  18.  
  19.     public CamcorderPreview(Context context, AttributeSet attrs) {
  20.  
  21.       super(context, attrs);
  22.  
  23.       holder = getHolder();
  24.       holder.addCallback(this);
  25.       holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  26.  
  27.       recorder = new MediaRecorder();
  28.       recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
  29.       recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
  30.       recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
  31.       recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
  32.       recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
  33.    }
  34.  
  35. @Override
  36.  
  37.   public void surfaceChanged(SurfaceHolder holder, int format, int width,
  38.  
  39.         int height) {
  40.    }
  41.  
  42. @Override
  43.  
  44. public void surfaceCreated(SurfaceHolder holder) {
  45.  
  46.       String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/data/ejemplo.mp4";
  47.       File directory = new File(path).getParentFile();
  48.  
  49.  if (!directory.exists() &amp;&amp; !directory.mkdirs()) {
  50.       try {
  51.                 throw new IOException("Path to file could not be created.");
  52.         } catch (IOException e) {
  53.                 // TODO Auto-generated catch block
  54.                 e.printStackTrace();
  55.         }
  56.     }
  57.  
  58. recorder.setOutputFile(path);
  59. recorder.setPreviewDisplay(holder.getSurface());
  60.  
  61. if (recorder != null) {
  62.  
  63.         try {
  64.                 recorder.prepare();
  65.  
  66.         } catch (IllegalStateException e) {
  67.  
  68.                 Log.e("YO.1.Illegal", e.toString());
  69.  
  70.         } catch (IOException e) {
  71.  
  72.                 Log.e("YO.2.IOException", e.toString());
  73.  
  74.         }
  75.    }
  76. }
  77.  
  78. @Override
  79.  
  80. public void surfaceDestroyed(SurfaceHolder holder) {
  81.  
  82. }
  83.  
  84. public MediaRecorder getRecorder() {
  85.  
  86.  return recorder;
  87. }
  88.  
  89. }

Y VideoRecorder que solo graba video, que es interesante si no te sirve para nada el audio.

VideoRecorder Manifest.xml

  1.  
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  4.       package="video.recorder"
  5.       android:versionCode="1"
  6.       android:versionName="1.0">
  7.     <application android:icon="@drawable/icon" android:label="@string/app_name">
  8.         <activity android:name=".VideoRecorder"
  9.                   android:label="@string/app_name">
  10.             <intent-filter>
  11.                 <action android:name="android.intent.action.MAIN" />
  12.                 <category android:name="android.intent.category.LAUNCHER" />
  13.             </intent-filter>
  14.         </activity>
  15.  
  16.     </application>
  17.  
  18.  
  19. <uses-permission android:name="android.permission.CAMERA"></uses-permission>
  20. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
  21. <uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>
  22. </manifest>
  23.  

Videorecorder.java

  1.  
  2.  
  3.  
  4. package video.recorder;
  5.  
  6. import android.app.Activity;
  7. import android.content.Context;
  8. import android.content.pm.ActivityInfo;
  9. import android.media.MediaRecorder;
  10. import android.os.Bundle;
  11. import android.util.Log;
  12. import android.view.Menu;
  13. import android.view.MenuItem;
  14. import android.view.Surface;
  15. import android.view.SurfaceHolder;
  16. import android.view.SurfaceView;
  17. import android.view.Window;
  18.  
  19.  
  20.  
  21. public class VideoRecorder extends Activity
  22. {
  23. private final static String TAG = "Playing";
  24. private MediaRecorder recorder;
  25. private Preview mPreview;
  26.  
  27. /** Called when the activity is first created. */
  28. @Override
  29. public void onCreate(Bundle savedInstanceState)
  30. {
  31. super.onCreate(savedInstanceState);
  32. requestWindowFeature(Window.FEATURE_NO_TITLE);
  33. recorder = new MediaRecorder();
  34.  
  35. recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
  36.  
  37. recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
  38. recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
  39.  
  40. mPreview = new Preview(this,recorder);
  41. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
  42. setContentView(mPreview);
  43.  
  44. }
  45.  
  46. @Override
  47. public boolean onCreateOptionsMenu(Menu menu)
  48. {
  49. menu.add(0, 0, 0, "StartRecording");
  50. menu.add(0, 1, 0, "StopRecording");
  51. return super.onCreateOptionsMenu(menu);
  52. }
  53.  
  54. @Override
  55. public boolean onOptionsItemSelected(MenuItem item)
  56. {
  57. switch (item.getItemId())
  58. {
  59. case 0:
  60. try {
  61.  
  62. recorder.start();
  63.  
  64. } catch (Exception e) {
  65. String message = e.getMessage();
  66. Log.w(TAG, e);
  67. recorder.release();
  68. }
  69. break;
  70.  
  71. case 1//GoToAllNotes
  72. recorder.stop();
  73. recorder.release();
  74. recorder = null;
  75. finish();
  76. break;
  77.  
  78. default:
  79. break;
  80. }
  81. return super.onOptionsItemSelected(item);
  82. }
  83. }
  84.  
  85. class Preview extends SurfaceView implements SurfaceHolder.Callback
  86. {
  87. SurfaceHolder mHolder;
  88. MediaRecorder tempRecorder;
  89.  
  90. Preview(Context context, MediaRecorder recorder)
  91. {
  92. super(context);
  93. tempRecorder = recorder;
  94. mHolder = getHolder();
  95. mHolder.addCallback(this);
  96. mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  97. }
  98.  
  99. public Surface getSurface()
  100. {
  101. return mHolder.getSurface();
  102. }
  103.  
  104. public void surfaceCreated(SurfaceHolder holder)
  105. {
  106. tempRecorder.setOutputFile("/sdcard/myVideo.3gp");
  107. tempRecorder.setPreviewDisplay(mHolder.getSurface());
  108. try{
  109. tempRecorder.prepare();
  110. } catch (Exception e) {
  111. String message = e.getMessage();
  112. tempRecorder.release();
  113. tempRecorder = null;
  114. }
  115. }
  116.  
  117. public void surfaceDestroyed(SurfaceHolder holder)
  118. {
  119. if(tempRecorder!=null)
  120. {
  121. tempRecorder.release();
  122. tempRecorder = null;
  123. }
  124. }
  125.  
  126. public void surfaceChanged(SurfaceHolder holder, int format, int w, int h)
  127. {
  128.  
  129. }
  130.  
  131. }
  132.  

En el foro de and.roid.es esta el hilo donde discutimos sobre este tema.

Compartelo!!
  • Print
  • Facebook
  • Twitter
  • Google Bookmarks
  • Bitacoras.com
  • LinkedIn
  • Meneame
  • RSS
  • Add to favorites
  • email
 
Añade un comentario

Comentarios (4)

  1. Gueroo Miércoles - 19 / 05 / 2010 Responder
    amo a ve amo a ve amo a veee, ke es una aplicación ke tu tas inventao no???, porke el htc hero ya grababa video antes no?, ez ke zoy codtito zabez :D
  2. Ipae Jueves - 20 / 05 / 2010 Responder
    Yo no he inventado nada,casi todos los terminales pueden grabar. Lo que yo he hecho ha sido implementar esa posibilidad como ejercicio. Solo eso. :-)
  3. jaime Miércoles - 13 / 04 / 2011 Responder
    Hola, esta aplicacion funciona para cualquier movil con Android?? Me llevé 1 semana implementando una parecida y luego me enteré que el emulador no soporta grabar video! ¬¬ Voy a probar tu codigo a ver que tal! un saludo!
    • ipaelo Miércoles - 13 / 04 / 2011 Responder
      En el que lo probé funcionaba bien. Era una HTC Hero

Añade un comentario

Flickr Photos