我的基本问题是弄清楚如何确定我的应用程序何时进入后台以及何时进行轮换。
我有一个用于音乐识别的录音服务。我想智能地管理该服务的生命周期以完成以下任务:
我无法覆盖,onConfigurationChanged因为我的应用程序使用带有以编程方式添加片段的操作栏选项卡,并且无法重新扩展片段布局。
克服这些挑战的好方法是什么?到目前为止,我最好的解决方案是更新服务中的计时器,但我想考虑替代方案。我不喜欢计时器,因为在使用语音搜索时,麦克风争用是很常见的。
虚拟音频电缆是一种 Windows WDM 多媒体驱动程序,允许用户将音频流从一个应用程序传输到另一个应用程序。我想以编程方式实现此功能。我更喜欢用 c# 来做。任何开发人员都可以指导我如何做
我的 hw:1,0 是仅播放的外部 USB 卡。如果记录应用程序尝试打开 hw:1,0 进行捕获,则无法捕获发送到 hw:1,0 的样本。alsamixer 没有为 hw:1,0 提供任何“[Capture]”选项 - 只有“[Playback]”选项卡上的一个音量控制。
是否可以创建一些虚拟的“xxx”设备,该设备接受来自播放应用程序的流并通过 2 个流(副本)将其发送出去 - 第一个流发送到真正的“hw:1,0”(发送到我的耳机),第二个流发送到真实的“hw:1,0”(发送到我的耳机)到另一个提供捕获能力的虚拟设备“zzz”,将流提供给可以打开“zzz”进行捕获的应用程序?
更新
我在内核中添加了 ALSA 环回设备,现在我有了环回设备。然后我发现工作 .asoundrc (见下文),但是当我使用 ffmpeg 捕获屏幕+声音时,声音比视频早得多,这是一些很大的同步问题。因此,通过这个 .asoundrc (如下),我可以使用 hw:0,0 (环回设备,hw:0,0 - 播放,hw:0,1 - 捕获)来捕获我发送到“默认”的内容。我还可以通过我的外部 USB hw:2,0 听到这些样本。
ffmpeg命令:
ffmpeg -f alsa -i hw:0,1 -f x11grab -s 854x480 -r 30 -i :0.0 -vcodec libx264 -vb 4000k /tmp/screen_854x480.avi
Run Code Online (Sandbox Code Playgroud)
.asoundrc:
pcm.!default {
type plug
slave.pcm "mdev"
route_policy "duplicate"
}
pcm.mdev {
type multi
slaves.a.pcm "hw:Loopback,0,0"
slaves.a.channels 2
slaves.b.pcm "dmixer"
slaves.b.channels 2
bindings.0.slave …Run Code Online (Sandbox Code Playgroud) 对于 macOS 沙箱,有两个授权密钥:
com.apple.security.device.audio-input
com.apple.security.device.microphone
Run Code Online (Sandbox Code Playgroud)
我测试了两者,都允许麦克风输入。
它们之间有什么区别?
macos audio-recording entitlements mac-app-store appstore-sandbox
我正在尝试制作一个可以记录屏幕同时可以记录输入和输出音频的应用程序。我在网上查了很多东西,但找不到任何可以一起做的事情。
我试图用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) 我正在尝试使用 AudioKit 为 iOS 实现 SLM 应用程序。因此,我需要确定不同的响度值以 a) 显示当前响度(平均超过一秒)和 b)做进一步的计算(例如计算更长的时间跨度内的“等效连续声级”)。该应用程序应该能够跟踪频率加权分贝值,如 dB(A) 和 dB(C)。
我确实理解我面临的一些问题与我在信号和音频处理领域普遍缺乏了解有关。我的问题是如何使用 AudioKit 来完成这项任务。我将描述我当前的流程并希望获得一些意见:
AKMicrophone和 a的实例AKFrequencyTrackerTimer具有一定间隔的实例(当前1/48_000.0)amplitude和frequency。根据振幅计算分贝值20 * log10(amplitude) + calibrationOffset(校准偏移将在专业 SLM 的帮助下确定每个设备型号)。根据频率加权(A 和 C)计算检索到的频率的偏移,并将这些应用于初始 dB 值。将 dB、dB(A) 和 dB(C) 值存储在一个数组中。我在其他地方读到使用计时器这不是最好的方法。还有什么可以用于“采样”?究竟是什么frequency的AKFrequencyTracker?这个频率是否足以确定 dB(A) 和 dB(C) 值,还是我需要一个AKFFTTap?如何从AKFrequencyTracker平均值中检索值,即 RMS 使用什么时间范围?
可能相关的问题:在 swift 中从 AudioKit 获取 dB(a) 级别,AudioKit FFT 转换为 dB?
我目前有一个从 navigator.getUserMedia() 接收 MediaStream 的函数,效果很好。我想提供上传音频文件的选项,并通过相同的功能模拟它。我想知道是否可以上传音频文件并创建一个 Mediastream 对象并通过以下函数传递它?
startUserMedia(stream) {
this.setState({ audio: stream });
var audioContext = new AudioContext();
var source = audioContext.createMediaStreamSource(stream);
var processor = audioContext.createScriptProcessor(8192, 1, 1);
source.connect(processor);
processor.connect(audioContext.destination);
const that = this;
let audioBuffers = [];
this.setState({ currentDuration: 0 });
processor.onaudioprocess = function(e) {
// Do something with the data, i.e Convert this to WAV
if (that.state.currentDuration < that.state.chunkDuration) {
that.setState({
currentDuration: that.state.currentDuration + e.inputBuffer.duration
});
resampler(e.inputBuffer, 16000, function(event) {
const buffer = event.getAudioBuffer();
if (that.state.voiceActive) {
audioBuffers.push(buffer); …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Playback Capture API在 Android 10(Q) 上录制音频。作为回放捕捉API,只允许记录声音与USAGE_GAME,USAGE_MEDIA或USAGE_UNKNOWN,所以,我已经下载Uamp样品有USAGE_MEDIA播放歌曲时设定的。我还增加了android:allowAudioPlaybackCapture="true"在AndroidManifest.xml。然后我启动了Uamp,开始播放歌曲并将其保留在后台。
我开发了一个带有 targetSdk 29的CaptureAudio项目,并将其安装在我安装了Android 10 的OnePlus 7 Pro 上。我在 UI 上有两个按钮用于开始和停止捕获。当应用程序开始捕获时,读取函数将填充缓冲区中的所有 0。
为了在项目中使用回放捕获,我设置如下:
1. 清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.captureaudio">
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="GoogleAppIndexingWarning">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" …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) 我的游戏中有几个活动的 AudioContext,它们由音频库 Howler.js 组织。这些 AudioContext 正在播放我游戏中的音频。除了播放音频之外,是否还可以记录当前播放音频的字节流?这看起来如何?我想通过 webrtc 将此音频发送给其他客户端。
在此先感谢您的帮助。
audio-recording ×10
android ×2
audio ×2
c# ×2
javascript ×2
naudio ×2
alsa ×1
android-10.0 ×1
audiokit ×1
entitlements ×1
html5-audio ×1
ios ×1
iphone ×1
linux ×1
macos ×1
multimedia ×1
playback ×1
screencast ×1
swift ×1
wdm ×1
webrtc ×1
wpf ×1