Pregunta

Estoy desarrollando una aplicación Android. Mi requisito es implementar un servidor de transmisión RTSP en Android. Tiene que transmitir en vivo videos y audio capturados usando MediaRecorder. Otro requisito es que tengo que usar Live555 como servidor de transmisión. De lo que obtengo de MediaRecorder está en formato MP4 o 3GP. Live555 no puede transmitir ambos. Pero puede transmitir audio si lo grabé solo en formato 'RAW_AMR'. Dado que Live555 admite el formato 'MPG' para la transmisión, decidí poner a alguien en el medio que pueda convertir 'MP4' o '3GP' a 'MPG', y elegí FFMPEG.

He portado Live555 y FFMPEG a Android. FFMPEG puede convertir el archivo registrado por MediaRecorder una vez que esté terminado. Pero el problema es que FFMPEG no puede hacerlo simultáneamente. Es decir, FFMPEG no puede convertir el archivo mientras se registra. Muestra un Operation not permitted error. Probé lo mismo en mi máquina Linux, usando VLC para grabar en lugar de MediaRecorder en Android. El resultado es el mismo. FFMPEG puede convertir una vez que se termina la grabación y no puede hacer lo mismo mientras se graba.

Aquí está el comando ffmpeg que emití en mi cuadro Linux:

ffmpeg -v 9 -loglevel 99 -i test.mp4 test.mpg

Dónde test.mp4 es el archivo al que se registra VLC en mp4 formato. y test.mpg es mi archivo de destino. La siguiente es la salida de FFMPEG en el terminal.

ffmpeg version 0.8.9, Copyright (c) 2000-2011 the FFmpeg developers
  built on Feb  1 2012 18:29:27 with gcc 4.6.2 20111027 (Red Hat 4.6.2-1)
  configuration: --prefix=/usr --bindir=/usr/bin --datadir=/usr/share/ffmpeg --incdir=/usr/include/ffmpeg --libdir=/usr/lib64 --mandir=/usr/share/man --arch=x86_64 --extra-cflags='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' --enable-bzlib --enable-libcelt --enable-libdc1394 --enable-libdirac --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-libopenjpeg --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxvid --enable-x11grab --enable-avfilter --enable-postproc --enable-pthreads --disable-static --enable-shared --enable-gpl --disable-debug --disable-stripping --shlibdir=/usr/lib64 --enable-runtime-cpudetect
  libavutil    51.  9. 1 / 51.  9. 1
  libavcodec   53.  8. 0 / 53.  8. 0
  libavformat  53.  5. 0 / 53.  5. 0
  libavdevice  53.  1. 1 / 53.  1. 1
  libavfilter   2. 23. 0 /  2. 23. 0
  libswscale    2.  0. 0 /  2.  0. 0
  libpostproc  51.  2. 0 / 51.  2. 0
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x1672600] Format mov,mp4,m4a,3gp,3g2,mj2 probed with size=2048 and score=100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x1672600] ISO: File Type Major Brand: isom
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x1672600] moov atom not found
test.mp4: Operation not permitted

¿Alguien me diría qué está causando el problema? O es el escenario anterior es posible por FFMPEG. Es decir, ¿FFMPEG es capaz de hacer la conversión al mismo tiempo que la de la grabación? Si FFMPEG no es posible, ¿sugeriría alguna solución alternativa?

Nota: estoy poniendo un C Etiqueta porque si es posible por algunos ajustes en C en FFMPEG, estoy listo para hacerlo (quiero la solución tan mal). Pero proporcione algunos consejos en la dirección correcta.

¿Fue útil?

Solución

Ambas cosas 3gp y mp4 Los formatos incluyen MOOV Atom (fragmento de datos) que se escribe cuando se finaliza el archivo. Hasta entonces, el archivo está incompleto.

Puedes usar FLV como el formato "medio". Otros formatos que admiten la transmisión en vivo también se pueden usar. Opción -re Puede ser útil decirle al codificador que se ejecute a la velocidad de la corriente, si es necesario.

Ver también ¿Es posible reproducir un archivo de video de salida desde un codificador, ya que se está codificando?.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top