我正在尝试使用SharpAPI Example和NAudio Example的回送音频流捕获Windows屏幕的音频/视频。
我正在使用C#,wpf来实现相同的效果。
一对nuget包。SharpAvi-用于视频捕获NAudio-用于音频捕获
我已经成功地将其与提供的示例集成在一起,我正尝试通过SharpAPI视频流通过NAudio
捕获音频,以便将视频与音频实现一起记录下来。
无论我在SharpAvi视频中写入音频流。 输出时,仅在视频和音频为空的情况下才录制。
但是当我尝试将音频捕获为名为“ output.wav”的单独文件,并按预期与音频一起录制时,可以听到录制的音频。因此,我现在的结论是,问题仅在于通过SharpApi与视频集成
https://drive.google.com/open?id=1H7Ziy_yrs37hdpYriWRF-nuRmmFbsfe-
NAudio初始化:
audioSource = new WasapiLoopbackCapture();
audioStream = CreateAudioStream(audioSource.WaveFormat, encodeAudio, audioBitRate);
audioSource.DataAvailable += audioSource_DataAvailable;
捕获音频字节并将其写入SharpAvi音频流:
private void audioSource_DataAvailable(object sender, WaveInEventArgs e)
{
var signalled = WaitHandle.WaitAny(new WaitHandle[] { videoFrameWritten, stopThread });
if (signalled == 0)
{
audioStream.WriteBlock(e.Buffer, 0, e.BytesRecorded);
audioBlockWritten.Set();
Debug.WriteLine("Bytes: " + e.BytesRecorded);
}
}
您能帮我解决这个问题吗?也可以通过其他任何方式达到我的要求。让我知道是否需要更多详细信息。
我第一次运行该应用程序时就能够重现您的问题,但是随后我打开了设置窗口并设置了一个录制设备,就可以录制视频和音频而没有任何问题:
我添加了一些初始化代码,以在打开应用程序时选择第一个可用的输入源,然后它无需设置源就可以工作:
private void InitDefaultSettings()
{
var exePath = new Uri(System.Reflection.Assembly.GetEntryAssembly().Location).LocalPath;
outputFolder = System.IO.Path.GetDirectoryName(exePath);
encoder = KnownFourCCs.Codecs.MotionJpeg;
encodingQuality = 70;
audioSourceIndex = GetFirstAvailableDevice(SupportedWaveFormat.WAVE_FORMAT_44S16);
audioWaveFormat = SupportedWaveFormat.WAVE_FORMAT_44S16;
encodeAudio = true;
audioQuality = (Mp3AudioEncoderLame.SupportedBitRates.Length + 1) / 2;
minimizeOnStart = true;
}
private static int GetFirstAvailableDevice(SupportedWaveFormat format)
{
for (int i = 0; i < WaveInEvent.DeviceCount; i++)
{
var caps = WaveInEvent.GetCapabilities(i);
if (caps.SupportsWaveFormat(format))
{
return i;
}
}
return -1;
}