使用扩展音频文件写入和读取音频文件

     2023-02-25     143

关键词:

【中文标题】使用扩展音频文件写入和读取音频文件【英文标题】:Writing and reading an audio file with Extended Audio File 【发布时间】:2015-09-21 08:19:22 【问题描述】:

我在使用设备录制时使用 ExtAudioFileWriteAsync 写入音频文件,但是一旦我完成录制,我会尝试使用 ExtAudioFileRead 函数读取它,我得到的样本与我正在编写的样本不同......任何人都知道为什么会这样发生了什么?

写作:

self.audioManager.inputBlock = ^(float *data, UInt32 numFrames, UInt32 numChannels) 
  for (int i = 0; i < numFrames*numChannels; i++) 
        printf("write*%f\n", data[i]);
  

  UInt32 numIncomingBytes = numFrames*numChannels*sizeof(float);
  UInt32 *outputBuffer =(UInt32*)malloc(numIncomingBytes);
  memcpy(outputBuffer, recordedData, numIncomingBytes);

  AudioBufferList outgoingAudio;
  outgoingAudio.mNumberBuffers = 1;
  outgoingAudio.mBuffers[0].mNumberChannels = numChannels;
  outgoingAudio.mBuffers[0].mDataByteSize = numIncomingBytes;
  outgoingAudio.mBuffers[0].mData = self.outputBuffer;

  if( 0 == pthread_mutex_trylock( &outputAudioFileLock ) ) 
         
      ExtAudioFileWriteAsync(outputFile, numFrames, &outgoingAudio);
  
  pthread_mutex_unlock( &outputAudioFileLock );    
;
[self.audioManager play];

阅读:

UInt32 *outputBuffer = (UInt32 *)malloc(numFrames*numChannels*sizeof(float));

AudioBufferList convertedData;
convertedData.mNumberBuffers = 1;
convertedData.mBuffers[0].mNumberChannels = numChannels;
convertedData.mBuffers[0].mDataByteSize = numFrames*numChannels*sizeof(float);
convertedData.mBuffers[0].mData = outputBuffer;

NSMutableArray *samplesArray = [[NSMutableArray alloc]init];
while (numFrames > 0) 
    ExtAudioFileRead(inputFile, &numFrames, &convertedData);
    if (numFrames > 0)  
        AudioBuffer audioBuffer = convertedData.mBuffers[0];
        float *samples = (float *)audioBuffer.mData;
        for (int i = 0; i < frameCount*numChannels; i++) 
            printf("read*%f\n", samples[i]);
        
    

顺便说一句,我正在使用Novocaine 项目来获取设备音频。我可以使用 Novocaine 代码或任何其他播放器重现保存的音频。

写入 ExtAudioFileRef 输出时:

 ExtAudioFileCreateWithURL(audioFileRef, kAudioFileM4AType,   &outputFileDesc, NULL, kAudioFileFlags_EraseFile, &outputFile);

outputFileDesc 在哪里

AudioStreamBasicDescription outputFileDesc = 44100.0, kAudioFormatMPEG4AAC, 0, 0, 1024, 0, thisNumChannels, 0, 0; outputFileDesc.mFormatFlags = kAudioFormatFlagIsBigEndian | kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;

读取 ExtAudioFileRef 时输入文件:

ExtAudioFileOpenURL(audioFileRef, &inputFile):

在两种情况下(写作和阅读)它都采用相同的格式:

AudioStreamBasicDescription outputFormat;
_outputFormat.mSampleRate = self.samplingRate;
_outputFormat.mFormatID = kAudioFormatLinearPCM;
_outputFormat.mFormatFlags = kAudioFormatFlagIsFloat;
_outputFormat.mBytesPerPacket = 4*self.numChannels;
_outputFormat.mFramesPerPacket = 1;
_outputFormat.mBytesPerFrame = 4*self.numChannels;
_outputFormat.mChannelsPerFrame = self.numChannels;
_outputFormat.mBitsPerChannel = 32;


ExtAudioFileSetProperty(outputFile, kExtAudioFileProperty_ClientDataFormat, sizeof(AudioStreamBasicDescription), &_outputFormat);


 ExtAudioFileSetProperty(inputFile, kExtAudioFileProperty_ClientDataFormat, sizeof(AudioStreamBasicDescription), &_outputFormat);

顺便说一句,即使读取样本不等于写入样本,两个信号的平均值也非常相似。但我不完全明白为什么不完全相等!

