I have little desktop app which uses UWP API to capture data from webcam (MediaCapture). On my computer it works fine -- I can capture video and audio. When I run the same program on the other computer it crashes -- as I found out I had to disable audio recording:
var media_settings = new MediaCaptureInitializationSettings();
// audio+video by default
media_settings.StreamingCaptureMode = Windows.Media.Capture.StreamingCaptureMode.Video;
await mediaCapture.InitializeAsync(media_settings);
Is there a way to find out in advance if given webcam supports audio recording? By "in advance" I mean the other way than trying, catching exception and in second take disabling audio :-).
You can find out if the given webcam supports audio recording by enumerating the audio devices before you initialize the MediaCaptureInitializationSettings object. After finishing enumerating the audio device, you can find whether there is a audio device from the webcam or not.
You can follow the Enumerate devices topic or see the DeviceEnumerationAndPairing sample directly to find the AudioCapture device, then you should be able to judge if there is a audio device from the webcam.
Related
Is there any way to play audio directly into a capture device in C#? In my project I will have to feed later on a virtual capture driver with audio so I can use it in other programs and play the wanted audio anywhere else, but Im not sure it is possible in C#, I tried to do this with NAudio (which is truly amazing):
var enumerator = new MMDeviceEnumerator();
MMDevice captureDevice = enumerator.GetDefaultAudioEndpoint(DataFlow.Capture, Role.Multimedia);
WasapiOut wasapiOut = new WasapiOut(captureDevice, AudioClientShareMode.Shared, false, 0);
But ultimately it just throws a COMException with the code 0x88890003 which translates to the error "The AUDCLNT_STREAMFLAGS_LOOPBACK flag is set but the endpoint device is a capture device, not a rendering device". So in the end is there any possible solution or do I have to turn to another language like C++?
You cannot push audio to the device which generates audio on its own, "capture device".
Loopback mode means that you can have a copy of audio stream from a rendering device, but this does not work the other way.
The way things can work more or less as you assumed is when you have a special (and custom or third party, since no stock implementation of the kind exists) implementation of audio capture device, designed to generate audio supplied by external application such as your pushing the payload audio data via an API.
Switching to C++ will be of no help with this challenge.
Is there any way in c#/.net of recording the current audio being played? I've searched a lot on the internet but the only result I could find is recording using a microphone.
I dont want to record using microphone input, I want to record what is being played on the computer when I click a record button.
Thanks
You have two options here:
Hardware loopback device - virtual "Stereo Mix" audio device, which acts as a regular audio capture device and in the same time produces a copy of mixed audio feed played through default audio output device of the system. Since such device shows up as real audio input device, you can use standard APIs, libraries and even exitsing applications to record from such device.
Programmatic access to a virtual loopback device as if it was microphone-like device. API on the background will duplicate played audio content and make it available for reading back as it plays. The good news is that you can access the mixed audio feed for device of your interest.
Both options are described in detail in Loopback Recording article on MSDN and available via standard audio APIs, specifically WASAPI.
For C# development you are likely to use a wrapper like NAudio.
For option 1 you will find quite a few questions on StackOverflow, and for the other option the keyword is AUDCLNT_STREAMFLAGS_LOOPBACK.
The only way to be able to receive data from another application is if the developer provides an access point, normally through some SDK, API, or other means. Without this, there is no way for your application code to receive the bytes from the other application.
The reason a microphone works is because it is receiving the sound output bytes from the application and sending those soundwave bytes back into your PC to render and output the sound. Since you have access to these bytes from the microphone you are able to capture the sound.
See if there is an API or an SDK from the developer of the application you are trying to get sound from.
I am working on a project where I am playing a wave file using naudio to someone over the phone through a softphone. The person making the call, wearing a usb headset (which is an external soundcard) would need to be able to speak along with the wave files. Right now I'm running a dual 3.5mm audio cable from the output into the input on the back of the computer to make this happen. This is making me have to use the onboard sound card for the wave and the head set for the person to speak which means I have to switch the default input audio device on-demand to allow the person to be heard or the wave to be heard. This causes issue with the softphone app depending on how its devices are set. I want to cut out the onboard soundcard altogether. I want to send both my wave audio and the person speaking, into the same input device.
When I play the audio this is the code I call:
WaveStream waveStream = new WaveFileReader(#"C:\Users\Public\Music\tester.wav");
WaveOut waveOut = new WaveOut();
waveOut.DeviceNumber = int.Parse(device1);
WaveOut.Init(waveStream);
WaveOut.Play();
At this point I would love to not only send to the selected output device but also to an input device as well. Is there any simple ways I can do this? Thanks for your help in advance.
Unfortunately, the various Windows audio APIs provide no way for you to replace the audio received by an actual input device with your own audio, so this isn't something you can achieve out of the box with NAudio. What you need is to create a virtual audio input device. This is quite a lot of work, so the simplest solution is to purchase something like Virtual Audio Cable, which will allow you to create virtual sound devices and patch them together.
I'm having problems with the Directshow.net library and Windows 7.
In some PC (only if in Device Manager > Controllers Sound, video, listed: "High Definition Audio Device") only detect 1 mic when Skype, MSN, and Recording Devices, lists at least two; when executes this code:
Filter audioDevice = null;
if (capture != null)
audioDevice = capture.AudioDevice;
"audioDevice" only have the first mic (internal mic or rear mic), and don't retrieve de second mic (front mic -jack-) or vice versa.
Someone has solved or know another library to capture Video and Audio from C#??
There is little to solve here. DirectShow.NET uses DirectShow, which in turn uses Audio Capture Filter, which uses legacy audio APIs to capture audio. Skype instead uses WASAPI, latest and greatest audio capture API in Windows Vista+ (falls back to older APIs in Windows XP-).
There is only one workaround available: to write proprietary audio capture filter backed by WASAPI.
Creating a video encoder app with multiple video sources. Is there a certain type of IP camera that can be used as a Windows video source (I.e. DirectShow) or a generic IP camera driver that can be used to connect both video and audio from a hardware camera?
To do video capture in directshow, you must acquire an IBaseFilter pointer to the video device, then add the filter to the graph.
You can get these IBaseFilter pointers for your cameras by enumerating the CLSID_VideoInputDevice category.
Getting audio follows the same procedure, this time though, you'll acquire the audio IBaseFilters by enumerating the CLSID_AudioInputDevice category.
I can post code to show how this is accomplished if you're interested, but I only have c++ code, I've never tried directshow coding with c#