2012-02-20 3 views
0

Я разрабатываю приложение для Android. Мое требование состоит в том, чтобы реализовать rtsp потоковый сервер на Android. Он должен транслировать потоковое видео и аудио, используя MediaRecorder. Другое требование состоит в том, что я должен использовать live555 в качестве потокового сервера. То, что я получаю от MediaRecorder, находится в формате MP4 или 3GP. live555 не может передать поток. Но он может передавать аудио, если я записал его только в формате RAW_AMR. Поскольку live555 поддерживает формат «mpg» для потоковой передачи, я решил поставить кого-то среднего, кто может конвертировать «mp4» или «3gp» в «mpg», и я выбрал ffmpeg.ffmpeg - операция не разрешена ошибка при конверсии

Я портировал live555 и ffmpeg на android. ffmpeg может преобразовать файл, записанный MediaRecorder после его завершения. Но проблема в том, что ffmpeg не может сделать это одновременно. То есть, ffmpeg не может преобразовать файл во время записи. Он показывает ошибку Operation not permitted. Я попробовал то же самое на своей машине linux, используя VLC для записи вместо MediaRecorder на Android. Результат такой же. ffmpeg может конвертировать после завершения записи и не может делать то же самое во время записи.

Вот команда FFmpeg я выпустил на моей коробке Линукс:

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

ответ

2

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

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

См. Также Is it possible to play an output video file from an encoder as it's being encoded?.