sabaatworld / HyperionScreenCap

Screen capture program for Hyperion ambilight. Updated to support DirectX 11, multiple displays and multiple Hyperion servers.
MIT License
118 stars 18 forks source link

Request : simultaneous multiscreen #46

Open AmbiMod opened 3 years ago

AmbiMod commented 3 years ago

Hi sabaat.

Thank you for your release of HSC.

I saw that we can use different screen but not simultaneous so I would like to know if you can adjust your software to use multi screen at the same time like Synlight does https://github.com/Synless/SynLight

This is the only one I found, Ambibox, prismatik or Adrilight don’t do the same and I think it will be a good thing if we can use this feature with Hyperion NG or HyperHDR.

I don’t know if it’s possible but it will be a great addon, a lot of people ask for this.

Thank you again for what you provided.

See you my friend. 🙂

Regards.

sabaatworld commented 3 years ago

The software does capture multiple screens at the same time. Does it not work for you?

AmbiMod commented 3 years ago

Ah ok.

Someone told me that he can’t do it on his installation, he already have 3 screens with extended desktop option enabled ( I cannot test on my side, i only have 1 screen ) and can only make working one at the time.

If you confirm me that we can do it, you can close or delete this issue 😁 or maybe not, I have another question.

Your software didn’t work with DRM apps, you can do something for that ? Or we need to still use navigator to bypass it.

Thanks.

Happy New Year’s Eve

sabaatworld commented 3 years ago

Actually I have never been able to test out multi screen with Hyperion. I've only tested that the software has the ability to support that.

I thought there is no way to bypass DRM. Can you tell me more about navigator?

a14219 commented 3 years ago

Hi there,

I'm struggling with the same issue and I have no idea how to grab 3 screens at the same time. When I configure a new connection, I need to specify a Monitor Index, and it's impossible to choose more than one. image

If I make 3 different instances, one for each monitor, how do I send the data to Hyperion? Do I need to have a different RPi for each screen? Can Hyperion receive 3 different buffers and merge them to control one large LED Strip? My setup would be something like this:

image

Is it even possible with current software?

AmbiMod commented 3 years ago

Actually I have never been able to test out multi screen with Hyperion. I've only tested that the software has the ability to support that.

I thought there is no way to bypass DRM. Can you tell me more about navigator?

Without ambilight yes. No way to bypass without material capture as you know.

As @a14219 i’m asking how we can get working this setup. It’s possible with your software or you need to add this features ?

Thank you ☺️

parazite13 commented 3 years ago

Hi guys,

For your information I made it work for dual screen using two instance of Dx11ScreenCapture. You can take a look at it here : https://github.com/parazite13/HyperionScreenCap

I won't make a PR to merge it back here beacause there is certainly a better way to integrate it for N monitors (especially in terms of UI), but if you'are interested @sabaatworld I can make a PR anyway.

sabaatworld commented 3 years ago

I see that a could of files have been changed? Can you please summarize your changes so that I can understand them?

parazite13 commented 3 years ago

The main thing is that I've implemented the IScreenCapture interface in the Dx11DualScreenCapture.cs file so that I can run two instance of the Dx11ScreenCapture inside. After that I have juste merged the output of the two byte[] from the Dx11ScreenCapture.Capture() into a new byte[] that is twice the size to implement the Dx11DualScreenCapture.Capture() method. All of the others modifications are just to select this new option and save it in the preference, so that is what I meant when I said there is probably a better way to integrate it in terms of Ui.

tihoangyeudau commented 2 years ago

The main thing is that I've implemented the IScreenCapture interface in the Dx11DualScreenCapture.cs file so that I can run two instance of the Dx11ScreenCapture inside. After that I have juste merged the output of the two byte[] from the Dx11ScreenCapture.Capture() into a new byte[] that is twice the size to implement the Dx11DualScreenCapture.Capture() method. All of the others modifications are just to select this new option and save it in the preference, so that is what I meant when I said there is probably a better way to integrate it in terms of Ui.

