ffmpeg - операция не допускает ошибки при конвертации - PullRequest
0 голосов
/ 20 февраля 2012

Я занимаюсь разработкой приложения для Android. Мое требование заключается в том, чтобы реализовать потоковый сервер RTSP на Android. Он должен транслировать потоковое видео и аудио, записанные с использованием MediaRecorder. Еще одно требование - я должен использовать live555 в качестве сервера потоковой передачи. Что я получаю от MediaRecorder в формате MP4 или 3GP. Live555 не может передавать оба потока. Но он может передавать аудио, если я записал его только в формате 'RAW_AMR'. Поскольку live555 поддерживает формат 'mpg' для потоковой передачи, я решил поставить кого-то посередине, который может конвертировать 'mp4' или '3gp' в 'mpg', и я выбрал ffmpeg.

Я портировал live555 и ffmpeg на андроид. 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, я готов сделать это (я очень хочу получить решение). Но, пожалуйста, предоставьте несколько указателей в правильном направлении.

1 Ответ

2 голосов
/ 20 февраля 2012

Оба формата 3gp и mp4 включают в себя атом moov (порция данных), который записывается при финализации файла. До тех пор файл является неполным.

Вы можете использовать FLV в качестве "среднего" формата. Также можно использовать другие форматы, которые поддерживают потоковую трансляцию. Опция -re может быть полезна, если необходимо, чтобы кодировщик работал со скоростью потока.

См. Также Можно ли воспроизвести выходной видеофайл с кодировщика во время его кодирования? .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...