ffmpeg – erreur d’opération non autorisée lors de la conversion

Je développe une application Android. Mon exigence est que pour mettre en œuvre un serveur de streaming RTSP sur Android. Il doit diffuser en continu la vidéo et l’audio capturés avec MediaRecorder . Une autre exigence est que je dois utiliser live555 comme serveur de diffusion en continu. Ce que je reçois de MediaRecorder est au format MP4 ou 3GP. live555 ne peut pas diffuser les deux. Mais il peut diffuser du son si je l’ai enregistré uniquement au format «RAW_AMR». Depuis que live555 prend en charge le format ‘mpg’ pour la diffusion en continu, j’ai décidé de placer quelqu’un au milieu qui peut convertir ‘mp4’ ou ‘3gp’ en ‘mpg’ et j’ai choisi ffmpeg.

J’ai porté live555 et ffmpeg sur Android. ffmpeg est capable de convertir le fichier enregistré par MediaRecorder une fois terminé. Mais le problème est que ffmpeg ne peut pas le faire simultanément. C’est-à-dire que ffmpeg ne peut pas convertir le fichier pendant l’enregistrement. Il montre une erreur d’ Operation not permitted . J’ai essayé la même chose sur ma machine Linux, en utilisant VLC pour enregistrer à la place de MediaRecorder sur Android. Le résultat est identique. ffmpeg est capable de convertir une fois que l’enregistrement est terminé et ne peut pas faire la même chose pendant l’enregistrement.

Voici la commande ffmpeg que j’ai émise sur ma machine Linux:

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

test.mp4 est le fichier dans lequel VLC enregistre au format mp4 . et test.mpg est mon fichier de destination. Ce qui suit est la sortie par ffmpeg sur le 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-ssortingpping --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 

Quelqu’un voudrait-il me dire ce qui cause le problème? Ou est le scénario ci-dessus est possible par ffmpeg. En d’autres termes, est-ce que ffmpeg est capable de faire la conversion en même temps que celle de l’enregistrement? Si ce n’est pas possible avec ffmpeg, pourriez-vous suggérer des solutions alternatives?

NOTE: Je mets une balise C parce que si cela est possible par quelques modifications dans C sur ffmpeg, je suis prêt à le faire (je veux tellement la solution). Mais s’il vous plaît fournir des indications sur la bonne direction.

Les formats 3gp et mp4 incluent un atome de Moov (bloc de données) écrit lors de la finalisation du fichier. Jusque-là, le fichier est incomplet.

Vous pouvez utiliser FLV comme format “intermédiaire”. D’autres formats prenant en charge la diffusion en direct peuvent également être utilisés. L’option -re peut être utile pour indiquer à l’encodeur de fonctionner à la vitesse du stream, si nécessaire.

Voir aussi Est-il possible de lire un fichier vidéo de sortie à partir d’un encodeur pendant son encodage? .