FFMPEG - Operación no permitido Error mientras se conversa
-
28-10-2019 - |
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.
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?.