@parazite13 I tested your fork and I got this issue and no capture found when 2 screens have different resolusions. When they have same resolution, it works.

2022-01-10 20:27:45 [INFO] [9] HyperionScreenCap.Helper.HyperionTask.StartCapture:0 - HyperionTask[ConfigurationId: b035de]: Waiting before next screen capture attempt
2022-01-10 20:27:46 [ERROR] [9] HyperionScreenCap.Helper.HyperionTask.StartCapture:0 - HyperionTask[ConfigurationId: b035de]: Exception in screen capture attempt: 14
System.Exception: Error occured while sending image to server: Index was outside the bounds of the array. ---> System.IndexOutOfRangeException: Index was outside the bounds of the array.
   at HyperionScreenCap.Capture.Dx11DualScreenCapture.Capture()
   at HyperionScreenCap.Helper.HyperionTask.TransmitNextFrame()
   --- End of inner exception stack trace ---
   at HyperionScreenCap.Helper.HyperionTask.TransmitNextFrame()
   at HyperionScreenCap.Helper.HyperionTask.StartCapture()
sabaatworld commented 2 years ago

Thanks! I'll explore this for the next release.

tihoangyeudau commented 2 years ago

Thanks! I'll explore this for the next release.

no, your newest release is good. above issue is of DualScreen fork of @parazite13

parazite13 commented 2 years ago

I was aware of this when I've implemented this myself. Things gets trickier when not using the same resolution. I'll try to spend a bit of time on it the upcoming days.

tihoangyeudau commented 2 years ago

I was aware of this when I've implemented this myself. Things gets trickier when not using the same resolution. I'll try to spend a bit of time on it the upcoming days.

That's sound great!

parazite13 commented 2 years ago

I've pushed a fix on my fork if you want to check @tihoangyeudau

tihoangyeudau commented 2 years ago

I've pushed a fix on my fork if you want to check @tihoangyeudau

Ok i will check it right now!

tihoangyeudau commented 2 years ago

@parazite13 Work perfect! Thank you for your effort and processing speed! next updates of you and @sabaatworld are is very valuable!

tihoangyeudau commented 2 years ago

@sabaatworld we know Hyperionscreencap can generate multiple screens to capture and set priorities accordingly, but for Hyperion.ng users always have to set the priorities again every time Hyperion.ng restarts without being able to save that priorities setting after each reboot.

tihoangyeudau commented 2 years ago

@parazite13 but wait, it can't work with lanscape screen + portrait screen. it seems that hyperionscreencap captures the portrait screen incorrectly

my log

2022-01-13 09:53:28 [ERROR] [7] HyperionScreenCap.Helper.HyperionTask.StartCapture:176 - HyperionTask[ConfigurationId: c25ed5]: Exception in screen capture attempt: 1
System.Exception: Error occured while sending image to server: Unable to write data to the transport connection: An existing connection was forcibly closed by the remote host. ---> System.IO.IOException: Unable to write data to the transport connection: An existing connection was forcibly closed by the remote host. ---> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
   at System.Net.Sockets.Socket.Send(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
   at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size)
   --- End of inner exception stack trace ---
   at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size)
   at HyperionScreenCap.Networking.HyperionClient.sendMessageSize(Int32 size) in C:\Users\tuant\Documents\GitHub\HyperionScreenCap\HyperionScreenCap\Networking\HyperionClient.cs:line 111
   at HyperionScreenCap.Networking.FbsClinet.SendFinishedMessage(FlatBufferBuilder finaliedBuilder) in C:\Users\tuant\Documents\GitHub\HyperionScreenCap\HyperionScreenCap\Networking\FbsClinet.cs:line 56
   at HyperionScreenCap.Networking.FbsClinet.SendImageDataMessage(Byte[] pixeldata, Int32 width, Int32 height) in C:\Users\tuant\Documents\GitHub\HyperionScreenCap\HyperionScreenCap\Networking\FbsClinet.cs:line 30
   at HyperionScreenCap.Networking.HyperionClient.SendImageData(Byte[] pixeldata, Int32 width, Int32 height) in C:\Users\tuant\Documents\GitHub\HyperionScreenCap\HyperionScreenCap\Networking\HyperionClient.cs:line 85
   at HyperionScreenCap.Helper.HyperionTask.TransmitNextFrame() in C:\Users\tuant\Documents\GitHub\HyperionScreenCap\HyperionScreenCap\Helper\HyperionTask.cs:line 147
   --- End of inner exception stack trace ---
   at HyperionScreenCap.Helper.HyperionTask.TransmitNextFrame() in C:\Users\tuant\Documents\GitHub\HyperionScreenCap\HyperionScreenCap\Helper\HyperionTask.cs:line 154
   at HyperionScreenCap.Helper.HyperionTask.StartCapture() in C:\Users\tuant\Documents\GitHub\HyperionScreenCap\HyperionScreenCap\Helper\HyperionTask.cs:line 170
