Сведение видео с двух камер
Записав видео с webvybory2012, я задался вопросом: сохранить нужный мне кусок в формате, удобном для просмотра и демонстрации. Я решил вырезать два синхронных куска с обоих камер и свести их в один видео файл. В этоге должно получиться видео, в котором изображение с одной камеры находится слева, а с другой камеры — справа. При том, что разрешение изображения с одной камеры составляет 640х480, разрешение результата должно получиться 1284х480. Промежуток между изображениями составит 4 пикселя.

Так как записанная трансляция разбита на фрагменты, нужно объединить соседние.


cat vybory2012_urna_04_070455.ts vybory2012_urna_04_080455.ts > urna.ts
cat vybory2012_comisiya_04_070455.ts vybory2012_comisiya_04_080455.ts > comisiya.ts

Склеив фрагменты, можно посмотреть на них.


ffplay urna.ts
ffplay version 0.9.1.git Copyright (c) 2003-2012 the FFmpeg developers
  built on Mar  7 2012 15:34:44 with gcc 4.4.5
  configuration: --enable-gpl --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264 --enable-nonfree --enable-version3 --enable-x11grab
  libavutil      51. 41.100 / 51. 41.100
  libavcodec     54. 10.100 / 54. 10.100
  libavformat    54.  2.100 / 54.  2.100
  libavdevice    53.  4.100 / 53.  4.100
  libavfilter     2. 63.100 /  2. 63.100
  libswscale      2.  1.100 /  2.  1.100
  libswresample   0.  7.100 /  0.  7.100
  libpostproc    52.  0.100 / 52.  0.100
[mpegts @ 0x2562dc0] max_analyze_duration 5000000 reached at 5013333
[NULL @ 0x2560d20] start time is not set in estimate_timings_from_pts
Input #0, mpegts, from 'urna.ts':
  Duration: 01:59:59.98, start: 62140.198389, bitrate: 204 kb/s
  Program 1 
    Stream #0:0[0x2b](eng): Subtitle: dvb_subtitle ([6][0][0][0] / 0x0006)
    Stream #0:1[0x65]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, 640x480, 15 fps, 15 tbr, 90k tbn, 30 tbc
    Stream #0:2[0x64]: Audio: aac ([15][0][0][0] / 0x000F), 48000 Hz, mono, s16, 33 kb/s
62152.05 A-V: -0.016 fd=   1 aq= 5741KB vq= 9618KB sq=    0B f=0/0   f=0/0   

ffplay comisiya.ts
ffplay version 0.9.1.git Copyright (c) 2003-2012 the FFmpeg developers
  built on Mar  7 2012 15:34:44 with gcc 4.4.5
  configuration: --enable-gpl --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264 --enable-nonfree --enable-version3 --enable-x11grab
  libavutil      51. 41.100 / 51. 41.100
  libavcodec     54. 10.100 / 54. 10.100
  libavformat    54.  2.100 / 54.  2.100
  libavdevice    53.  4.100 / 53.  4.100
  libavfilter     2. 63.100 /  2. 63.100
  libswscale      2.  1.100 /  2.  1.100
  libswresample   0.  7.100 /  0.  7.100
  libpostproc    52.  0.100 / 52.  0.100
[mpegts @ 0x226adc0] max_analyze_duration 5000000 reached at 5013333
[NULL @ 0x2268d20] start time is not set in estimate_timings_from_pts
[mpegts @ 0x226adc0] PES packet size mismatch
Input #0, mpegts, from 'comisiya.ts':
  Duration: 01:25:45.93, start: 62395.198389, bitrate: 234 kb/s
  Program 1 
    Stream #0:0[0x2b](eng): Subtitle: dvb_subtitle ([6][0][0][0] / 0x0006)
    Stream #0:1[0x65]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, 640x480, 15 fps, 15 tbr, 90k tbn, 30 tbc
    Stream #0:2[0x64]: Audio: aac ([15][0][0][0] / 0x000F), 48000 Hz, mono, s16, 30 kb/s
62410.92 A-V: -0.013 fd=   1 aq= 4332KB vq=11027KB sq=    0B f=0/0   f=0/0   

Из вывода можно увидеть, что один начинается раньше другого. При этом первый длиннее.

Обрежем его

ffmpeg  -ss 255  -t 01:25:45.93 -i urna.ts -c copy u.ts

Я убрал 255 секунд в начале и сделали продолжительность, как у второго видео. Сделал это я без перекодирования. Если разница между фрагментами не кратна 15 (опорные кадры). Придется использовать перекодирование.

Просмотрим оба файла

ffplay u.ts & ffplay c.ts

Разницы быть не должно.

Теперь можно сводить два изображения.

Увеличу разрешение.

ffmpeg -i u.ts -c:v libx264 -c:a copy -vf "pad=1284:480:0:0" -sameq upad.ts

Данной командой я увеличил разрешение видео, поместив без масштабирования исходное видео по координатам 0х0.

Дальше я добавляю второе видео поверх первого по координатам 644:0.

ffmpeg -i upad.ts -vf "movie=comisiya.ts [over]; [main][over] overlay=644:0 [out]"  -c:v libx264 -c:a copy -sameq  urna_comisiya.ts

Имеет смысл добавить звуковую дорожку из второго видео.

ffmpeg -i urna_comisiya.ts -i comisiya.ts -map 0 -map 1:a -c copy result.ts
Из первого источника берем всё. Из второго только аудио. Копируем без перекодирования.

Получилась следующая картина


    Stream #0:0: Video: h264 ([27][0][0][0] / 0x001B), yuv420p, 1284x480, q=2-31, 15 fps, 90k tbn, 15 tbc
    Stream #0:1: Audio: aac ([15][0][0][0] / 0x000F), 48000 Hz, mono, 28 kb/s
    Stream #0:2: Audio: aac ([15][0][0][0] / 0x000F), 48000 Hz, mono, 25 kb/s
  1. 09.03.2012, 17:51 #
    Отлично.
    А как лучше собрать ускоренное видео со счетчиком голосовавших в углу?
    Например, чтобы на входе был файлик соответствий:
    {timestamp} {кол-во проголосовавших}
    Потом скриптом перегнать в субтитры, и наложить в углу видео крупным шрифтом.
    На сколько это трудозатратно?
    В идеале бы ещё что-то придумать с пропусками в видео (есть отрывки по 15-30 секунд, которые по какой-то причине не записались).

    Нужно для этого: http://bit.ly/we1CW1
  2. 14.09.2016, 1:14 #
    Скажите, а программа для записи выборов еще жива? Для этих выборов она годится? В 2012 эта программа очень пригодилась: http://papa-lyosha.livejournal.com/35817.html
  3. Анонимный
    17.09.2016, 19:23 #
    Написал автору на электронную почту такой же вопрос. Пока ответа нет.
  4. 18.09.2016, 20:51 #
    Программа не работала. Поменяли ссылки на видео.
    Подправил только сейчас.