LINUX.ORG.RU

ffmpeg, ffserver - замирает изображение через время


0

1

Настроен Motion. FFMPEG кушает из Motion поток и отдаёт его в SWF. Проблема в том, что через несколько секунд (или минут, зависит от размера буфера, установленного в ffserver.conf) картинка на странице сайта замирает и появляются артефакты... И всё... Если обновить страницу - ролик прогружается с нового места (т.е. запись идет нормально) и снова замирает через несколько секунд. Иногда нормально, иногда - ерунда описанная выше получается.

Как бы исправить?

ссылка на поток: http://85.238.99.190:8090/test.swf

конфиг:

Port 8090 
BindAddress 0.0.0.0
MaxClients 100
MaxBandwidth 20000
CustomLog /var/log/ffserver.log

<Feed feed1.ffm>
File /backup/tmp/feed1.ffm
FileMaxSize 10M
Launch ffmpeg -s 640x480 -r 10 -i http://localhost:8081/stream.mjpeg
</Feed>

<Stream test.swf>
Feed feed1.ffm
Format swf
VideoCodec flv
VideoFrameRate 10
VideoBitRate 100
VideoBufferSize 50000
VideoQMin 1
VideoQMax 5
VideoSize 640x480
NoAudio
</Stream>


Launch ffmpeg -s 640x480 -r 10 -i http://localhost:8081/stream.mjpeg

А чем докажешь, что motion 10 кадров в секунду отдает? Думаю, он не рожден для этого. Вместо webcam лучше бы video loopback device использовать.

fopen ★★
()
Ответ на: комментарий от fopen

Докажу конфигом

netcam_url http://192.168.1.240/video.cgi?showlength=1
netcam_userpass adm:pass
text_left E-SOF VIDEO
target_dir /backup/webcams/cam1
movie_filename %Y-%m-%d_%H.%M.%S
max_mpeg_time 21600
webcam_port 8081
webcam_maxrate 10
output_all off
output_motion off
output_normal off

ffmpeg_cap_new on
ffmpeg_cap_motion off
ffmpeg_timelapse 0
ffmpeg_timelapse_mode daily
ffmpeg_bps 300000
ffmpeg_variable_bitrate 0
ffmpeg_video_codec mpeg4
ffmpeg_deinterlace off
snapshot_interval 0
gap 5
threshold 10

width 640
height 480
framerate 10
quality 85
auto_brightness on
noise_level 32
brightness 0
contrast 0
saturation 0
hue 0
Kesano
() автор топика
Ответ на: комментарий от fopen

Это конфиг из threat1.conf , собственно, конфиг для камеры.

Kesano
() автор топика
Ответ на: Докажу конфигом от Kesano

Конфиг прекрасен. Но ...

webcam_maxrate - это не частота кадров, а ограничение сверху. Или так - motion webcam - это видео с переменной частотой кадров без временных меток. Это HTTP c Content-Type: multipart/x-mixed-replace. Ни каких временных ограничений. И это ты пихаешь в поток с фиксированной частотой кадров. А где преобразование частоты кадров? Его нет. Вот и рвет твой поток.

Но ведь motion дает 10 кадров в секунду, скажешь ты. Ок. достаем исходники: webcam.c

webcam_add_write(...) {
    ...
    gettimeofday(&curtimeval, NULL);
    curtime = curtimeval.tv_usec + 1000000L * curtimeval.tv_sec;
    
    while (list->next) {
        list = list->next;
        
        if (list->tmpbuffer == NULL && ((curtime-list->last) >= 1000000L / fps)) {
            list->last = curtime;
    ...
и видим, что время между кадрами вычисляется как разница между двумя соседними измерениями времени. Это постоянную частоту кадров не даст в принципе. Частота будет «скакать» (фаза измерения) и «плыть» (точность измерения). Да, буфер сгладит это, но не спасет полностью. «Не смотрите на миллисекунды свысока. та-да-да-да».

Если ffmpeg сумеет выпрямить переменную частоту кадров в постоянную, то я облажался, написав всю эту фигню.

fopen ★★
()
Ответ на: комментарий от fopen

Не совсем понял, какой из этого всего вывод? Суть проблемы в том, что ломается поток в выводе в swf.

В моём понимании, смещение пусть даже на секунду туда-обратно не должно влиять на общую картину и должно как-то сглаживаться. Наверное. И всё равно должно синхронизироваться в рамках одного из 10 кадров. И даже если 1 кадр просран, это не должно прерывать трансляцию и прекращаться запись в feed1.ffm

Ведь если мы обновляем swf-ку - видео снова работает... какое-то время...

Хотя из написанного вами я готов предположить, что на motion можно отдавать 10 кадров... а ffmpeg-ом сжирать 5 кадров в секунду. По идее тогда не будет разрыва в передаче фреймов между motion и ffmpeg и не будет влять на запись... но может ломать акуальность информации и на выходе в swf и через 10минут просмотра показывать то, что происходило на 5-й... из буфера.

Хотя я не думаю, что глупые люди писали и ту и другую софтину... А потому я не понимаю, почему ломается поток в feed.ffm ... Если пускаю на сайт поток прямиком из motion в формате mjpeg - всё работает классно. гладко и актуально. Но размер процесса браузера в оперативе быстро переваливает за 1гбайт... Это жёстко.. никто не говорит, что браузер будет сутки отображать видео (хотя в идеале - это так)... Но даже пол-часа - это проблема. Комп начинает умирать... Даже с 8гр оперативы...

А в swf такой проблемы не возникает.... Но прерывается передача потока :(

Kesano
() автор топика
Ответ на: комментарий от Kesano

Вывод - частота кадров не согласована. Частота кадров источника меньше (строго меньше) и не постоянна.

Хотя из написанного вами я готов предположить, что на motion можно отдавать 10 кадров... а ffmpeg-ом сжирать 5 кадров в секунду. По идее тогда не будет разрыва в передаче фреймов между motion и ffmpeg и не будет влять на запись... но может ломать акуальность информации и на выходе в swf и через 10минут просмотра показывать то, что происходило на 5-й... из буфера.

Замечательная идея. И ломать не должно. Лишняя задержка на время одного кадра будет наверное, и только. Поднять maxrate и тактировать на входе ffmpeg:

Launch ffmpeg -s 640x480 -r 10 -re -i http://localhost:8081/stream.mjpeg
webcam_maxrate 12 ##
И на счет браузера, я не понял. Ты отказался от прямого показа mjpeg в браузере из-за потребления памяти, а все остальное тебя устраивает? Если да, то не городи костыли, показывай сразу motion webcam, и разберись с потреблением памяти.

Да, и микроскоп, и гвозди придумали умные люди.

fopen ★★
()
Ответ на: комментарий от fopen

Спасибо за отзыв. Сейчас попробую.

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

Собственно, может быть я неправильно встраиваю его в бравзер. Мой код хардкорен и работает в Хроме :) ФФ в принципе не отображает.

<embed width="640" height="480" src="http://192.168.0.1:8081/stream.mjpeg"></embed>
Kesano
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.