LINUX.ORG.RU

ffmpeg ffserver(avserver) стриминг видео в rtsp

 , , , ,


2

1

Имеется kubuntu 12.10 Пытаюсь стримить видео с вебкамеры в флеш и RTSP. Конфиги взяты с хабра и подправлены (http://habrahabr.ru/post/78677/): ==============================================================

Port 8099

RTSPPort 5454

BindAddress 0.0.0.0

MaxClients 100

MaxBandwidth 20000

NoDaemon

# Фид, надо запомнить feed.ffm, он нам потребуется при запуске

ffmpeg

<Feed feed.ffm>

File /tmp/feed.ffm

FileMaxSize 3M

Launch avconv -s 352x288 -r 20 -f video4linux2 -i /dev/video0 -pix_fmt yuv420p

</Feed>

<Stream test.flv>

# Ранее объявленный фид

Feed feed.ffm

Format flv

VideoCodec mjpeg

VideoFrameRate 25

VideoBufferSize 80000

VideoBitRate 200

# Качество видео от 1 до 31, 1 == отлично 31 == фи!

VideoQMin 1

VideoQMax 5

# Разрешение, везде должно быть одинаково!

VideoSize 640x480

PreRoll 1

Noaudio

</Stream>

# Флешка test.swf для просмотра трансляции

<Stream test.swf>

Feed feed.ffm

# Будет запускаться в Adobe Flash Player

Format swf

VideoCodec mjpeg

VideoFrameRate 25

VideoBufferSize 50000

VideoBitRate 100

VideoQMin 1

VideoQMax 5

VideoSize 640x480

PreRoll 0

Noaudio

</Stream>

# RTSP

<Stream test.rtsp>

Feed feed.ffm

Format rtp

VideoCodec libx264

VideoFrameRate 20

VideoBufferSize 2000

VideoBitRate 800

VideoQMin 1

VideoQMax 31

# Разрешение, везде должно быть одинаково!

VideoSize 640x480

Noaudio

</Stream> ============================================================

Долго мучился с параметрами, домучился до того, что в фиде запускается камера(видно по индикации светодиода). Но при попытке подключения любым из плееров(vlc, gst-launch, avplay) идет ожидание и видео нет(но ошибок не показывает). При заходе на страницу http://localhost:8090/test.swf только загрузка, ничего нет.

так собственно кто-нибудь может помочь разобраться в чем проблема?

А задача вобщем то в том, что бы стримить видео с вебкамеры(или другой usb) в rtsp потоке. Что только не пробовал.

VLC Стримит, но есть задержка в секунды 2, изменение разних параметров не помогло, вот строка которой запускаю, если вдруг тут есть варианты:

cvlc v4l2:///dev/video0:v4l2-fps=25:v4l2-caching=1 --sout '#transcode{vcodec=h264,venc=x264{tune=zerolatency,preset=ultrafast},vb=300,scale=1,width=320,height=200,fps=25,noaudio}:rtp{url=192.168.1.13,port=7777,sdp=rtsp://192.168.1.13:7777/stream}' --rtsp-host=192.168.1.13-caching=1 --dshow-caching=0 -I dummy

GStreamer тоже пробовал, собирал тестовый пример ихнего gst-rtsp-server, но там какието проблемы с rtsp_media_factory, я ставил такие параметры: gst_rtsp_media_factory_set_launch (factory, "( videotestsrc is-live=1 ! x264enc ! rtph264pay name=pay0 pt=96 )"); да и не только такие, много что перепробовал, всё время выдает ошибки при запросе на подобии этой(чаще всего это):

(GstRtspServer_test:10077): GLib-GObject-CRITICAL **: g_object_ref: assertion `G_IS_OBJECT (object)' failed

** (GstRtspServer_test:10077): CRITICAL **: gst_rtsp_media_factory_get_auth: assertion `GST_IS_RTSP_MEDIA_FACTORY (factory)' failed

Также смотрел на livemedia, но гугление на данную тему не особо что показал(если есть нормальные примеры как это дело можно провернуть, то буду признателен).

Вобщем бьюсь не первые сутки, если есть мысли, поделитесь пожалуйста.

P.S./извиняюсь за объемный пост

UPD: по ffmpeg Если запустить feed отдельным процессом (вместо Launch ...) строкой avconv -s 640x480 -r 20 -f video4linux2 -i /dev/video0 -pix_fmt yuv420p -f h264 http://localhost:8090/feed.ffm

то в логах вот что выдает:

avconv version 0.8.6-4:0.8.6-0ubuntu0.12.04.1, Copyright (c) 2000-2013 the Libav developers built on Apr 2 2013 17:00:59 with gcc 4.6.3 [video4linux2 @ 0x8c783e0] The driver changed the time per frame from 1/20 to 1/30 [video4linux2 @ 0x8c783e0] Estimating duration from bitrate, this may be inaccurate Input #0, video4linux2, from '/dev/video0': Duration: N/A, start: 482284.519933, bitrate: 147456 kb/s Stream #0.0: Video: rawvideo, yuyv422, 640x480, 147456 kb/s, 30 tbr, 1000k tbn, 30 tbc [buffer @ 0x8c7c4c0] w:640 h:480 pixfmt:yuyv422 [avsink @ 0x8c7a420] auto-inserting filter 'auto-inserted scaler 0' between the filter 'src' and the filter 'out' [scale @ 0x8c73a40] w:640 h:480 fmt:yuyv422 -> w:640 h:480 fmt:yuv420p flags:0x4 [libx264 @ 0x8c79660] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle SSE4.2 AVX [libx264 @ 0x8c79660] profile Main, level 3.0 Output #0, h264, to 'http://localhost:8090/feed.ffm': Metadata: encoder : Lavf53.21.1 Stream #0.0: Video: libx264, yuv420p, 640x480, q=-1--1, 90k tbn, 30 tbc Stream mapping: Stream #0:0 -> #0:0 (rawvideo -> libx264) Press ctrl-c to stop encoding non-strictly-monotonic PTS size= 86kB time=1.90 bitrate= 369.7kbits/s its/s [libx264 @ 0x8c79660] non-strictly-monotonic PTS Last message repeated 1 times

Application provided invalid, non monotonically increasing dts to muxer in stream 0: 333000 >= 333000 [h264 @ 0x8c78f60] Application provided invalid, non monotonically increasing dts to muxer in stream 0: 342000 >= 342000

Application provided invalid, non monotonically increasing dts to muxer in stream 0: 351000 >= 351000 non-strictly-monotonic PTS size= 277kB time=5.93 bitrate= 382.0kbits/s [libx264 @ 0x8c79660] non-strictly-monotonic PTS Last message repeated 1 times

И так далее.

Если убрать -f h264 и запускать так:

avconv -s 640x480 -r 20 -f video4linux2 -i /dev/video0 -pix_fmt yuv420p http://localhost:8090/feed.ffm

то логи не выдают предупреждений, но видео все равно нет, но запуск через avplay командой avplay rtsp://localhost:5454/test.rtsp выдает вот что

avplay version 0.8.6-4:0.8.6-0ubuntu0.12.04.1, Copyright (c) 2003-2013 the Libav developers built on Apr 2 2013 17:00:59 with gcc 4.6.3 [rtsp @ 0xafd00480] UDP timeout, retrying with TCP

тут виснет и после остановки выдает:

^C[rtsp @ 0xafd00480] Could not find codec parameters (Video: h264) [rtsp @ 0xafd00480] Estimating duration from bitrate, this may be inaccurate rtsp://localhost:5454/test.rtsp: could not find codec parameters

Мда, короче таки получилось настроить, но как оказалось ffserver полная фигня для этих целей. Не стабильно работает и файл буфера сам не удаляет.

Переключился на GStreamer 0.10, переустановив все либы заново от него завелся тестовый пример. Путем некоторых поисков и манипуляций получлось завести камеру. Код сервера таков:

#include <gst/gst.h>

#include <gst/rtsp-server/rtsp-server.h>

int main (int argc, char *argv[])

{

GMainLoop *loop;

GstRTSPServer *server;

GstRTSPMediaMapping *mapping;

GstRTSPMediaFactory *factory;

gst_init (&argc, &argv);

loop = g_main_loop_new (NULL, FALSE);

server = gst_rtsp_server_new ();

mapping = gst_rtsp_server_get_media_mapping (server);

factory = gst_rtsp_media_factory_new ();

// gst_rtsp_media_factory_set_launch (factory, // "( " // «v4l2src device=/dev/video0 » // "! video/x-raw-yuv,width=352,height=288,framerate=30/1 " // "! ffmpegcolorspace " // "! videoscale " // "! ffenc_mpeg4 " // "! rtpmp4vpay pt=96 name=pay0 " // ")");

gst_rtsp_media_factory_set_launch (factory, "( " «v4l2src device=/dev/video0 » "! video/x-raw-yuv,width=640,height=480,framerate=30/1 " "! ffmpegcolorspace " "! videoscale " "! x264enc " "! rtph264pay pt=96 name=pay0 " ")");

// Рабочий пример тестового потока // gst_rtsp_media_factory_set_launch (factory, // "( videotestsrc is-live=1 ! x264enc ! rtph264pay name=pay0 pt=96 )");

gst_rtsp_media_factory_set_shared (factory, TRUE);

gst_rtsp_media_mapping_add_factory (mapping, «/test», factory);

g_object_unref (mapping);

gst_rtsp_server_attach (server, NULL);

g_main_loop_run (loop);

return 0;

}

Запуск с енкодером ffenc_mpeg4 вроде бы работает, но в vlc изображения не показывает, хотя стрим идет. В ffplay запускается и работает, но задержка в 1-1.5 сек. и на старте выдает предупреждение

[mpeg4 @ 0xb0e3e8a0] warning: first frame is no keyframe

С енкодером h264 в VLC запускается и работает, но задержка секунды 2-3. В ffplay если запустить, то тоже не без ошибок:

[h264 @ 0xb0f005e0] Missing reference picture, default is 0 f=0/0 [h264 @ 0xb0f005e0] decode_slice_header error [h264 @ 0xb0f005e0] Missing reference picture, default is 2 [h264 @ 0xb0f005e0] Missing reference picture, default is 4 f=0/0 Input #0, rtsp, from 'rtsp://127.0.0.1:8554/test':sq= 0B f=0/0 Metadata: title : Session streamed with GStreamer comment : rtsp-server Duration: N/A, start: 0.063978, bitrate: N/A Stream #0:0: Video: h264, yuv420p, 640x480 [SAR 1:1 DAR 4:3], 30 tbr, 90k tbn, 1073741824.00 tbc [h264 @ 0xb569cf80] Missing reference picture, default is 0 [h264 @ 0xb569cf80] decode_slice_header error [h264 @ 0xb0fe88c0] Missing reference picture, default is 2 [h264 @ 0xb54cb720] Missing reference picture, default is 4

Вопрос остался такой: из-за чего эти ошибки могут быть и как уменьшить задержку?

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

Blastbit ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.