Вопрос

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

Это должно быть достаточно легко, не так ли?В файле даже есть полный пример кода. Часто задаваемые вопросы по ffmpeg.

Что ж, каналы, похоже, доставляют мне проблемы (как на моем 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.

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

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

Единственный способ объединить два FLV-файла — использовать 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-файлы?

Итак, единственный способ присоединиться к flv, который я нашел, - это использовать 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

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

д) Из-за проблемы с частотой кадров, правда, только flvs с постоянной частотой кадров (типа того, что я записывал через Фейсбук) будет правильно конвертирован в avis, но это не будет работать для FLV-файлов, которые я записываю (например, Вот этот или Вот этот).Есть ли способ сделать это и для этих FLV-файлов?

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

Это было полезно?

Решение

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

Это было.

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

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

Другие советы

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

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

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

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

cat yourVideos/*.flv >> big.flv

это, вероятно, повредит метаинформацию, поэтому после выполнения этой команды используйте «flvtool» (сценарий Ruby, который вы можете найти в Google), чтобы исправить это.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top