我正在尝试在 Windows 上检测耳机是否已插入。我已经尝试过 DirectSound 和 NAudio 库,但没有取得任何成功。有没有人有什么建议?
注意:此问题与此问题重复,但该问题的答案不包含任何代码示例或教程。
我正在开发一个 C# WPF 应用程序,它将一组单词(大约 17,000 个单词)组合在一起,并生成一个与 mp3 文件匹配的播放列表(每个 mp3 文件都是一个单词)。
目前,每个 mp3 文件在其波形结束时都有 1 秒到 30 秒之间的随机静音。
我希望能够以编程方式从文件末尾删除静音波。
使用 NAudio for .NET 如何删除 mp3 文件末尾的静音波?
我正在尝试转换
PCM S16 LE (araw)
Mono, Sample rate 22050, Bit pr. sample 16
Run Code Online (Sandbox Code Playgroud)
到
PCM mulaw (PCM MU-LAW)
Mono, Sample rate 8000hz, Bit pr. sample is 8.
Run Code Online (Sandbox Code Playgroud)
WaveFormat.CreateMuLawFormat(8000,1)或者甚至是更通用的WaveFormat.CreateCustomFormat,我指定WaveFormatEncoding与源流相同的内容会抛出相同的异常。
AcmNotPossible calling acmStreamOpen
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么吗?
任何线索将不胜感激。
我想通过 NAudio 录制来自 WASAPI 环回的原始音频,并通过管道传输到 FFmpeg 以通过内存流进行流式传输。从这个文档开始,FFmpeg 可以作为原始输入但是,我得到了 8~10 倍的结果速度!这是我的代码:
waveInput = new WasapiLoopbackCapture();
waveInput.DataAvailable += new EventHandler<WaveInEventArgs>((object sender, WaveInEventArgs e) =>
{
lock (e.Buffer)
{
if (waveInput == null)
return;
try
{
using (System.IO.MemoryStream memoryStream = new System.IO.MemoryStream())
{
memoryStream.Write(e.Buffer, 0, e.Buffer.Length);
memoryStream.WriteTo(ffmpeg.StandardInput.BaseStream);
}
}
catch (Exception)
{
throw;
}
}
});
waveInput.StartRecording();
Run Code Online (Sandbox Code Playgroud)
FFmpeg 参数:
ffmpegProcess.StartInfo.Arguments = String.Format("-f s16le -i pipe:0 -y output.wav");
Run Code Online (Sandbox Code Playgroud)
1.有人可以解释这种情况并给我一个解决方案吗?
2. 我是否应该将 Wav 标头添加到内存流,然后以 Wav 格式通过管道传输到 FFmpeg?
工作解决方案
waveInput = new WasapiLoopbackCapture();
waveInput.DataAvailable …Run Code Online (Sandbox Code Playgroud) 我正在尝试制作一个可以记录屏幕同时可以记录输入和输出音频的应用程序。我在网上查了很多东西,但找不到任何可以一起做的事情。
我试图用sharpavi 和naudio 做一些事情。底部的代码可以录制来自麦克风的声音的屏幕,也可以录制来自扬声器的声音。问题是来自麦克风的屏幕视频和音频会创建一个视频文件,而来自 spearkes 的声音会创建其他 mp3 文件。(如果我的老板想做我做不到的事情:)
所以我想创建包含屏幕记录、输入和输出语音的视频文件。我希望你能帮助我。
private readonly int screenWidth;
private readonly int screenHeight;
private readonly AviWriter writer;
private readonly IAviVideoStream videoStream;
private readonly IAviAudioStream audioStream;
private readonly WaveInEvent audioSource;
private readonly Thread screenThread;
private readonly ManualResetEvent stopThread = new ManualResetEvent(false);
private readonly AutoResetEvent videoFrameWritten = new AutoResetEvent(false);
private readonly AutoResetEvent audioBlockWritten = new AutoResetEvent(false);
WasapiLoopbackCapture capture = new WasapiLoopbackCapture();
WaveFileWriter writerx;
public Recorder(string fileName,
FourCC codec, int quality,
int audioSourceIndex, SupportedWaveFormat audioWaveFormat, bool encodeAudio, int audioBitRate) …Run Code Online (Sandbox Code Playgroud) 以编程方式启用记录设备
我想以编程方式启用录音设备列表中禁用的设备
我能够使用Naudio获得禁用设备的列表
但是没有办法使用 Naudio 启用它。
所以我也尝试使用IMMDevice 接口,但我不知道如何做到这一点。
我也试过注册表编辑
//Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\{87bd5990-b012-41f1-83f7-f267ed7780a7}
RegistryKey root = Registry.LocalMachine.OpenSubKey("SOFTWARE", true).OpenSubKey("Microsoft", true).OpenSubKey("Windows", true).OpenSubKey("CurrentVersion", true).OpenSubKey("MMDevices", true).OpenSubKey("Audio", true).OpenSubKey("Render", true).OpenSubKey("{87bd5990-b012-41f1-83f7-f267ed7780a7}", true); //{87bd5990-b012-41f1-83f7-f267ed7780a7} any Playback Device ID
MessageBox.Show($"Value Before {root.GetValue("DeviceState")} { root.GetValueKind("DeviceState")}");
root.SetValue("DeviceState", 0x10000001, RegistryValueKind.DWord);
MessageBox.Show($"Value After {root.GetValue("DeviceState")} { root.GetValueKind("DeviceState")}");
Run Code Online (Sandbox Code Playgroud)
或者
Registry.SetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\{87bd5990-b012-41f1-83f7-f267ed7780a7}", "DeviceState", 0x10000001, RegistryValueKind.DWord);
Run Code Online (Sandbox Code Playgroud)
但这需要管理员权限,我希望它适用于任何用户。
我终于构建了一个程序来使用 NAudio 收听内部音频环回,并输出识别的文本。问题是它会倾听,并且总是说,例如:
Recognized text: had
Recognized text: had
Recognized text: had
Recognized text: had
Recognized text: had had phone Le K add phone Laton
Recognized text: had phone looked had phone looked had phone looked had phone lo
oked zone
Recognized text: had phone lines to had, had phone looked had phone looked had p
hone line had phone
Recognized text: had phone line had phone looked had phone
Recognized text: had phone looked had phone looked had phone …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用带有NAudio Example的环回音频流的SharpAPI Example捕获 Windows 屏幕的音频/视频。
我正在使用 C#、wpf 来实现相同的功能。
几个 nuget 包。 SharpAvi - 用于视频捕获 NAudio - 用于音频捕获
我已经成功地将它与提供的示例集成在一起,我正在尝试通过NAudioSharpAPI 视频流捕获音频,以便将视频与音频实现一起录制。
无论我在 SharpAvi 视频中编写音频流。 输出时,仅录制视频,音频为空。
但是当我尝试将音频捕获为名为“output.wav”的单独文件时,它按预期录制了音频,并且能够听到录制的音频。所以,我现在得出的结论是,问题仅在于通过 SharpApi 与视频集成
writterx = new WaveFileWriter("Out.wav", audioSource.WaveFormat);
https://drive.google.com/open?id=1H7Ziy_yrs37hdpYriWRF-nuRmmFbsfe-
NAudio 初始化:
audioSource = new WasapiLoopbackCapture();
audioStream = CreateAudioStream(audioSource.WaveFormat, encodeAudio, audioBitRate);
audioSource.DataAvailable += audioSource_DataAvailable;
Run Code Online (Sandbox Code Playgroud)
捕获音频字节并将其写入 SharpAvi 音频流:
private void audioSource_DataAvailable(object sender, WaveInEventArgs e)
{
var signalled = WaitHandle.WaitAny(new WaitHandle[] { videoFrameWritten, stopThread });
if …Run Code Online (Sandbox Code Playgroud) 我有一堆 MP3 文件,其中一些具有恒定比特率,另一些具有可变比特率,有些以 128 kbps 编码,有些以其他比特率编码,有些是立体声,有些是联合立体声。全部为 44,100 khz
为了使用这些数千个 MP3 文件自动执行任务,我正在尝试开发一种算法,该算法应该在不同的任意位置/持续时间将任意持续时间的静音插入这些 MP3 文件中(例如,将 500 毫秒的静音插入一个位置 00:02:30 的 MP3 文件,然后在位置 00:40:02 的其他 MP3 文件中插入 750 毫秒的静音)。
我发现的唯一信息是在 MP3 文件的开头或结尾插入静音。这不是我想要的,因为我需要在任意位置插入静音。大多数情况下,对于大多数文件,我需要在 MP3 文件的中间附近添加静音,而且可能很少需要在 MP3 文件的开头添加静音。我永远不需要在文件末尾添加静音。
有人建议使用SOX或FFMPEG命令行应用程序在 MP3 文件的开头或结尾插入静音。我不知道这些应用程序是否可以满足我的目的,但无论如何我的目标是使用 C# 或 VB.NET 语言来做到这一点,不依赖于任何第三方应用程序,这样我就可以完全控制哪些修改我将在文件中执行,并以编程方式处理生成的修改后的文件以使用它执行其他任务(因为插入静音只是我真正需要对这些 MP3 文件做的事情之一)。
但我同意任何外部库的使用,我记得NAudio for .NET,一个很棒的音频操作库,我发现了这个有趣的片段,它不是关于插入静音而是连接文件:
https://markheath.net/post/concatenating-sample-providers-in-naudio
我认为使用NAudio我将有机会开发一种算法来在特定持续时间插入静音。
很明显我没有足够的知识来理解我如何完成这项任务。
我想出的方法之一就是尝试在流的特定位置插入/填充零,我知道该怎么做,但是......我应该如何将零(一个字节)转换为毫秒计算插入 MP3 文件的静音持续时间?所以我不知道仅仅插入一个零序列是否会起到沉默的作用,如果它有效,我不知道如何将该零序列转换为时间,我也不知道这种方法是否对于所有类型的 MP3 文件变体(CBR、VBR、ABR、单声道或立体声通道等)都是安全的。
我想到的第二种方法是使用任何音频编辑器软件生成一个包含 1 毫秒静音的 MP3 文件,然后在 MP3 文件流的特定位置根据需要多次插入和连接该静音。我想我需要为每个可能的 CBR 比特率生成这个 1 ms MP3 文件,但是 VBR 和 ABR 会发生什么?,我坚持这个想法。
可能最终事情会比我 …
c# ×10
naudio ×10
.net ×3
audio ×2
windows ×2
c++ ×1
directsound ×1
ffmpeg ×1
headphones ×1
mp3 ×1
sapi ×1
screencast ×1
vb.net ×1
wav ×1
wpf ×1