2022-01-13 09:56:13 [ERROR] [9] HyperionScreenCap.Helper.HyperionTask.StartCapture:176 - HyperionTask[ConfigurationId: c25ed5]: Exception in screen capture attempt: 1
System.Exception: Error occured while sending image to server: Unable to write data to the transport connection: An existing connection was forcibly closed by the remote host. ---> System.IO.IOException: Unable to write data to the transport connection: An existing connection was forcibly closed by the remote host. ---> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
   at System.Net.Sockets.Socket.Send(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
   at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size)
   --- End of inner exception stack trace ---
   at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size)
   at HyperionScreenCap.Networking.ProtoClient.SendRequest(IMessageLite request) in C:\Users\tuant\Documents\GitHub\HyperionScreenCap\HyperionScreenCap\Networking\ProtoClient.cs:line 56
   at HyperionScreenCap.Networking.ProtoClient.SendImageDataMessage(Byte[] pixeldata, Int32 width, Int32 height) in C:\Users\tuant\Documents\GitHub\HyperionScreenCap\HyperionScreenCap\Networking\ProtoClient.cs:line 29
   at HyperionScreenCap.Networking.HyperionClient.SendImageData(Byte[] pixeldata, Int32 width, Int32 height) in C:\Users\tuant\Documents\GitHub\HyperionScreenCap\HyperionScreenCap\Networking\HyperionClient.cs:line 85
   at HyperionScreenCap.Helper.HyperionTask.TransmitNextFrame() in C:\Users\tuant\Documents\GitHub\HyperionScreenCap\HyperionScreenCap\Helper\HyperionTask.cs:line 147
   --- End of inner exception stack trace ---
   at HyperionScreenCap.Helper.HyperionTask.TransmitNextFrame() in C:\Users\tuant\Documents\GitHub\HyperionScreenCap\HyperionScreenCap\Helper\HyperionTask.cs:line 154
   at HyperionScreenCap.Helper.HyperionTask.StartCapture() in C:\Users\tuant\Documents\GitHub\HyperionScreenCap\HyperionScreenCap\Helper\HyperionTask.cs:line 170
sabaatworld commented 2 years ago

Let's discuss the portrait issue over on https://github.com/sabaatworld/HyperionScreenCap/issues/57

justinknguyen commented 2 years ago

status on implementing this feature?

zuldero commented 2 years ago

@parazite13 is you version working for different resolutions (i evan got a 5120x1440 screen) ?. I plan to set up hyperion i the next month's, schould i download your one, or will this get mearchd to this repo (@sabaatworld)?

parazite13 commented 2 years ago

Different resolution should be fine as soon as you don't have a multi orientation setup

HybridAir commented 11 months ago

@parazite13 sorry to resurrect an old issue, but do you have a compiled build of your fork available anywhere? I cannot get visual studio to build it on my end.

parazite13 commented 11 months ago

Since quite recently the official Hue sync app has released the dual screen feature so I'm not using this tool anymore sorry.