English 中文(简体)
streaming video to and from multiple sources
原标题:

I wanted to get some ideas one how some of you would approach this problem. I ve got a robot, that is running linux and uses a webcam (with a v4l2 driver) as one of its sensors. I ve written a control panel with gtkmm. Both the server and client are written in C++. The server is the robot, client is the "control panel". The image analysis is happening on the robot, and I d like to stream back the video from the camera to the control panel for two reasons: A) for fun B) to overlay image analysis results

So my question is, what are some good ways to stream video from the webcam to the control panel as well as giving priority to the robot code to process it? I m not interested it writing my own video compression scheme and putting it through the existing networking port, a new network port (dedicated to video data) would be best I think. The second part of the problem is how do I display video in gtkmm? The video data arrives asynchronously and I don t have control over main() in gtkmm so I think that would be tricky.

I m open to using things like vlc, gstreamer or any other general compression libraries I don t know about.

thanks!

EDIT: The robot has a 1GHz processor, running a desktop like version of linux, but no X11.

最佳回答

Gstreamer solves nearly all of this for you, with very little effort, and also integrates nicely with the Glib event system. GStreamer includes V4L source plugins, gtk+ output widgets, various filters to resize / encode / decode the video, and best of all, network sink and sources to move the data between machines.

For prototype, you can use the gst-launch tool to assemble video pipelines and test them, then it s fairly simply to create pipelines programatically in your code. Search for GStreamer network streaming to see examples of people doing this with webcams and the like.

问题回答

I m not sure about the actual technologies used, but this can end up being a huge synchronization ***** if you want to avoid dropped frames. I was streaming a video to a file and network at the same time. What I eventually ended up doing was using a big circular buffer with three pointers: one write and two read. There were three control threads (and some additional encoding threads): one writing to the buffer which would pause if it reached a point in the buffer not read by both of the others, and two reader threads that would read from the buffer and write to the file/network (and pause if they got ahead of the producer). Since everything was written and read as frames, sync overhead could be kept to a minimum.

My producer was a transcoder (from another file source), but in your case, you may want the camera to produce whole frames in whatever format it normally does and only do the transcoding (with something like ffmpeg) for the server, while the robot processes the image.

Your problem is a bit more complex, though, since the robot needs real-time feedback so can t pause and wait for the streaming server to catch up. So you might want to get frames to the control system as fast as possible and buffer some up in a circular buffer separately for streaming to the "control panel". Certain codecs handle dropped frames better than others, so if the network gets behind you can start overwriting frames at the end of the buffer (taking care they re not being read).

When you say a new video port and then start talking about vlc/gstreaming i m finding it hard to work out what you want. Obviously these software packages will assist in streaming and compressing via a number of protocols but clearly you ll need a network port not a video port to send the stream.

If what you really mean is sending display output via wireless video/tv feed that s another matter, however you ll need advice from hardware experts rather than software experts on that.

Moving on. I ve done plenty of streaming over MMS/UDP protocols and vlc handles it very well (as server and client). However it s designed for desktops and may not be as lightweight as you want. Something like gstreamer, mencoder or ffmpeg on the over hand is going to be better I think. What kind of CPU does the robot have? You ll need a bit of grunt if you re planning real-time compression.

On the client side I think you ll find a number of widgets to handle video in GTK. I would look into that before worrying about interface details.





相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?

热门标签