Храните, конвертируйте в видео потоковый экран Android - PullRequest
7 голосов
/ 14 декабря 2011

Я использую DDMS для получения скриншотов с моего телефона Android, и мне нужен эффективный способ для преобразования их в видео и потоковой передачи видео по сети.

У меня есть RawImage, который заполнен даннымиснимок экрана:

RawImage mRawImage;

Пока не узнаете, что я использую SWT для создания и сохранения изображения:

PaletteData paletteData = new PaletteData(
    mRawImage.getRedMask(),
    mRawImage.getGreenMask(),
    mRawImage.getBlueMask());

ImageData imageData = new ImageData(
    mRawImage.width,
    mRawImage.height,
    mRawImage.bpp,
    paletteData,
    1,
    mRawImage.data);

ImageLoader s = new ImageLoader();
s.data = new ImageData[] {imageData};
s.save("temp.jpg",SWT.IMAGE_JPEG);
  • Можете ли вы предложить способ преобразования последовательности этих изображений ввидео и затем потоковое видео?

Я нашел NanoHTTPD , который можно использовать для потоковой передачи, но как я могу конвертировать и сжимать изображения в видео?

  • Верите ли вы, что я могу сделать это с помощью ffmpeg?

Я нашел хорошее Учебное пособие для потоковой передачи веб-камеры с использованием FFMPEG и video4linux2.

Можно ли отправить bytes из RawImage в FFMPEG для преобразования в поток живого видео?

Фактический код:

$ffmpeg -f video4linux2 -i /dev/video0 http://78.47.18.19:8090/cam1.ffm

Замените его на что-то похожее на:

$ffmpeg -f video4linux2 -i **<add here java stream>** http://78.47.18.19:8090/cam1.ffm

Есть предложения?

Спасибо

PS: я ожидаю решения, которое поможет мне преобразовать изображения в сжатое видео, а затем транслировать видео по сети, чтобы воспроизвести его с помощью HTML5 или Flash Player.

1 Ответ

5 голосов
/ 01 февраля 2012

Для этого есть два способа:

1) Захват, кодирование и потоковая передача на самом устройстве и с него

или

2) Захват на устройстве,Кодирование и потоковая передача с сервера

Я не знаю всех ваших требований, но предположил бы, что вариант 2 - это путь.У вас будет лучшая производительность и более широкий набор инструментов для достижения конечной цели.

Захват Захватывайте изображения в формате JPEG почти точно так, как вы описали.За исключением добавления индекса к каждому такому, что у вас есть FILE1.JPG FILE2.JPG FILE3.JPG FILE4.jpg и т. Д.

Теперь через некоторый интервал, в зависимости от ваших требований, загрузите эти изображения на сервер.

Кодирование Используйте mencode для установки скорости сжатия с потерями следующим образом:

mencoder "./*.jpg" -mf fps=5 -o yourvideo.avi -ovc lavc -lavcopts vcodec=msmpeg4v2:vbitrate=800

Как только это будет сделано, вы можете использовать ffmpeg длясоздайте MP4 следующим образом:

ffmpeg -r 5 -b 1800 -i %01d.jpg yourvideo.mp4

Streaming Теперь для потоковой передачи mp4 по сети я бы настроил веб-страницу, например:

http://myserver/androidStream

Который загружает список воспроизведения M3U, который записывается динамически, так что он всегда указывает на самое актуальное видео для потоковой передачи.В зависимости от используемого вами плеера вы можете указать плейлист M3U на «следующий» плейлист M3U, который загрузит следующее видео.Вы также можете посмотреть альтернативные форматы списков воспроизведения, такие как ASX или PLS, в зависимости от ваших требований.

См. http://en.wikipedia.org/wiki/Advanced_Stream_Redirector и http://en.wikipedia.org/wiki/PLS_(file_format) в качестве примеров других форматов списков воспроизведения не-M3U.

Используя описанные выше общие шаги, вы получите систему, в которой устройство захватывает изображения со скоростью n изображений в минуту, а затем загружает эти изображения на сервер для кодирования.После того как эти изображения закодированы, вы можете либо транслировать фильм напрямую, ссылаясь на файл, либо вы можете настроить список воспроизведения типа M3U, который позволит проигрывателю переходить от «текущего» видео к «следующему» видео, когда оно доступно.

...