在SharpAvi上将屏幕录制为视频,音频-不录制音频

问题描述 投票:0回答:1

要求:

我正在尝试使用SharpAPI ExampleNAudio Example的回送音频流捕获Windows屏幕的音频/视频。

我正在使用C#,wpf来实现相同的效果。

一对nuget包。SharpAvi-用于视频捕获NAudio-用于音频捕获

已取得的成就:

我已经成功地将其与提供的示例集成在一起,我正尝试通过SharpAPI视频流通过NAudio捕获音频,以便将视频与音频实现一起记录下来。

问题:

无论我在SharpAvi视频中写入音频流。 输出时,仅在视频和音频为空的情况下才录制。

仅检查音频以确保:

但是当我尝试将音频捕获为名为“ output.wav”的单独文件,并按预期与音频一起录制时,可以听到录制的音频。因此,我现在的结论是,问题仅在于通过SharpApi与视频集成

完整代码以重现该问题:

https://drive.google.com/open?id=1H7Ziy_yrs37hdpYriWRF-nuRmmFbsfe-

来自Recorder.cs的代码概览

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);
        }
    }

您能帮我解决这个问题吗?也可以通过其他任何方式达到我的要求。让我知道是否需要更多详细信息。

c# wpf audio-recording naudio screencast
1个回答
0
投票

我第一次运行该应用程序时就能够重现您的问题,但是随后我打开了设置窗口并设置了一个录制设备,就可以录制视频和音频而没有任何问题:

Source settings

我添加了一些初始化代码,以在打开应用程序时选择第一个可用的输入源,然后它无需设置源就可以工作:

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.