Problema de MediaRecorder en Android Lollipop

Estoy probando libstreaming en Android Lollipop nuevo, y este código que trabajó en la versión anterior, parece lanzar excepción.

try { mMediaRecorder = new MediaRecorder(); mMediaRecorder.setCamera(mCamera); mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); mMediaRecorder.setVideoEncoder(mVideoEncoder); mMediaRecorder.setPreviewDisplay(mSurfaceView.getHolder().getSurface()); mMediaRecorder.setVideoSize(mRequestedQuality.resX,mRequestedQuality.resY); mMediaRecorder.setVideoFrameRate(mRequestedQuality.framerate); // The bandwidth actually consumed is often above what was requested mMediaRecorder.setVideoEncodingBitRate((int)(mRequestedQuality.bitrate*0.8)); // We write the ouput of the camera in a local socket instead of a file ! // This one little trick makes streaming feasible quiet simply: data from the camera // can then be manipulated at the other end of the socket mMediaRecorder.setOutputFile(mSender.getFileDescriptor()); mMediaRecorder.prepare(); mMediaRecorder.start(); } catch (Exception e) { throw new ConfNotSupportedException(e.getMessage()); } 

La excepción lanzada es:

MediaRecorder: inicio fallido -38

 11-18 09:50:21.028: W/System.err(15783): net.majorkernelpanic.streaming.exceptions.ConfNotSupportedException 11-18 09:50:21.028: W/System.err(15783): at net.majorkernelpanic.streaming.video.VideoStream.encodeWithMediaRecorder(VideoStream.java:442) 11-18 09:50:21.028: W/System.err(15783): at net.majorkernelpanic.streaming.MediaStream.start(MediaStream.java:250) 

He tratado de comentar:

 mMediaRecorder.setOutputFile(mSender.getFileDescriptor()); 

No se lanzó ninguna excepción, pero cuando empiezo a transmitir un diálogo me dicen que necesita un archivo de salida.

Ayuda apreciada.

Presenté un informe de fallo en AOSP. https://code.google.com/p/android/issues/detail?id=80715

"Las políticas actuales de SELinux no permiten que mediaserver maneje dominios unix extraídos de aplicaciones.

En cambio, te recomiendo que crees un par de pipas ( http://developer.android.com/reference/android/os/ParcelFileDescriptor.html#createPipe () ) que está permitido por la política de Android 5.0. "No sé por qué hicieron esto o cómo se supone que supimos.

Estoy usando una versión muy antigua / modificada (no puedo decir) de la versión de libstreaming donde mediastream todavía está extendida desde mediarecorder, pero mirando la versión actual, en MediaStream probablemente querrá cambiar createSockets a algo incluyendo lo siguiente:

  ParcelFileDescriptor[] parcelFileDescriptors =ParcelFileDescriptor.createPipe(); parcelRead = new ParcelFileDescriptor(parcelFileDescriptors[0]); parcelWrite = new ParcelFileDescriptor(parcelFileDescriptors[1]); 

Luego en su flujo de video / audio

 setOutputFile(parcelWrite.getFileDescriptor()); 

Y en ese mismo cambio de archivo

  // The packetizer encapsulates the bit stream in an RTP stream and send it over the network mPacketizer.setInputStream(mReceiver.getInputStream()); mPacketizer.start(); 

a

  InputStream is = null; try{ is = new ParcelFileDescriptor.AutoCloseInputStream(parcelRead); } catch (Exception e){} mPacketizer.setInputStream(is); 

Como andreasperelli señaló en el comentario, asegúrese de cerrar ParcelFileDescriptors en closeSockets (), o dependiendo de su implementación y versión, antes de closeSockets () y antes de llamar a MediaRecorder.stop ().

En Android 6.0 Resuelvo este problema con el código

 new Thread(new Runnable() { @Override public void run() { FileInputStream inputStream = null; try { inputStream = new FileInputStream(path); } catch (FileNotFoundException e) { e.printStackTrace(); } while (true) { byte[] buffer = new byte[0]; try { buffer = new byte[inputStream.available()]; } catch (IOException e) { e.printStackTrace(); } try { inputStream.read(buffer); } catch (IOException e) { e.printStackTrace(); } try { mSender.getOutputStream().write(buffer); mSender.getOutputStream().flush(); } catch (IOException e) { e.printStackTrace(); } } } }).start(); 

Utilizo un archivo como almacenador intermediario y escribo los bytes en otra salida de thread.the MediaRecorder al archivo.

  • Grabación de vídeo de Android Vine / Instagram
  • Corregir archivo 3GP después de la transmisión desde Android Media Recorder
  • No se pueden transmitir vídeos
  • Reproducción de vídeo en TextureView
  • Reproducción de FLV / HTTP en la aplicación de Android
  • ¿Cómo saber la duración de la canción de audio antes de la transmisión?
  • Android gson streaming analizador o android.util.jsonreader?
  • H.264 Streaming en tiempo real, fecha y hora en unidades NAL?
  • Problema de transmisión en vivo de Android RTSP
  • Cargando imágenes altas de url en slivers evitando que toda la imagen se cargue en ram
  • Prácticas recomendadas para la transmisión de audio
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.