Hope you guys will help me, because I have got stuck and can't find solution for this problem by myself. I am trying to stream video from webcam to users using ffmpeg+ffserver. But I have faced with a problem:
ffmpeg gets stream from camera and pushes it to feed of ffserver:
ffmpeg -rtsp_transport tcp -i rtsp://admin:[email protected]:80 -y -vcodec libvpx http://127.0.0.1:8090/1.ffm
ffserver stream options:
<Stream 1.webm>
Feed 1.ffm
Format webm
NoAudio
#VideoCodec libvpx
#VideoSize 480x320
VideoFrameRate 24
AVOptionVideo flags +global_header
AVOptionVideo cpu-used 0
AVOptionVideo qmin 1
AVOptionVideo qmax 31
AVOptionVideo quality good
PreRoll 0
StartSendOnKey
VideoBitRate 128
</Stream>
(note, videoSize option is commented). But even with default VideoSize (160x128), ffserver doesn't respond for each request. Browser always gets:
HTTP/1.0 200 OK
Pragma: no-cache
Content-Type: video/webm
But sometimes video content is not sent.
If I uncomment VideoSize option - the same problem but much less successfull requests comparing with default video size.
ffserver log looks regular with no errors. But as you can see that sometimes it sends only headers to client:
Thu Nov 27 12:49:11 2014 127.0.0.1 - - [POST] "/1.ffm HTTP/1.1" 200 459
Thu Nov 27 12:49:25 2014 127.0.0.1 - - [POST] "/1.ffm HTTP/1.1" 200 459
Thu Nov 27 12:49:36 2014 127.0.0.1 - - [POST] "/1.ffm HTTP/1.1" 200 459
Thu Nov 27 12:50:52 2014 127.0.0.1 - - [POST] "/1.ffm HTTP/1.1" 200 459
Thu Nov 27 12:53:54 2014 127.0.0.1 - - [POST] "/1.ffm HTTP/1.1" 200 459
Thu Nov 27 13:30:19 2014 127.0.0.1 - - [GET] "/1.ffm HTTP/1.1" 200 4175
Thu Nov 27 13:30:34 2014 127.0.0.1 - - [GET] "/1.webm HTTP/1.1" 200 385731
Thu Nov 27 13:30:34 2014 127.0.0.1 - - [POST] "/1.ffm HTTP/1.1" 200 458752
Thu Nov 27 13:30:36 2014 127.0.0.1 - - [GET] "/1.ffm HTTP/1.1" 200 4175
Thu Nov 27 13:30:58 2014 127.0.0.1 - - [GET] "/1.webm HTTP/1.1" 200 493
Thu Nov 27 13:30:58 2014 127.0.0.1 - - [POST] "/1.ffm HTTP/1.1" 200 622592
Does anybody know what could it be? Actually I need to save original VideoSize for stream. I am trying to override ffserver stream options with ffmpeg using the command (passing the same parameters as in ffserver's stream):
ffmpeg -re -override_ffserver -rtsp_transport tcp -i rtsp://admin:[email protected]:80 -an -r 24 -qmin 1 -qmax 31 -cpu-used 0 -quality good -flags:v +global_header -b:v 128 -vcodec libvpx -f webm -y http://127.0.0.1:8090/1.ffm
But at the momment I still have error message 'Output file is empty, nothing was encoded'. Here is ffmpeg's output:
ffmpeg version 2.4.2 Copyright (c) 2000-2014 the FFmpeg developers
built on Oct 6 2014 17:33:05 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
configuration: --prefix=/opt/ffmpeg --libdir=/opt/ffmpeg/lib/ --enable-shared --enable-avresample --disable-stripping --enable-gpl --enable-version3 --enable-runtime-cpudetect --build-suffix=.ffmpeg --enable-postproc --enable-x11grab --enable-libcdio --enable-vaapi --enable-vdpau --enable-bzlib --enable-gnutls --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libfaac --enable-libvo-aacenc --enable-nonfree --enable-libmp3lame --enable-libx264 --enable-libx265 --enable-libxvid --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libfdk_aac --enable-libopus --enable-pthreads --enable-zlib --enable-libvpx --enable-libfreetype --enable-libpulse --enable-debug=3
libavutil 54. 7.100 / 54. 7.100
libavcodec 56. 1.100 / 56. 1.100
libavformat 56. 4.101 / 56. 4.101
libavdevice 56. 0.100 / 56. 0.100
libavfilter 5. 1.100 / 5. 1.100
libavresample 2. 1. 0 / 2. 1. 0
libswscale 3. 0.100 / 3. 0.100
libswresample 1. 1.100 / 1. 1.100
libpostproc 53. 0.100 / 53. 0.100
Guessed Channel Layout for Input Stream #0.1 : mono
Input #0, rtsp, from 'rtsp://admin:[email protected]:80':
Metadata:
title : RTSP Session/2.0
Duration: N/A, start: 0.000000, bitrate: 128 kb/s
Stream #0:0: Video: h264 (High), yuvj420p(pc, bt709), 1280x720 [SAR 1:1 DAR 16:9], 25 fps, 100 tbr, 90k tbn, 50 tbc
Stream #0:1: Audio: pcm_alaw, 16000 Hz, 1 channels, s16, 128 kb/s
[swscaler @ 0x197f7a0] deprecated pixel format used, make sure you did set range correctly
[libvpx @ 0x1a0c080] Bitrate 128 is extremely low, maybe you mean 128k
[libvpx @ 0x1a0c080] v1.3.0
The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s
Output #0, webm, to 'http://127.0.0.1:8090/1.ffm':
Metadata:
title : RTSP Session/2.0
encoder : Lavf56.4.101
Stream #0:0: Video: vp8 (libvpx), yuv420p, 480x320 [SAR 32:27 DAR 16:9], q=1-31, 0 kb/s, 24 fps, 1k tbn, 24 tbc
Metadata:
encoder : Lavc56.1.100 libvpx
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> vp8 (libvpx))
Press [q] to stop, [?] for help
frame= 33 fps= 22 q=0.0 size= 0kB time=00:00:00.00 bitrate=N/A dup=0 droframe= 43 fps= 22 q=0.0 Lsize= 0kB time=00:00:00.00 bitrate=N/A dup=0 drop=1
video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used)
Received signal 2: terminating.
Thanks in advance.
As far as I understand you want to:
To do this you need to:
Your case requires:
After launching the server type in ffmpeg command:
ffmpeg -i rtsp://admin:[email protected]:80 -c:v libvpx -b:v 800 -an htt_p://xxx.xx.xxx.xxx:SERVER_HTTP_PORT/feed1.ffm
[remove '_' from http]
Please note that if your camera supports more than one resolution, ffmpeg will choose the worst if you don't specify which one you need. You can check supported resolution in web cams by typing
ffmpeg -f v4l2 -list_formats all -i /dev/video0
. This should also work for an ip cam if you replace/dev/video0
withrtsp://admin:[email protected]:80
.Also remember that video bit rate (-b:v) depends on the frame size.