- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在制作一款应用程序,需要将不同数量的音频文件合并为一个。为了实现这一点,我使用多 channel 混音器音频单元。混音器成功地混合了音轨,并且,如果我将 AUGraph 中的 I/O 单元设置为 RemoteIO,它就会成功播放声音。
但是,我想将新声音保存到文件中;我认为最好的方法是使用通用输出而不是 RemoteIO。文件已成功写入并且长度正确(以秒为单位),但播放时没有声音。这是我创建 AUGraph 的方法(为了简洁起见,我将删除尽可能多的内容)
- (void)createGraph
{
OSStatus result = NewAUGraph(&graph);
AudioComponentDescription mixerDescription;
mixerDescription.componentType = kAudioUnitType_Mixer;
mixerDescription.componentSubType = kAudioUnitSubType_MultiChannelMixer;
mixerDescription.componentManufacturer = kAudioUnitManufacturer_Apple;
mixerDescription.componentFlags = 0;
mixerDescription.componentFlagsMask = 0;
AudioComponentDescription remoteIODescription;
remoteIODescription.componentType = kAudioUnitType_Output;
remoteIODescription.componentSubType = kAudioUnitSubType_GenericOutput;
remoteIODescription.componentManufacturer = kAudioUnitManufacturer_Apple;
remoteIODescription.componentFlags = 0;
remoteIODescription.componentFlagsMask = 0;
AUNode iONode, mixerNode;
result = AUGraphAddNode(graph, &remoteIODescription, &iONode);
result = AUGraphAddNode(graph, &mixerDescription, &mixerNode);
result = AUGraphOpen(graph);
result = AUGraphNodeInfo(graph, mixerNode, NULL, &mixerUnit);
result = AUGraphNodeInfo(graph, iONode, NULL, &iOUnit);
result = AUGraphConnectNodeInput(graph, mixerNode, 0, iONode, 0);
UInt32 busCount = (UInt32)fileCount;
result = AudioUnitSetProperty(mixerUnit, kAudioUnitProperty_ElementCount, kAudioUnitScope_Input, 0, &busCount, sizeof(busCount));
UInt32 maximumFramesPerSlice = 4096;
result = AudioUnitSetProperty(mixerUnit, kAudioUnitProperty_MaximumFramesPerSlice, kAudioUnitScope_Global, 0, &maximumFramesPerSlice, sizeof(maximumFramesPerSlice));
for (UInt16 busNumber = 0; busNumber < busCount; busNumber++)
{
AURenderCallbackStruct renderCallback;
renderCallback.inputProc = &inputRenderCallback;
renderCallback.inputProcRefCon = (__bridge void *)self;
result = AUGraphSetNodeInputCallback(graph, mixerNode, busNumber, &renderCallback);
//sets certain parameters for the mixer; I don't believe this is the cause of the problem
AudioUnitSetParameter(mixerUnit, kMultiChannelMixerParam_Pan, kAudioUnitScope_Input, busNumber, fileSettings[busNumber].pan, 0);
AudioUnitSetParameter(mixerUnit, kMultiChannelMixerParam_Volume, kAudioUnitScope_Input, busNumber, fileSettings[busNumber].volume, 0);
AudioUnitSetParameter(mixerUnit, kMultiChannelMixerParam_Enable, kAudioUnitScope_Input, busNumber, fileSettings[busNumber].enabled, 0);
if (soundStructs[busNumber].isStereo == YES)
{
result = AudioUnitSetProperty(mixerUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, busNumber, &stereoDescription, sizeof(stereoDescription));
}
else
{
result = AudioUnitSetProperty(mixerUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, busNumber, &monoDescription, sizeof(monoDescription));
}
}
Float64 sampleRate = SAMPLE_RATE; // 44100.0
result = AudioUnitSetProperty(mixerUnit, kAudioUnitProperty_SampleRate, kAudioUnitScope_Output, 0, &sampleRate, sizeof(sampleRate));
CFURLRef url = (__bridge CFURLRef)[NSURL fileURLWithPath:ofn];
AudioStreamBasicDescription destinationFormat;
memset(&destinationFormat, 0, sizeof(destinationFormat));
destinationFormat.mChannelsPerFrame = 2;
destinationFormat.mFormatID = kAudioFormatMPEG4AAC;
destinationFormat.mFormatFlags = kMPEG4Object_AAC_Main;
destinationFormat.mSampleRate = sampleRate;
UInt32 size = sizeof(destinationFormat);
result = AudioFormatGetProperty(kAudioFormatProperty_FormatInfo, 0, NULL, &size, &destinationFormat);
result = ExtAudioFileCreateWithURL(url, kAudioFileM4AType, &destinationFormat, NULL, kAudioFileFlags_EraseFile, &outputFile);
AudioStreamBasicDescription clientFormat;
memset(&clientFormat, 0, sizeof(clientFormat));
size = sizeof(clientFormat);
result = AudioUnitGetProperty(iOUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, & clientFormat, &size);
UInt32 codec = kAppleHardwareAudioCodecManufacturer;
ExtAudioFileSetProperty(outputFile, kExtAudioFileProperty_CodecManufacturer, sizeof(codec), &codec);
ExtAudioFileSetProperty(outputFile, kExtAudioFileProperty_ClientDataFormat, sizeof(clientFormat), &clientFormat);
result = AUGraphInitialize(graph);
}
这就是我保存文件的方式
- (void)startGraph
{
AudioUnitRenderActionFlags flags = 0;
AudioTimeStamp inTimeStamp;
memset(&inTimeStamp, 0, sizeof(AudioTimeStamp));
inTimeStamp.mFlags = kAudioTimeStampSampleTimeValid;
UInt32 busNumber = 0;
UInt32 numberFrames = 1024;
inTimeStamp.mSampleTime = 0;
int channelCount = 2;
SInt64 totFrms = 0;
for (int i = 0; i < fileCount; i++) //gets the length for the longest recording in the new track
{
SInt64 len = soundStructs[i].totalFrames;
if (len > totFrms && fileSettings[i].enabled == YES)
totFrms = len;
}
while (totFrms > 0)
{
if (totFrms < numberFrames)
numberFrames = (UInt32)totFrms;
else
totFrms -= numberFrames;
AudioBufferList *bufferList = (AudioBufferList*)malloc(sizeof(AudioBufferList)+sizeof(AudioBuffer)*(channelCount-1));
bufferList->mNumberBuffers = channelCount;
for (int j=0; j<channelCount; j++)
{
AudioBuffer buffer = {0};
buffer.mNumberChannels = 1;
buffer.mDataByteSize = numberFrames*sizeof(SInt32);
buffer.mData = calloc(numberFrames, sizeof(SInt32));
bufferList->mBuffers[j] = buffer;
}
AudioUnitRender(iOUnit, &flags, &inTimeStamp, busNumber, numberFrames, bufferList);
OSStatus res = ExtAudioFileWrite(outputFile, numberFrames, bufferList);
NSAssert(res == noErr, @"Res != noerr");
}
ExtAudioFileDispose(outputFile);
}
因为问题已经很长了,所以我不会添加混合器用于输入的回调函数或用于将文件加载到内存的方法,因为 RemoteIO 工作的事实让我相信没有任何问题用这些。那么,为什么我的图表创建的输出文件是静默的?
最佳答案
调用 AudioUnitRender 后,您需要为下一次迭代增加时间戳的采样时间。
AudioUnitRender(iOUnit, &flags, &inTimeStamp, busNumber, numberFrames, bufferList);
inTimeStamp.mSampleTime += numberFrames;
关于ios - ExtAudioFileWrite 创建静音 m4a,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31031473/
是否有一些系统通知可供我订阅,以便在用户切换响铃/静音按钮时收到通知?我还想知道苹果是否提供了一些“系统通知列表”。我花了一个小时搜索这个但失败了。 最佳答案 没有办法找出这一点。苹果在回应一些请求时
我用 a-videosphere 制作了一个 a-scene。我尝试使用按钮启用/禁用声音,但有些想法不起作用?这是我的代码: var gargamel = 0; function
我正在寻找可以检测并让我知道1分钟的wav文件是否包含声音的实用程序/代码? 换句话说,如果它可以检测到wav文件中任何位置的静默持续时间(如果存在),则也可以达到目的。 SOX是否为此支持任何命令?
我想知道是否可以只使特定 窗口静音。例如,我打开了 Firefox 和另外两个窗口。我想将与 Firefox 相关的所有内容静音,但不想关闭计算机的全部声音。 这可能吗?如果可以,如何实现? 最佳答案
我不知道如何处理我的 JavaScript 中的静音/取消静音按钮,我已经处理这个问题好几个小时了!基本上我的静音按钮可以正常工作,它可以使视频静音,我现在正试图让同一个按钮取消视频静音。有任何想法吗
我正在尝试将 AVCaptureSession 的音频静音和取消静音。开始 session 后,我可以启用和禁用音频连接,但是一旦我播放视频,所有音频部分都会被推回视频的前面,只留下视频的结尾没有声音
我有一组 php/html 页面,其中包含当鼠标悬停在其上时会播放声音的按钮。现在我希望当用户单击另一个按钮时,它会使网站的所有页面静音或将它们置于声音中,具体取决于声音是否已打开。 我已经有一个 h
我正在使用 AudioServicesPlaySystemSoundWithCompletion 播放系统声音,并使用 AVAudioPlayer 播放自定义声音。 为什么打开静音开关会播放声音?我已
我正在使用名为 ExoPlayer 的 Google 新 MediaPlayer,但找不到静音的方法 有没有一种简单的方法可以在 Google ExoPlayer 上将音轨静音?还是改变音量? 最佳答
我收到了大量关于零时长和弦的 music21 警告: WARNING: midi chord with zero duration will be treated as grace 我尝试用以下内容覆
我正在尝试在后台启动端口转发,同时抑制所有输出。这是我尝试过的: kubectl port-forward pod-name 1234:1234 > /dev/null 2>&1 & 然而,当我发起连
我想继续录音,但音频已静音。我是 不是 希望暂停音频。 我现在的替代方法是暂停音频,加入静音填充,继续录音,但如果有更简单的方法,那就太好了。 最佳答案 我也遇到过这个问题,经过长时间的研究,我得到了
在我的 iPhone 应用程序中,我想要静音和取消静音 MPMoviePlayerController。我进行了很多搜索,但无法成功。是否可以在 MPMoviePlayer Controller 中将
我已经看到了确保应用程序遵循静音开关的技术,但是是否可以使用 SDK 将 iPhone 设置为静音(任何应用程序都不会发出声音)? 最佳答案 没有。 使用官方 SDK 开发的应用程序无法更改(并且在大
我要播放以下背景音乐: NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/bgMusic.mp3", [[NSBu
我希望仅为我的 WPF 应用程序静音,并让整个混音器保持用户设置的状态。 我可以使用以下代码使系统范围内的声音静音/取消静音。 但是我注意到当我的应用程序正在运行并且正在播放声音时,我的应用程序会出现
所以我有一个 iframe,其“src”指向一些音乐的 URL。 iframe 被隐藏并自动播放音乐。如何添加一个按钮来使音乐静音? 请注意,音乐来自外部网站。而且 URL 并不指向特定文件。它只是
我正在制作一个小型 Java 应用程序,该应用程序需要以隐藏模式打开 Firefox 浏览器并将其静音。 正如您通过下面的代码看到的,我找到了一种隐藏浏览器的方法。然而,我在弄清楚如何使浏览器静音以及
我正在为我的应用程序使用 SpeechRecognizer API,每次启动时,它都会播放“哔”声。 我想知道如何将它静音,这样我就可以自己实现一个。 谢谢。 最佳答案 如果您使用按钮来激活和停用识别
我正在创建我的第一个应用程序。我有一个使用以下代码在后台播放音乐的应用程序: var backgroundMusicPlayer = AVAudioPlayer() override func vie
我是一名优秀的程序员,十分优秀!