知道我做错了什么吗?

【问题讨论】:

您的音频质量好吗?展示如何实例化 ExtAudioFileRefs。 是的,音频已正确再现。我正在使用 Novocaine 项目来更轻松地获得语音,即: self.audioManager.inputBlock = ^(float *data, UInt32 numFrames, UInt32 numChannels) "writing audio data"; [self.audioManager 播放]; 【参考方案1】:

这听起来像是来自 ExtaudioFileRefs 之一或两者的隐式格式转换,并且您看到不同的样本作为转换的结果。您有三种格式:audio_in_format、file_format 和 audio_out_format。如果 audio_in_format 与 file_format 不同,写入 ExtAudioFileRef 将创建一个音频转换器,以便您在写入磁盘之前将输入音频转换为 file_format。如果 file_format 与 audio_out_format 不同,读取 ExtAudioFileRef 也会创建一个转换器。

意见: 令人困惑的是,您将写作 ExtAudioFileRef 命名为“outputFile”,而将阅读 ExtAudioFileRef 命名为“inputFile”。我会使用类似 audioWriter 和 audioReader 的东西。

【讨论】:

您好,感谢您的回复!我编辑问题以包括 ExtAudioFileRef outputFile 和 inputFile 代码。它来自 Novocaine 项目,所以我想没关系。在我看到之后,它在写入和读取文件时应用了相同的格式。绘制写入和读取波形我可以看到它们非常相似(但不相等)。 ¿ 为什么样本不完全相同? 查看 mFormatFlags 字段。录制时,音频会先从 LPCM 转换为 MP4 格式,然后再写入磁盘。然后在读取时,在填充缓冲区之前将其从 MP4 转换为 LPCM。这种转换使样本与众不同,MP4 是一种“有损”压缩,这意味着在进行初始转换时信息会丢失。 是的,你是对的!我一定是压缩损失使样本略有不同。我尝试将其更改为另一种格式以检查未成功压缩的情况。可以发个例子吗? 关于如何创建一个没有压缩损失的音频文件,只是为了检查在读取时是否检索到其中记录和保存的内容。我是 AudioFile 格式的新手,在您回答之后,您似乎比我了解更多。 您只需对输入、文件和输出使用相同的 (lpcm) 格式,不会发生任何转换。

我可以使用 AVAudioEngine 从文件中读取,使用音频单元处理并写入文件,比实时更快吗?

】我可以使用AVAudioEngine从文件中读取,使用音频单元处理并写入文件,比实时更快吗?【英文标题】:CanIuseAVAudioEnginetoreadfromafile,processwithanaudiounitandwritetoafile,fasterthanreal-time?【发布时间】:2015-08-2103:26:59【问题描述】:我正在... 查看详情

如何使用 FFMPEG 和 C 将音频和视频写入同一个文件?

】如何使用FFMPEG和C将音频和视频写入同一个文件?【英文标题】:HowdoIwriteaudioandvideotothesamefileusingFFMPEGandC?【发布时间】:2018-06-2902:08:00【问题描述】:我在C程序中使用ffmpeg使用音频文件和视频文件。我正在修改音频和视频数... 查看详情

如何实时读取/写入原始音频数据(使用python)?

】如何实时读取/写入原始音频数据(使用python)?【英文标题】:Howtoread/writerawaudiodatainrealtime(withpython)?【发布时间】:2012-02-0619:35:31【问题描述】:我希望能够实时动态地读写音频数据。我注意到python"audioscope"打开unix/linux/dev/... 查看详情

如何将静音音频数据写入音频流?

】如何将静音音频数据写入音频流?【英文标题】:Howtowritesilentaudiodatatoanaudiostream?【发布时间】:2019-10-2802:25:27【问题描述】:我正在将一些图像写入AVStream,然后我正在读取mp3文件并将其写入不同的AVStream。问题是音频流比视... 查看详情

使用 iPhone SDK 剪切音频文件

