|
At the crossroad of New media, Engineering, Research and Development
|
|
Nov
03
2011
Stream your Windows desktop using ffmpegI’ve already covered how to do this with vlc a while back in parts 1 followed by part 2. I just found out that something very similar in results can be done with ffmpeg. ffmpeg has recently added support for directshow filters which now allows one to capture the screen and stream and/or save it. Here is how you can do this: 1.) Grab a copy of the Screen Capture DirectShow source filter from Unreal Streaming Technologies. It’s about half way down that page. They have both the UScreenCapture X86 Edition and the X64 Edition (depending on your OS installation). I used the 64 bit filter on a Windows 7 64 bit installation. 2.) Install the filter and make sure you make the following changes to your windows registry using regedit. The default frame rate for UScreenCapture filter is 10 f/s and we need to boost this to 30 frames/sec. You need to find the key HKLM\SOFTWARE\UNREAL\Live\UScreenCapture and insert a DWORD value of 30 for FrameRate (You have to create FrameRate, it does not exist by default). Once you’ve done the registry tweak, reboot. 3.) Install the latest greatest version of ffmpeg for your windows version from Zeranoe. I grabbed the 64 bit Static build since I didn’t want to deal with libraries and such. Extract it and stick it somewhere on your hard drive. Remember the path to this folder since we will need it later. 4.) Open a command line window and cd to the directory where you extracted ffmpeg into, find the bin directory and cd into it. This is were the ffmpeg executable resides. In my case (I extracted the ffmpeg files into “Program Files” directory) it is C:\Program Files\ffmpeg-git-059707e-win64-static\bin. 5.) If you’ve made it this far, hand in there, we’re almost home. Now you need to issue the command that gets the screen streaming going. But first we need to find out the name of the Screen filter device. So issue the following command:
In the output look for a device called “UScreenCapture“. Hopefully if everything is working with the directshow filter you have a entry in the list. That’s the name of our device that we need to pass onto ffmpeg. While you’re there also look for your audio device entry as well. Mine was the truncated word “Stereo Mix (Realtek High Defini” (Yes mine was missing the end of that line). Jot that down somewhere as well. I will show you how to get audio going as well. 6.) So first step is to get video going. Assuming you have a “UScreenCapture” device (You could use another directshow filter if you like, this will work with most of them. I just used the Unreal filter for the heck of it), here is the command to start encoding and sending video:
7.) On the receiving machine you should be able to use vlc, ffmpeg or mplayer to catch the stream. In vlc simply open the Network stream rtp://@:6666 , in ffmpeg you can use the command ffplay -i udp://:6666 or using mplayer you can issue the command mplayer -framedrop -double udp://:6666 . 8.) Now to optionally add sound to the whole thing we can use this command on the encoding machine (instead of step 6). You need to know the device name for your sound card and you probably want to turn the volume down (at least initially) on the decoding machine.
|
hi,
this is a VERY great article, I managed to record my desktop already. But when I try it with a game (Its 256 colored game, full screen) it only records black screen and doesnt seems to notice the resolution change… do you have any idea?
Hi deeped,
If I had to take a wild guess the fact that the game is using a overlay would cause this issue. I would try this with a DirectX game first and see if that works. Not sure if this game is new or old, but from the sounds of it, it’s possible that it’s using overlay graphics (instead of directx). Sorry I don’t have much experience with capturing game play.
Hope this helps…..
Is there any way to catch the stream on an unjailbreaked PS3? Can we somehow feed it to some other media server, mezmmno, ORB, WMP, PS3 Media Server, in a way we can catch it from there? (Maybe this is a dumb question and the answer is implicit for everyone else…)
this is excellent. but how to stream from behind a router to another computer also behind a router?
if my computer is 192.168.0.2 and IP is 111.222.333.4444 and my friend is 192.168.0.15 and IP is 555.666.777.888
Hi Dinh,
Normally this would work — broadcasting from a private network and receiving in another private network — if the appropriate ports have been opened on the firewall/router and forwarded to the right sender/receiver behind the NAT/router. The problem in this case would be that “usually” for home type installations your upstream bandwidth is not nearly enough to send out a decent video stream to your buddies house. But assuming you do, you (as the sender) would need to send the stream to his external IP address (555.666.777.888, not the private 192 one) at a certain port (anything about 1024 should normally work) and he would have to configure his router to allow reception on that port and also configure “port forwarding/triggering” to his “private” ip address (192.168.0.15 in this case). You, the sender, really don’t have to do much configuration on your router (other that making sure that you’re streaming to HIS EXTERNAL IP address 555.666.777.888 in this case).
Good luck,
TTYL
Many
Hi,
Thanks for your tutorial. It has a lot of delay for real realtime streaming. How can i reduce much more this latency?
Thanks
I know it’s old, but can ffmpeg serve a stream accessible via an http request? I’m thinking of streaming this to a smartphone, but i have no idea how i would have the browser listen on a udp port for video data…
Hi,
If you’re talking about streaming via “hls” (ie: HTTP Live Streaming) then have a look at the following article:
http://nerdlogger.com/2010/03/05/how-to-stream-live-hdvdv-to-iphone/
You can replace the vlc parts with ffmpeg (or read one of the article links at the bottom of that post).
Good luck,
TTYL
Many
Hi Edu,
Not sure about ffmpeg (there are just too many switches in there for tweaking stuff). I’m sure there is a switch in there somewhere, but don’t know where, I would use vlc instead:
http://nerdlogger.com/2008/01/08/stream-your-linuxwindowsmac-desktop-as-video-using-vlc/
http://nerdlogger.com/2008/03/31/stream-your-linuxmacwindows-desktop-as-video-using-vlc-part-ii/
VLC has specific menu items that you can go into and change the encoder latency (don’t remember where they are right now). Once you save the settings, you can use the command line stuff from the two articles to stream.
Hope this helps…..
Good luck,
TTYL
Many
Re: latency there are a few hints/clues here: http://ffmpeg.org/trac/ffmpeg/wiki/StreamingGuide#Latency
[...] möglich sind. Dann kann der Inhalt nur gestreamt werden: zum Beispiel mit VLC oder ffmpeg. Stream your Desktop using ffmpeg Stream your Desktop as video using VLC – Teil 1 (Commandline) und Teil 2 [...]
So great. You are the an hero.