Domanda

Sto sviluppando un'app Android. Il mio requisito è che implementare un server di streaming RTSP su Android. Deve video in streaming live e audio catturati utilizzando MediaRecorder. Un altro requisito è che devo usare Live555 come server di streaming. Da cosa ottengo MediaRecorder è in formato MP4 o 3GP. Live555 non può essere in grado di trasmettere in streaming entrambi. Ma può trasmettere l'audio se l'ho registrato solo in formato 'raw_amr'. Dall'elaborazione di Live555 di supporto "MPG" per lo streaming, ho deciso di mettere qualcuno in mezzo che può convertire "MP4" o "3GP" in "MPG" e ho scelto FFMPEG.

Ho portato Live555 e FFMPEG su Android. FFMPEG è in grado di convertire il file registrato da MediaRecorder Una volta finito. Ma il problema è che FFMPEG non può essere in grado di farlo contemporaneamente. Cioè, FFMPEG non è in grado di convertire il file durante la registrazione. Mostra un Operation not permitted errore. Ho provato lo stesso sulla mia macchina Linux, usando VLC per registrare invece di MediaRecorder su Android. Il risultato è lo stesso. FFMPEG è in grado di convertire una volta terminata la registrazione e non è in grado di fare lo stesso durante la registrazione.

Ecco il comando ffmpeg che ho emesso sulla mia casella Linux:

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

Dove test.mp4 è il file in cui VLC sta registrando mp4 formato. e test.mpg è il mio file di destinazione. Di seguito è riportato l'output di FFMPEG sul terminale.

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

Qualcuno mi direbbe cosa sta causando il problema? O è lo scenario sopra è possibile da FFMPEG. Cioè, FFMPEG è in grado di fare la conversione contemporaneamente a quella della registrazione? Se non è possibile da FFMPEG, suggeriresti soluzioni alternative?

Nota: sto mettendo un C Tag perché se possibile da qualche modifica in C su FFMPEG, sono pronto a farlo (voglio la soluzione così male). Ma per favore fornisci alcuni suggerimenti alla giusta direzione.

È stato utile?

Soluzione

Tutti e due 3gp e mp4 I formati includono Moov Atom (blocco dei dati) che viene scritto quando il file viene finalizzato. Fino ad allora il file è incompleto.

Puoi usare FLV come il formato "medio". Anche altri formati che supportano lo streaming live possono essere utilizzati. Opzione -re può essere utile dire a Encoder da eseguire alla velocità di flusso, se necessario.

Guarda anche È possibile riprodurre un file video di output da un encoder mentre viene codificato?.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top