Android cámara2 api galaxia s7
Estoy escribiendo una aplicación que graba vídeo desde el teléfono y lo sube a un servidor. Funciona bien en cualquier dispositivo excepto Galaxy S7. En la grabación de Galaxy S7 se produce un archivo de vídeo con sólo audio y sin vídeo o un marco de vídeo. Esto es cierto en el archivo temporal creado en el teléfono y no solo el que se subió al servidor. Estoy usando la API de Camera2, y lo he intentado con las cámaras frontal y posterior.
He intentado con mi código, y estas dos aplicaciones de ejemplo: https://developer.android.com/samples/Camera2Video/project.html https://github.com/googlesamples/android-Camera2Video/blob/master/Application/ src / main / java / com / ejemplo / android / camera2video / Camera2VideoFragment.java
- Android, ¿cómo puedo eliminar los controles de VideoView?
- Reproduce video con canal alfa en Android?
- Marco de vídeo de captura de android
- Reproducir vídeo en pantalla completa en Android con reproductor de vídeo nativo
- Reproducción de vídeo nativa de Android con canal alfa
El archivo de vídeo producido parece estar bien, aquí está el codec de información: Stream 0 Tipo: Video Codec: H264 – MPEG-4 AVC (parte 10) (avc1) Idioma: Inglés Resolución: 960×720 Resolución de la pantalla: 960×720 Frame rate: 29.055091
Stream 1 Tipo: Codec Audio: MPEG AAC Audio (mp4a) Idioma: Inglés Canales: Estéreo Frecuencia de muestreo: 16000 Hz
- Reproduce youtube / vimeo vídeo incrustado en HTML en Android WebView
- Decodificación de flujo de vídeo en Android de DJI drone
- Fusionar archivos de video mp4 en Android
- ¿Cómo usar la decodificación acelerada por hardware en Android?
- ¿Puedo evitar el reproductor de vídeo en pantalla completa nativo con HTML5 en iPhone o Android?
- Orientación personalizada de grabación de vídeo
- Android: cambia entre la cámara frontal y posterior mientras graba un vídeo
- Peer-to-Peer de vídeo de iOS a Android?
Después de varios días de trabajo encontré la respuesta.
El Samsung Galaxy S7 (y S6 creo) tiene un error que desordena la codificación. La corrección consiste en reencodar utilizando la función siguiente.
Tenga en cuenta que necesita esta dependencia en su gradle: compile 'com.googlecode.mp4parser: isoparser: 1.1.22'
public void fixSamsungBug() { DataSource channel = null; try { channel = new FileDataSourceImpl(app.dataMgr.videoFileURL); } catch (FileNotFoundException e) { e.printStackTrace(); } IsoFile isoFile = null; try { isoFile = new IsoFile(channel); } catch (IOException e) { e.printStackTrace(); } List<TrackBox> trackBoxes = isoFile.getMovieBox().getBoxes(TrackBox.class); boolean sampleError = false; for (TrackBox trackBox : trackBoxes) { TimeToSampleBox.Entry firstEntry = trackBox.getMediaBox().getMediaInformationBox().getSampleTableBox().getTimeToSampleBox().getEntries().get(0); // Detect if first sample is a problem and fix it in isoFile // This is a hack. The audio deltas are 1024 for my files, and video deltas about 3000 // 10000 seems sufficient since for 30 fps the normal delta is about 3000 if(firstEntry.getDelta() > 10000) { sampleError = true; firstEntry.setDelta(3000); } } if(sampleError) { Log.d("gpinterviewandroid", "Sample error! correcting..."); Movie movie = new Movie(); for (TrackBox trackBox : trackBoxes) { movie.addTrack(new Mp4TrackImpl(channel.toString() + "[" + trackBox.getTrackHeaderBox().getTrackId() + "]" , trackBox)); } movie.setMatrix(isoFile.getMovieBox().getMovieHeaderBox().getMatrix()); Container out = new DefaultMp4Builder().build(movie); //delete file first! File file = new File(app.dataMgr.videoFileURL); boolean deleted = file.delete(); FileChannel fc = null; try { //fc = new FileOutputStream(new File(app.dataMgr.videoFileURL)).getChannel(); fc = new RandomAccessFile(app.dataMgr.videoFileURL, "rw").getChannel(); } catch (FileNotFoundException e) { e.printStackTrace(); } try { out.writeContainer(fc); fc.close(); } catch (IOException e) { e.printStackTrace(); } Log.d("gpinterviewandroid", "Finished correcting raw video"); } }
- ¿Cuál es el color predeterminado del fondo de diálogo de relleno?
- Compruebe la conexión a Internet desde Unity