FFMPEG - операция не разрешенная ошибка во время преобразования
-
28-10-2019 - |
Вопрос
Я разрабатываю приложение для Android. Мое требование состоит в том, чтобы реализовать потоковое сервер RTSP на Android. Он должен в прямом эфире видео и аудио, снятые с помощью MediaRecorder
. Анкет Другим требованием является то, что я должен использовать Live555 в качестве потокового сервера. От чего я получаю MediaRecorder
находится в формате MP4 или 3GP. Live555 не может транслировать оба. Но он может транслировать аудио, если я записал его только в формате 'RAW_AMR. С тех пор, как Live555 поддерживает формат «MPG» для потоковой передачи, я решил поставить кого -то в середину, который может преобразовать «MP4» или «3GP» в «MPG», и я выбрал FFMPEG.
Я перенес Live555 и FFMPEG в Android. FFMPEG может конвертировать файл, записанный MediaRecorder
Как только он закончится. Но проблема в том, что FFMPEG не может сделать это одновременно. То есть FFMPEG не может преобразовать файл во время записи. Это показывает Operation not permitted
ошибка. Я попробовал то же самое на своей машине Linux, используя VLC для записи вместо MediaRecorder
на Android. Результат тот же. FFMPEG может конвертировать после завершения записи, и не может сделать то же самое во время записи.
Вот команда ffmpeg, которую я выпустила на своем ящике Linux:
ffmpeg -v 9 -loglevel 99 -i test.mp4 test.mpg
Где test.mp4
это файл, в который записывается VLC mp4
формат. а также test.mpg
мой файл назначения. Ниже приведен выход FFMPEG на терминале.
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
Кто -нибудь, пожалуйста, скажите мне, что вызывает проблему? Или сценарий выше возможен с помощью FFMPEG. То есть FFMPEG может делать конверсию в то же время, что и для записи? Если это невозможно под FFMPEG, не могли бы вы предложить какие -либо альтернативные решения?
Примечание: я ставлю C
Теги, потому что, если это возможно благодаря некоторой настройке в C на ffmpeg, я готов сделать это (я так сильно хочу решение). Но, пожалуйста, предоставьте некоторые указатели в правильном направлении.
Решение
Оба 3gp
а также mp4
Форматы включают атом MOOV (кусок данных), который записывается при завершении файла. До тех пор файл неполный.
Вы можете использовать FLV
как «средний» формат. Другие форматы, которые поддерживают прямую трансляцию, также могут использоваться. Вариант -re
Может быть полезно сказать Encoder работать со скоростью потока, если это необходимо.
Смотрите также Можно ли воспроизводить выходной видеофайл из кодера, поскольку он кодируется?.