Maxim thanks for the code, its interessting that the screenshot capture takes so long.. its surprising that the encode is faster than the actual capture, i am still researching methods on how to improve this, will share my findings with you.
On Fri, Oct 25, 2013 at 9:57 AM, Maxim Solodovnik <solomax...@gmail.com>wrote: > The method should be changed as follows: > > private static final Logger log = > LoggerFactory.getLogger(CaptureScreen.class); > public void run() { > try { > while (active && !core.isReadyToRecord()) { > Thread.sleep(60); > } > Robot robot = new Robot(); > BufferedImage image = null; > while (active) { > final long ctime = System.currentTimeMillis(); > Rectangle screen = new Rectangle(spinnerX, spinnerY, spinnerWidth, > spinnerHeight); > > long start = System.currentTimeMillis(); > image = robot.createScreenCapture(screen); > log.debug(String.format("Image was captured in %s ms", > System.currentTimeMillis() - start)); > try { > timestamp += timeBetweenFrames; > start = System.currentTimeMillis(); > byte[] data = se.encode(screen, image, new Rectangle(resizeX, resizeY)); > log.debug(String.format("Image was encoded in %s ms", > System.currentTimeMillis() - start)); > > pushVideo(data, timestamp); > } catch (Exception e) { > log.error("Error while encoding: ", e); > } > final int spent = (int) (System.currentTimeMillis() - ctime); > > log.debug(String.format("Time spent %s ms; diff: %s ms", spent, > timeBetweenFrames - spent)); > if (sendCursor) { > core.sendCursorStatus(); > } > Thread.sleep(Math.max(0, timeBetweenFrames - spent)); > } > } catch (Exception e) { > log.error("Error while running: ", e); > } > } > > 1280x1024 are captured encoded for too long > Will now try to speed up encoding. > > > On Thu, Oct 24, 2013 at 8:35 PM, Alexander Brovman < > alexander.brov...@gmail.com> wrote: > >> Maxim, >> >> A) Interessting to say the very least, how did you manage to measure the >> encode and the screencapture? or what tools did you use in order to measure >> those, might come in handy for me when measuring performance. >> >> Right now i changed the sourcecode in the following way: >> 1) " timeBetweenFrames = (ScreenDimensions.quality == >> ScreenQuality.VeryHigh) ? 30 : 100;" >> >> >> 2) public void run() { >> try { >> Robot robot = new Robot(); >> BufferedImage image = null; >> while (active) { >> final long ctime = >> System.currentTimeMillis(); >> Rectangle screen = new >> Rectangle(ScreenDimensions.spinnerX, >> ScreenDimensions.spinnerY, >> >> ScreenDimensions.spinnerWidth, >> >> ScreenDimensions.spinnerHeight); >> >> image = robot.createScreenCapture(screen); >> >> try { >> timestamp += timeBetweenFrames; >> byte[] data = se.encode(screen, image, new >> Rectangle(ScreenDimensions.resizeX, >> >> ScreenDimensions.resizeY)); >> >> pushVideo(data, timestamp); >> } catch (Exception e) { >> e.printStackTrace(); >> } >> final int spent = (int) >> (System.currentTimeMillis() - ctime); >> >> if (sendCursor) { >> core.sendCursorStatus(); >> } >> Thread.sleep(Math.max(0, >> timeBetweenFrames - spent)); >> } >> } catch (Exception e) { >> e.printStackTrace(); >> } >> } >> >> I am definitely noticing a very strong improvement in terms of less video >> delay. >> using jnettop i can see that at a screen resolution of 1650x1080 it is >> approximately using between 4-8mbit for 1 user. >> So i guess the biggest issue here is the encoder, the encoder is >> definitely not efficient, i have been looking at solutions of other people >> on stackexchange in terms of algorithms. >> >> B) I have a question regarding the process, so if the screencapture takes >> place and is sent using the RTMP method/protocol to the server. Does the >> sever additionally encode the file again before sending it to the enduser? >> If so which javafiles contain those settings, because i would like to test >> if i can tweak them to reduce the delay even more by disabling the encode >> of the images/stream on the serverside and just send the files "as is". >> Although once again i fear the algo is the issue. >> >> Kind regards, >> Alexander >> >> >> On Thu, Oct 24, 2013 at 3:06 PM, Maxim Solodovnik >> <solomax...@gmail.com>wrote: >> >>> Here are my measurements: >>> Screen is captured in ~ 160-170ms >>> Encoded in ~120-200ms >>> Will try to speed up this somehow >>> >>> >>> On Thu, Oct 24, 2013 at 3:27 PM, Alexander Brovman < >>> alexander.brov...@gmail.com> wrote: >>> >>>> nevermind used the wrong ANT build. >>>> >>>> Got it to work now :) >>>> >>>> >>>> On Thu, Oct 24, 2013 at 9:11 AM, Alexander Brovman < >>>> alexander.brov...@gmail.com> wrote: >>>> >>>>> Maxim i made some changes to the code, i downloaded the source on the >>>>> server, changed the lines with nano. and then from the mainfolder simply >>>>> ran the ant command and it started compiling (albeit some errors appeared >>>>> since i only entered "ant" without any options/parameters. >>>>> >>>>> Openmeeting is working fine, i simply replaced the entire >>>>> screenshareing/ folder with the new one i just compiled... any suggestions >>>>> on what im doing wrong here? >>>>> >>>>> I am getting this error: >>>>> Unsigned Entry in resouce: slf4j-api-1.6.4.jar >>>>> >>>>> >>>>> On Thu, Oct 24, 2013 at 8:17 AM, Maxim Solodovnik < >>>>> solomax...@gmail.com> wrote: >>>>> >>>>>> I'm currently trying to modify the code to get 20+ fps (was requested >>>>>> many times, but I had no time on this :( currently I'm on vacation, will >>>>>> try to implement it) >>>>>> >>>>>> >>>>>> On Thu, Oct 24, 2013 at 10:02 AM, Alexander Brovman < >>>>>> alexander.brov...@gmail.com> wrote: >>>>>> >>>>>>> Maxim, >>>>>>> >>>>>>> Thank you for responding so quickly. The primary reason i asked is >>>>>>> because we sometimes need to output data like Financial Stock charts or >>>>>>> similar dynamic content and in a resolution size of 1650x1080. As you >>>>>>> can >>>>>>> imagine right now the delay is.. manageable, perhaps somewhere along the >>>>>>> lines of 0.5-1 second delay id say. >>>>>>> We had an independant tested saying its an average of 130ms. But for >>>>>>> fast video/changes the framerate will sometimes drop or become laggy. >>>>>>> >>>>>>> Ill try setting the timebetweenFrames to 30ms which in "ideal" >>>>>>> conditions should give me 33.333 frames per second of video. >>>>>>> As for the Thread.Sleep(XXX) not working or functioning i will >>>>>>> remove the thread.sleep(60) from the top, >>>>>>> As for the Thread.Sleep(xxx) settings i will simply remove it; BUT i >>>>>>> will leave in the "Thread.sleep(Math.max(0, timeBetweenFrames - >>>>>>> spent));" >>>>>>> since "worst" case scenario it will not be put to sleep at all since the >>>>>>> output will be 0, and "best case" scenario the thread will be put to >>>>>>> sleep >>>>>>> for 30 - 1 ms depending on how the calculation turns out. >>>>>>> >>>>>>> Perhaps it would be good to leave somekind of thread sleep in there >>>>>>> that is a static factor, from a development standpoint i would rather >>>>>>> prefer having a fixed constant in there. rather than putting the thread >>>>>>> to >>>>>>> sleep (potentially twice). Either that or im not understanding the >>>>>>> reason >>>>>>> for the first thread.sleep (or the second one). >>>>>>> Either way i will make the changes now and compile, I will report my >>>>>>> findings here if you want me to :) >>>>>>> >>>>>>> @Sebastian, >>>>>>> >>>>>>> At the time of writing this i saw you respond, so i am writing this >>>>>>> short addendum: >>>>>>> 1) Could you please comment on whether or not Thread.Sleep(xxx) >>>>>>> works? >>>>>>> 2) 2-4 frames per second and less may be great for static >>>>>>> presentations but not so much for dynamic. I understand the concerns >>>>>>> raised >>>>>>> on your behalf regarding bandwidth usage but since we have a dedicated >>>>>>> Gigabit connection we have no issues with dedicating anywhere between >>>>>>> 2-5 >>>>>>> Mbit per user. 20 Frames per second really is the minimum we are looking >>>>>>> at, i think it would be great if you presented people with an >>>>>>> option/alternative to gotowebinar. I understand that applications which >>>>>>> compile into native code will always be faster and outperform in certain >>>>>>> aspects, but when you have the motivation and perhaps the financial >>>>>>> resources to dedicate time and money into getting away from solutions >>>>>>> such >>>>>>> as GoToWebinar. >>>>>>> >>>>>>> Is there a way of "fixing" the position of the screen that the >>>>>>> viewers will see when they accept a desktop streaming broadcast from a >>>>>>> presenter? I ask this because i havent found a way to change the >>>>>>> location >>>>>>> of the Chat Bar inside a conference room yet (neither have I found a >>>>>>> way to >>>>>>> change the colors/themes to be honest, need to do some more google >>>>>>> searches). >>>>>>> >>>>>>> Kind regards, >>>>>>> Alexander >>>>>>> >>>>>>> >>>>>>> >>>>>>> On Thu, Oct 24, 2013 at 4:47 AM, seba.wag...@gmail.com < >>>>>>> seba.wag...@gmail.com> wrote: >>>>>>> >>>>>>>> Do we still have the super high quality setting in the sharing >>>>>>>> client? >>>>>>>> My problems in the past was more around the bandwidth issues then >>>>>>>> the FPS. >>>>>>>> If you do 2-4 FPS the bandwidth usage will go that up... there is >>>>>>>> probably a trick, maybe there is also something todo in the way the >>>>>>>> tiles >>>>>>>> are calculated that need to be resend. It normally should only try to >>>>>>>> resend the ones that really change. So if you show an hd movie you >>>>>>>> might >>>>>>>> see your bandwidth needs go up quite a bit. >>>>>>>> >>>>>>>> Seb >>>>>>>> >>>>>>>> >>>>>>>> 2013/10/24 Maxim Solodovnik <solomax...@gmail.com> >>>>>>>> >>>>>>>>> Hello Alexander, >>>>>>>>> >>>>>>>>> Your findings are correct :) >>>>>>>>> With the only exception: Screenshots are taken in single thread, >>>>>>>>> so there are some limitations in the speed :( >>>>>>>>> I believe Thread.sleep(xxx) doesn't work at all >>>>>>>>> I'm planning to rewrite this part And hopefully will be able to >>>>>>>>> increase FPS. >>>>>>>>> >>>>>>>>> Basic compilation steps are here: >>>>>>>>> http://openmeetings.apache.org/BuildInstructions.html >>>>>>>>> After compiling all jars in screensharing folders are being >>>>>>>>> signed, so you need to replace all of them, otherwise you will get >>>>>>>>> security >>>>>>>>> error due to different certificates >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> On Thu, Oct 24, 2013 at 3:07 AM, Alexander Brovman < >>>>>>>>> alexander.brov...@gmail.com> wrote: >>>>>>>>> >>>>>>>>>> Hi, >>>>>>>>>> >>>>>>>>>> I have two quick questions, but first of all i just wanted to say >>>>>>>>>> that Openmeetings is fantastic. I had both OpenMeetings and BBB >>>>>>>>>> Installed >>>>>>>>>> and we have decided to go with OM. >>>>>>>>>> >>>>>>>>>> I am relatively apt at programming with Python and C# but I have >>>>>>>>>> never worked with a lot of Javaapplications like these ones, so i >>>>>>>>>> have the >>>>>>>>>> following questions: >>>>>>>>>> >>>>>>>>>> *1)* From what i understand the ScreenSharing is performed by >>>>>>>>>> taking snapshots every x milliseconds. Additionally there is an >>>>>>>>>> algorithm >>>>>>>>>> in place that divides the snapshot into tiles and measures the >>>>>>>>>> changes in >>>>>>>>>> tiles, if there is a change the tile is uploaded. If this is >>>>>>>>>> correct, and i >>>>>>>>>> want a more.. "fluid" video because there will be a lot of changes, >>>>>>>>>> cant i >>>>>>>>>> simply modify the "framerate" at which the images will be compared to >>>>>>>>>> improve the output? I am well aware that this would eat into the CPU >>>>>>>>>> and >>>>>>>>>> the bandwidth but i have a Full Duplex Gbit and 2x Quadcore Xeons >>>>>>>>>> available >>>>>>>>>> to me so this is not an issue. We are trying to test for an extreme >>>>>>>>>> case of >>>>>>>>>> 500-1500 users and how to optimize the output, i think the >>>>>>>>>> developers and >>>>>>>>>> other users will be interested in seeing the results. >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> *2)* Where would these changes need to be made? So far i have >>>>>>>>>> isolated the CoreScreen.java , CaptureScreen.java and >>>>>>>>>> theScreenV1Encoder.java files that apparently contain the code which >>>>>>>>>> processes the desktop sharing. >>>>>>>>>> >>>>>>>>>> The CaptureScreen.Java has the: >>>>>>>>>> "timeBetweenFrames = (ScreenDimensions.quality == >>>>>>>>>> ScreenQuality.VeryHigh) ? 100 : 500;" setting on line 54 which >>>>>>>>>> basically >>>>>>>>>> says that if Screequality is set to very high (condition is true) >>>>>>>>>> then >>>>>>>>>> select 100 as the value for timeBetweenFrames. >>>>>>>>>> >>>>>>>>>> This variable is apparently used lateron in the >>>>>>>>>> "Thread.sleep(Math.max(0, timeBetweenFrames - spent));" on line 96, >>>>>>>>>> which >>>>>>>>>> will pause the current loop for the amountof time that is the >>>>>>>>>> difference >>>>>>>>>> between timeBetweenFrames( in our case 100ms) minus the spent time >>>>>>>>>> (which >>>>>>>>>> is defined on line 91). >>>>>>>>>> >>>>>>>>>> So in Theory if i wanted to output the screen in realtime at 20 >>>>>>>>>> or 24 frames per second which would mean that a snapshot would need >>>>>>>>>> to be >>>>>>>>>> taken every 50 milliseconds or so, would i simply need to set a >>>>>>>>>> different >>>>>>>>>> frame setting for the time between frames, something like: >>>>>>>>>> "timeBetweenFrames = (ScreenDimensions.quality == >>>>>>>>>> ScreenQuality.VeryHigh) ? *20* : 500;" >>>>>>>>>> >>>>>>>>>> Reduce the Thread.sleep(60); on line 60 to something like 20 >>>>>>>>>> milliseconds so (Thread.sleep(20);) >>>>>>>>>> and then finally remove the the last part >>>>>>>>>> "Thread.sleep(Math.max(0, timeBetweenFrames - spent));" or perhaps >>>>>>>>>> leaving >>>>>>>>>> it in? >>>>>>>>>> >>>>>>>>>> I understand that this would be a .. "wrench and hammer" approach >>>>>>>>>> since this will probably eat up quite a bit of CPU usage. I mean the >>>>>>>>>> simpler solution here clearly would be to get rid of the algorithm >>>>>>>>>> itself >>>>>>>>>> and simply rewrite it to simply output a screenshot every x >>>>>>>>>> milliseconds or >>>>>>>>>> so, but i have no idea how deep i would be messing with openmeetings >>>>>>>>>> and if >>>>>>>>>> that would/could break other parts of openmeeting that access these >>>>>>>>>> files? >>>>>>>>>> >>>>>>>>>> So would this be a workable solution that i could at least try >>>>>>>>>> out? I would ofcourse be more than happy to supply the CPU Usage >>>>>>>>>> differences. >>>>>>>>>> >>>>>>>>>> *3)* My only question would be is how would i recompile these? I >>>>>>>>>> am asking because i read somewhere in the mailinglists (or the old >>>>>>>>>> google >>>>>>>>>> groups) that it is recommended to use ANT in order to recompile >>>>>>>>>> things. >>>>>>>>>> Also what will be the output name of the .jar that is essentially >>>>>>>>>> being >>>>>>>>>> loaded for people and located on the server? >>>>>>>>>> Because all i can find on my Debian box is >>>>>>>>>> the >>>>>>>>>> /usr/lib/red5/webapps/openmeetings/screensharing/openmeetings-screenshare-2.1.1-RELEASE.jar >>>>>>>>>> file. >>>>>>>>>> >>>>>>>>>> So yeah, if somebody could help me with recompiling i would >>>>>>>>>> appreciate it! :) >>>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> WBR >>>>>>>>> Maxim aka solomax >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> Sebastian Wagner >>>>>>>> https://twitter.com/#!/dead_lock >>>>>>>> http://www.webbase-design.de >>>>>>>> http://www.wagner-sebastian.com >>>>>>>> seba.wag...@gmail.com >>>>>>>> >>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> WBR >>>>>> Maxim aka solomax >>>>>> >>>>> >>>>> >>>> >>> >>> >>> -- >>> WBR >>> Maxim aka solomax >>> >> >> > > > -- > WBR > Maxim aka solomax >