Как присоединиться к вебкамере FLV - PullRequest
7 голосов
/ 16 сентября 2008

Я хочу, чтобы мой веб-сайт присоединился к некоторым записям веб-камеры в файлах FLV (например, этом). Это нужно сделать в Linux без участия пользователя. Как мне это сделать? Для простоты я буду использовать тот же flv, что и оба входа, в надежде получить flv, который воспроизводит одну и ту же вещь дважды подряд.

Это должно быть достаточно просто, верно? Есть даже полный пример кода в ffmpeg FAQ .

Что ж, конвейеры, кажется, доставляют мне проблемы (как на моем Mac с Leopard, так и на Ubuntu 8.04), поэтому давайте будем простыми и будем использовать обычные файлы. Кроме того, если я не укажу скорость 15 кадров в секунду, визуальная часть играет очень быстро . Пример сценария, таким образом, становится:

ffmpeg -i input.flv -vn -f u16le -acodec pcm_s16le -ac 2 -ar 44100 \
  - > temp.a < /dev/null
ffmpeg -i input.flv -an -f yuv4mpegpipe - > temp.v < /dev/null
cat temp.v temp.v > all.v
cat temp.a temp.a > all.a
ffmpeg -f u16le -acodec pcm_s16le -ac 2 -ar 44100 -i all.a \
  -f yuv4mpegpipe -i all.v -sameq -y output.flv

Хорошо, использование этого будет работать для аудио, но я получаю видео только в первый раз. Это, похоже, относится к любому flv, который я добавляю в качестве input.flv, включая тизеры фильмов, которые поставляются с red5.

a) Почему пример сценария не работает так, как рекламируется, в частности, почему я не получаю все ожидаемое видео?

б) Почему я должен указывать частоту кадров, в то время как игрок Wimpy может играть на FLV с нужной скоростью?

Единственный способ присоединиться к двум flvs - использовать mencoder. Проблема в том, что mencoder, похоже, не присоединяется к flvs:

mencoder input.flv input.flv -o output.flv -of lavf -oac copy \
-ovc lavc -lavcopts vcodec=flv

Я получаю исключение с плавающей запятой ...

MEncoder 1.0rc2-4.0.1 (C) 2000-2007 MPlayer Team
CPU: Intel(R) Xeon(R) CPU 5150 @ 2.66GHz (Family: 6, Model: 15, Stepping: 6)
CPUflags: Type: 6 MMX: 1 MMX2: 1 3DNow: 0 3DNow2: 0 SSE: 1 SSE2: 1
Compiled for x86 CPU with extensions: MMX MMX2 SSE SSE2

success: format: 0 data: 0x0 - 0x45b2f
libavformat file format detected.
[flv @ 0x697160]Unsupported audio codec (6)
[flv @ 0x697160]Could not find codec parameters (Audio: 0x0006, 22050 Hz, mono)
[lavf] Video stream found, -vid 0
[lavf] Audio stream found, -aid 1
VIDEO: [FLV1] 240x180 0bpp 1000.000 fps 0.0 kbps ( 0.0 kbyte/s)
[V] filefmt:44 fourcc:0x31564C46 size:240x180 fps:1000.00 ftime:=0.0010
** MUXER_LAVF *****************************************************************
REMEMBER: MEncoder's libavformat muxing is presently broken and can generate
INCORRECT files in the presence of B frames. Moreover, due to bugs MPlayer
will play these INCORRECT files as if nothing were wrong!
*******************************************************************************
OK, exit
Opening video filter: [expand osd=1]
Expand: -1 x -1, -1 ; -1, osd: 1, aspect: 0.000000, round: 1
==========================================================================
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
Selected video codec: [ffflv] vfm: ffmpeg (FFmpeg Flash video)
==========================================================================
audiocodec: framecopy (format=6 chans=1 rate=22050 bits=16 B/s=0 sample-0)
VDec: vo config request - 240 x 180 (preferred colorspace: Planar YV12)
VDec: using Planar YV12 as output csp (no 0)
Movie-Aspect is undefined - no prescaling applied.
videocodec: libavcodec (240x180 fourcc=31564c46 [FLV1])
VIDEO CODEC ID: 22
AUDIO CODEC ID: 10007, TAG: 0
Writing header...
[NULL @ 0x67d110]codec not compatible with flv
Floating point exception

в) Есть ли способ для mencoder правильно декодировать и кодировать flv?

Итак, единственный способ, который я нашел, чтобы присоединиться к flvs, это использовать ffmpeg для перехода между flv и avi и использовать mencoder для присоединения к avis:

ffmpeg -i input.flv -vcodec rawvideo -acodec pcm_s16le -r 15 file.avi
mencoder -o output.avi -oac copy -ovc copy -noskip file.avi file.avi
ffmpeg -i output.avi output.flv

d) Должен быть лучший способ достичь этого ... Какой?

e) Однако из-за проблемы частоты кадров только FLV с постоянной частотой кадров (например, тот, который я записал через facebook ) будут правильно преобразованы в avis, но это не будет работать для Кажется, я записываю flvs (например, , этот или , этот ). Есть ли способ сделать это и для этих flvs?

Любая помощь будет принята с благодарностью.

Ответы [ 4 ]

4 голосов
/ 23 апреля 2009

Я подумал, что было бы неплохо научиться переписывать его на Ruby.

Это было.

Шесть месяцев спустя и три камня спустя, вот выпущенный продукт .

Я все еще буду немного над этим работать, но это работает.

0 голосов
/ 20 сентября 2008

Не знаю, будет ли это на самом деле работать, но попробуйте использовать эту команду:

cat yourVideos/*.flv >> big.flv

это, вероятно, повредит метаданные, поэтому после выполнения этой команды используйте "flvtool" (скрипт ruby, который вы можете найти с помощью Google), чтобы исправить это.

0 голосов
/ 27 сентября 2008

После размещения моего вопроса в списке рассылки mencoder, пробуя другие вещи, я решил написать свой собственный инструмент! Я начал с flvtool и после некоторого копания в коде и написания около 40 строк кода, он работает, без потери качества (поскольку нет перекодирования).

Я выпущу его как можно скорее, тем временем все желающие могут связаться со мной.

0 голосов
/ 16 сентября 2008

Здесь вы столкнетесь с очень тонкой проблемой, потому что большинство видео и аудио форматов (особенно в обычных контейнерах) используют «глобальные заголовки», то есть в начале файла они имеют один заголовок, который определяет информацию о сжатии (например, ширину высота и т. д.) для всего файла. Конкретное объединение двух потоков явно потерпит неудачу, поскольку теперь у него будет два заголовка вместо одного, и мультиплексору это может не понравиться. Преобразование в AVI, вероятно, решает проблему в вашем случае, потому что у mencoder есть код для согласования AVI - этот код правильно обрабатывает проблему заголовка.

...