kekyo / FlashCap

Independent video frame capture library on .NET/.NET Core and .NET Framework.
Apache License 2.0
203 stars 29 forks source link

Added support for Apple devices #65

Open YohDeadfall opened 1 year ago

YohDeadfall commented 1 year ago

Here's my take on supporting Apple devices including desktop and mobile. It's not completed yet, but should be close to that point.

Some dependencies I changed to make it easier for me to develop, so they can be reverted afterwards when finishing the feature.

Fixes #45.

Testing

To test changes FlashCap.Avalonia in samples can be used. That application has just two combo boxes to select a web cam and then characteristics.

dotnet run -f net6.0 --project ./samples/FlashCap.Avalonia/FlashCap.Avalonia
YohDeadfall commented 1 year ago

So, the current pull request lacks of one important thing for OSX - change of OnEnumerateDescriptors' signature since on Apple devices access must be requested first, that's an asynchronous operation.

kekyo commented 1 year ago

MEMO: If sync-over-async is not going to be a fatal problem, we could add Obsolete and move to a new asynchronous method like Task<CaptureDeviceDescriptor[]> OnEnumerateDescriptorsAsync(). I think it might be a good idea to encourage this.

kekyo commented 1 year ago

@YohDeadfall Perhaps a brief description of how to test it on a Mac would be better for people to feel free to try it 😄

YohDeadfall commented 1 year ago

Added it, but @kiminuo can provide a little bit more on it since he helped me originally.

kiminuo commented 1 year ago

I simply ran

dotnet run -f net6.0 --project ./samples/FlashCap.Avalonia/FlashCap.Avalonia

then an Avalonia application is supposed to appear. One selects a camera and that's basically it.

If you have multiple .NET versions on your machine, it's good to add global.json:

{
  "sdk": {
    "version": "6.0.100",
    "allowPrerelease": false,
    "rollForward": "latestFeature"
  }
}

but I'm not sure what .NET versions should be supported so it's just a general remark.

kekyo commented 1 year ago

I wasn't even sure if the Avalonia version would actually work on the Mac, so thanks for the help!

YohDeadfall commented 1 year ago

It works perfectly on all platforms and even might work on Tizen. At least there's an issue on it and some work is being done.

kekyo commented 1 year ago

@YohDeadfall Not much of a response, is it running with no problems at all? :) If there is a problem, I'm thinking I could release it, but what do you suggest? There is a possibility that if it is not released, people may not actually try to use it.

YohDeadfall commented 1 year ago

The problem here is that it crashes trying to process a frame. @kiminuo did testing, but you know, when development happens by one developer and testing by another it takes too much time and energy.

There's a Xamarin project for barcode scanning I can use to make a debug version with a single hard coded characteristic and the most simple image format. Then if it runs without any issue, we can publish it and bring features later when there's some interest.

Is it okay?

kekyo commented 1 year ago

Oh... I would have been able to debug it myself if I could get a Mac...

kekyo commented 1 year ago

@YohDeadfall Hi, I am now trying to extend the transcode type for this issue.

Specifically, a modification that would change the transcodeIfYUV argument in the code from a boolean type to an enumerated type. So, no technical changes, but widespread changes in the FlashCap project.

So, after much thought, I'd still like to accept this PR once and for all before this changing, what do you think?

I'm also wondering if it would be better to put a notation in the documentation that says "This is experimental and behavior verification and modifications are welcome" so that people who want to implement captures can see it and try it out.

flat-eric147 commented 1 year ago

@YohDeadfall Hi, I am now trying to extend the transcode type for this issue.

Specifically, a modification that would change the transcodeIfYUV argument in the code from a boolean type to an enumerated type. So, no technical changes, but widespread changes in the FlashCap project.

So, after much thought, I'd still like to accept this PR once and for all before this changing, what do you think?

I'm also wondering if it would be better to put a notation in the documentation that says "This is experimental and behavior verification and modifications are welcome" so that people who want to implement captures can see it and try it out.

Here's a start you might want to consider https://github.com/kekyo/FlashCap/commit/be698dfb9db94cb6b1e5bfb47e6940ce0852fe19

YohDeadfall commented 6 months ago

The current problem is that when this pull request is tested it causes a crash due to finalization of an AVCaptureDeviceDiscoverySession, but it is created in only the one place and with an using block controlling its lifetime.

If someone is able to continue on that, I would be happy to provide any other information and help in dealing with it. But for now I have no Mac device and cannot test it myself.