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:
- Cómo obtener el tipo de contenido de ShoutCast 7.html
- Transmisión en vivo a android utilizando 4.1 HTML 5
- Reproducir stream de RTMP de audio en android
- Deshabilitar almacenamiento intermedio en Android VideoView / MediaController
- Android media player - cómo deshabilitar la gama de solicitud? (Rotura de audio roto en Nexus 7)
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.
- Android cómo grabar vídeo, subir, transcodificar, descargar, jugar
- Reproducir archivos multimedia desde una red telefónica WiFi
- Cualquier forma de acelerar este código. Streaming de audio en Android
- Reproducir archivos mp3 durante la descarga?
- Android - radio por internet streaming
- Transmisión de protocolo MMS con VITAMIO SDK en Android
- Android: MediaRecorder @ Código nativo
- Reproducción de vídeo desde el directorio caché de la aplicación
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.
- Cómo cambiar el color de fondo del cuadro de diálogo mediante programación?
- ¿Es posible desarrollar una aplicación para Android con Lua?