】使用iPhoneSDK剪切音频文件【英文标题】:cutaudiofilewithiPhoneSDK【发布时间】:2010-05-2915:36:34【问题描述】:是否可以?(文件扩展名为.caf)我只需要在开始时切断沉默。(另外,也许可以从具有指定开始和结束时间的现有文件... 查看详情

使用 AUHAL 音频单元将字节写入音频文件

】使用AUHAL音频单元将字节写入音频文件【英文标题】:WritingbytestoaudiofileusingAUHALaudiounit【发布时间】:2016-01-1105:38:24【问题描述】:我正在尝试根据从我的macbook的默认输入设备(内置麦克风)获得的声音输入创建一个wav文件。... 查看详情

使用扩展音频文件服务将两个文件混合在一起

】使用扩展音频文件服务将两个文件混合在一起【英文标题】:MixingdowntwofilestogetherusingExtendedAudioFileServices【发布时间】:2010-11-1121:55:42【问题描述】:我正在使用音频单元进行一些自定义音频后处理。我有两个文件要合并在一... 查看详情

使用 AVAssetReader 读取 mp4 文件时第一个音频 CMSampleBuffer 丢失

】使用AVAssetReader读取mp4文件时第一个音频CMSampleBuffer丢失【英文标题】:FirstaudioCMSampleBufferlostwhenreadingmp4fileusingAVAssetReader【发布时间】:2020-02-2123:04:36【问题描述】:我正在使用AVAssetWriter将音频CMSampleBuffer写入mp4文件,但是当... 查看详情

如何使用 AudioToolbox 框架读取音频文件?

】如何使用AudioToolbox框架读取音频文件?【英文标题】:HowdoIreadaudiofileswithAudioToolboxFramework?【发布时间】:2012-03-0512:47:12【问题描述】:我想从wave、mp3和aiff文件中读取数据并将这些数据用于fft。AudioToolbox框架看起来不错,但有... 查看详情

在用 NodeJS 编写音频文件时读取它

...NodeJS【发布时间】:2018-04-1205:07:15【问题描述】:我正在使用ffmpeg通过alsa捕获音频并将其写入wav文件。但是在编写时,我需要将捕获的音频发送给第三方。我尝试了几种方法,包括node-growing-file,但都没有成功。有没有一种方法... 查看详情

同时向 NSMutableArray 写入和读取数据

...5-1819:22:46【问题描述】:我正在尝试制作一个渐进式下载音频播放器,它将在播放时存储尽可能多的音频。音频的格式是流优化m4a。对于这个问题,我认为将带有流媒体的音频数据包放入内存中,不要将其保存到任何文件中以保... 查看详情

使用一个 pyaudio 流进行数据读取和写入

】使用一个pyaudio流进行数据读取和写入【英文标题】:Usingonepyaudiostreamforbothdatareadingandwriting【发布时间】:2019-01-1414:20:08【问题描述】:我有一个web-socket客户端,它在请求中发送音频二进制数据,并从web-socket服务器接收它们... 查看详情

音频文件有哪些后缀名?

...声音格式的编码和解码功能aif声音文件,支持压缩,可以使用WindowsMediaPlayer和QuickTimePlayer播放AIF音频文件,使用WindowsMediaPlayer播放AIFC音频文件,使用WindowsMediaPlayer播放AIFF音频文件,使用WindowsMediaPlayer播放asf微软的媒体播放器支... 查看详情

使用 NAudio 录制音频并在麦克风输入静音时写入文件

】使用NAudio录制音频并在麦克风输入静音时写入文件【英文标题】:RecordingaudiowithNAudioandwritingtoafilewhenmicrophoneinputgoessilent【发布时间】:2016-12-1408:38:06【问题描述】:我使用NAudio编写了这两个函数来记录和写入波形文件。如果... 查看详情

使用 AVCaptureSession 读取音频文件

】使用AVCaptureSession读取音频文件【英文标题】:UseAVCaptureSessiontoReadAudioFiles【发布时间】:2021-04-2817:12:01【问题描述】:我目前有一个用于音乐可视化的macOS应用程序,使用AVAudioEngine读取音乐文件。它包含以下swift代码(为清楚... 查看详情

将浮点数组写入音频文件

...将其写入音频文件。_recordingLength的值约为390000。我正在使用以下代码:NSString*outputPath=@"/Users/evanjackson/output.caf";N 查看详情

读取 AudioFileInitializeWithCallbacks 所需的回调?苹果音频文件 API

...【发布时间】:2012-06-1613:23:28【问题描述】:我正在尝试使用AudioFile和ExtAudioFileAPI编写一个低级音频编写器。我正在使用AudioFileIn 查看详情

coreaudio基础概念

参考技术A在所有API中,AudioUnit延迟最短,使用最灵活.代价很复杂。通过AudioFileService提供的API可以打开并读取或者写入磁盘上存储的文件。它是对AudioFileService的扩展补充。AudioFileService对存储到磁盘上的音频文件进行操作,而Audi... 查看详情