Докладываю первые результаты тестирования.
1. Должен ли udpxrec сам уходить в бэкграунд? У меня не уходит, приходится запускать с "&"
2. Файлы пишет, но в конце записи вываливается с ошибкой: "Segmentation fault" если не в бэкграунде:
и "Bus error" если в бэкграунде:Code:root@OpenWrt:~# /opt/bin/udpxrec -v -b 23:29.00 -e +0:01.00 -B 1024 -c 233.32.210.1:5050 /opt/tmp/out4.ts 2008-03-25 23:28:12.524487 MSK [48] seconds before recording begins 2008-03-25 23:29:00.532720 MSK Recording will end in [60] seconds 2008-03-25 23:29:00.592884 MSK Recording to file=[/opt/tmp/out4.ts] started. 2008-03-25 23:30:00.532160 MSK Recording to file=[/opt/tmp/out4.ts] stopped at filesize=[9073956] bytes Segmentation fault root@OpenWrt:~#
Code:root@OpenWrt:~# /opt/bin/udpxrec -v -b 23:32.00 -e +0:01.00 -B 1024 -c 233.32.210.1:5050 /opt/tmp/out5.ts & root@OpenWrt:~# 2008-03-25 23:32:01.839769 MSK Recording will end in [59] seconds 2008-03-25 23:32:01.844606 MSK Recording to file=[/opt/tmp/out5.ts] started. 2008-03-25 23:33:00.837499 MSK Recording to file=[/opt/tmp/out5.ts] stopped at filesize=[9083172] bytes [1] + Bus error /opt/bin/udpxrec -v -b 23:32.00 -e +0:01.00 -B 1024 -c 233.32.210.1:5050 /opt/tmp/out5.ts root@OpenWrt:~#
Last edited by ega2002; 25-03-2008 at 21:11.
Добавление к моему предыдущему посту:
Записанные файлы vlc не воспроизводит: черный экран с изредка проскакивающими квадратами и полосами с изображением.
Павел, ложная тревога, приношу извинения за предыдущие 2 поста : все дело было в ключе -B 1024. Оказалось, что я неверно понимал его формат (надо было писать -B 1024K). Видимо, буфер в 1024 байта был слишком мал для записи на внешнюю USB флешку. Забавно, что при этом udpxy с буфером 1024 байта работает нормально.
Сейчас сообщений об ошибках нет и файлы пишутся нормальные. Мое замечание относительно ухода в бэкграунд остается в силе.
Не совсем уж и ложная - просто в udpxy параметр -B принимал значение в килобайтах (соответственно и задавали Вы 1024 килобайта, а не байта), а в udpxrec по умолчанию байты. Теперь оба принимают байты по умолчанию и понимают спецификаторы размера Kb, Mb, и т.д.
В udpxrec изначально не планировался режим демона, поэтому он и не уходил в фон. Теперь уходит, но только с указанием pidfile.
Выложена сборка 36 с исправлениями: полный список, как всегда, в CHANGES.
Спасибо всем, кто тестирует.
Хочу еще поделиться своими впечатлениями о работе udpxrec.
Пока мне не удается получить запись потока совсем без артефактов: при проигрывании записанных файлов периодически (раз в несколько секунд) наблюдаются кратковременные выпадения изображения, как будто бы поток прерывается на доли секунды. Подозреваю, что это может быть связано вовсе не c udpxrec, а с особенностями конфигурации роутера, точнее с количеством свободной памяти, подсистемой записи на USB диск и т.п. У меня сейчас к роутеру подключена флешка, а не HDD, и отключен своп, возможно это тоже как-то влияет на процесс. Надо, чтобы кто-нибудь еще протестировал на прошивке Олега и поделился результатами.
З.Ы. Все-таки, запись IPTV программ - это функция не роутера, а мультимедиа ПК, подключенного к этому роутеру. ИМХО.
Подозреваю, что дело тут в дорогостоящей операции записи файла на накопитель, у которого в данном случае скорость записи просто сверхнизкая. Сбои, возможно, наблюдаются при "выпадении" кадров, пропущенных во время записи (считывание и запись в udpxrec - последовательные и синхронные операции).
Попробую, как и Вы, писать на флэш и проанализировать потери пакетов (через sequence numbers в RTP пакетах).
Если воспроизведу дефект и сведу его к задержке при записи, останется перейти на асинхронную запись в файл (не факт, впрочем, что спасёт при интенсивном потоке и такой медленной скорости записи как на флэш).
Пока что, попробуйте вариировать значения параметров -B buffer_len и -R max_records. Первый установит размер буфера получаемых данных, а второй обеспечит сброс этого буфера каждые max_records пакетов. В случае отсутствия параметра -R max_records - udpxrec (и udpxy) заполняют буфер "до упора", т.е., установив -B 1024K Вы обеспечиваете запись ~ 1Mb на диск на каждые 699 (1 Mb/1500 для RTP) входных пакетов. Тут, возможно, и проскок. Поставьте значением -R 1 - и Вы полностью отмените буферизирование записи (при этом входной буфер сокета всё равно будет установлен в соответствие с значением -B). Если версия верна, то при -R 1 задержки будут появляться чаще, но, возможно, не столь резко.
З.Ы. Все-таки, запись IPTV программ - это функция не роутера, а мультимедиа ПК, подключенного к этому роутеру. ИМХО.
Согласен, в принципе - и писать желательно на устройство с сравнительно скоростной записью.
Эксперименты с параметрами -B и -R ни к чему не привели, сбои в записанных файлах появляются с интервалом около 5 сек независимо от их значений. Зато я обнаружил, что на результат записи кардинально влияет режим монтирования usb-флешки. У меня флешка автоматом монтируется с опцией async. Если же смонтировать ее с опцией sync, то количество выпадений резко возрастает, т.е. по видимому роутер банально не успевает писать в синхронном режиме.
Становится понятно, с чем связан 5-секундный интервал сбоев в асинхронном режиме: роутер заполняет внутренний системный буфер записи, потом сбрасывает его на диск, в этот момент и происходит сбой.
Возможно, если вместо флешки будет HDD, результат будет иным, но сейчас у меня нет возможности это проверить.
Все вышесказанное относится к установленной у меня OpenWRT Kamikaze 7.09 на роутере WL-500gp. На прошивке Олега все может быть по-другому.
Добавление к моему предыдущему посту:
Перейдя на синхронный режим записи на флешку, увидел-таки зависимость качества записи от параметра -R и добился отсутствия сбоев записи при его значении -R 128 (при -R 32 еще наблюдаются сбои). Таким образом, претензии программе udpxrec снимаются , и все определяется скоростью работы usb-дисковой подсистемы роутера.
Last edited by ega2002; 27-03-2008 at 20:42. Reason: Грамматические ошибки
К вопросу о том, что udpxrec должен бы был работать не на роутере, а на мультимедиа PC:
Сборка 37 добавила поддержку для cygwin32. Серьёзно под cygwin я не тестировал - пробуйте кто захочет.
Подскажите пожалуйста, как простому смертному устанавливать обновленные версии udpxy, без смены (обновления) прошивки?
Мне фатально не везёт:
Making a [lean] version (minimal size)
make[2]: Entering directory `/root/2001/src/gateway/udpxy'
mipsel-uclibc-gcc -W -Wall -Werror --pedantic -DNDEBUG -c udpxy.c -o udpxy.o
mipsel-uclibc-gcc -W -Wall -Werror --pedantic -DNDEBUG -c rparse.c -o rparse.o
mipsel-uclibc-gcc -W -Wall -Werror --pedantic -DNDEBUG -c util.c -o util.o
mipsel-uclibc-gcc -W -Wall -Werror --pedantic -DNDEBUG -c prbuf.c -o prbuf.o
mipsel-uclibc-gcc -W -Wall -Werror --pedantic -DNDEBUG -c ifaddr.c -o ifaddr.o
ifaddr.c: In function `if2addr':
ifaddr.c:101: structure has no member named `sa_len'
make[2]: *** [ifaddr.o] Error 1
make[2]: Leaving directory `/root/2001/src/gateway/udpxy'
make[1]: *** [lean] Error 2
make[1]: Leaving directory `/root/2001/src/gateway/udpxy'
make: *** [udpxy] Error 2