【问题标题】:AudioKit rolling waveform plot not displaying on physical deviceAudioKit 滚动波形图未显示在物理设备上
【发布时间】:2018-07-09 17:21:00
【问题描述】:

我一直在尝试使用 AudioKit,并制作了一个示例应用程序来尝试从回放中录制音频和音频。不过,我看到一个问题,当我录制或播放音频时,滚动波形不会显示在设备的视图中。但是,它在 sim (11.4) 上显示得非常好。我在下面提供了录制视图控制器代码,以了解我在录制音频时如何尝试实现这一点。

任何帮助或指出大方向将不胜感激。

录制VC.m代码:

#import "FirstViewController.h"

@interface FirstViewController ()

@end

@implementation FirstViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    [self setupConfig];
    [self setupUI];
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void) setupUI
{
    //Configure waveform view
    self.recordingPlotView.gain = 2;
    self.recordingPlotView.backgroundColor = [UIColor colorWithRed: .10 green: .10 blue: .10 alpha: 1];
    self.recordingPlotView.color = [UIColor colorWithRed: .44 green: .44 blue: .44 alpha: 1];
    self.recordingPlotView.plotType = EZPlotTypeRolling;
    self.recordingPlotView.shouldFill = YES;
    self.recordingPlotView.shouldMirror = YES;
    [self.view addSubview: self.recordingPlotView];
}

- (void) setupConfig
{
    self.isRecording = NO;
    [AKSettings setAudioInputEnabled: true];
    [AKSettings setPlaybackWhileMuted: true];
    [AVAudioSession.sharedInstance setCategory: AVAudioSessionCategoryAmbient withOptions: kAudioSessionProperty_OverrideCategoryDefaultToSpeaker error: nil];

    self.mic = [[EZMicrophone alloc] initWithMicrophoneDelegate: self];
}

#pragma mark - EZMicrophone Delegate methods
- (void)   microphone:(EZMicrophone *)microphone
     hasAudioReceived:(float **)buffer
       withBufferSize:(UInt32)bufferSize
 withNumberOfChannels:(UInt32)numberOfChannels
{
    __weak typeof (self) weakSelf = self;
    dispatch_async(dispatch_get_main_queue(), ^{

        [weakSelf.recordingPlotView updateBuffer:buffer[0]
                                   withBufferSize:bufferSize];
    });
}

- (void)   microphone:(EZMicrophone *)microphone
        hasBufferList:(AudioBufferList *)bufferList
       withBufferSize:(UInt32)bufferSize
 withNumberOfChannels:(UInt32)numberOfChannels
{
    if (self.isRecording)
    {
        [self.recorder appendDataFromBufferList:bufferList
                                 withBufferSize:bufferSize];
    }
}

#pragma mark - EZRecorder Delegate methods
- (void)recorderDidClose:(EZRecorder *)recorder
{
    self.recorder.delegate = nil;
}

#pragma mark - Utils
- (NSArray *)applicationDocuments
{
  return NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
}


- (NSString *)applicationDocumentsDirectory
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
    return basePath;
}

- (NSURL *)testFilePathURL
{
    return [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/%@",
                                   [self applicationDocumentsDirectory],
                                   @"test2.m4a"]];
}

#pragma mark - user Interaction

- (IBAction)playButtonTapped:(id)sender {
    if (self.isRecording)
    {
        self.isRecording = NO;
        self.playButton.titleLabel.text = @"Record";
        [self.mic stopFetchingAudio];
    }
    else
    {
        self.isRecording = YES;
        self.playButton.titleLabel.text = @"Pause";
        [self.mic startFetchingAudio];
        self.recorder = [EZRecorder recorderWithURL: [self testFilePathURL] clientFormat: [self.mic audioStreamBasicDescription] fileType: EZRecorderFileTypeM4A delegate: self];
    }
}
- (IBAction)stopButtonTapped:(id)sender {
    if (self.isRecording)
    {
        self.isRecording = NO;
        self.playButton.titleLabel.text = @"Record";
        [self.mic stopFetchingAudio];
        [self.recorder closeAudioFile];
    }
    [self.recordingPlotView clear];
    self.recorder = nil;
}

@end

录制VC.h代码:

#import <UIKit/UIKit.h>
@import AudioKit;
@import AudioKitUI;

@interface FirstViewController : UIViewController <EZMicrophoneDelegate, EZRecorderDelegate>

@property (strong, nonatomic) IBOutlet EZAudioPlot *recordingPlotView;
@property (nonatomic, strong) EZMicrophone* mic;
@property (nonatomic, strong) EZRecorder* recorder;
@property (nonatomic, assign) BOOL isRecording;
@property (strong, nonatomic) IBOutlet UIButton *playButton;

@end

小更新: 我已经设法通过在界面生成器中设置增益来在设备上显示播放波形,即使我在 viewDidLoad() 期间在代码中设置了它。

我已经尝试为录制 VC(上面的代码)做同样的事情(在界面生成器中设置绘图的增益),但这确实解决了这个问题,就像它为播放 VC 所做的那样。

【问题讨论】:

  • 愿意分享一个我可以尝试的可构建项目吗?它可以是私有的。
  • 没错!你想怎么做?我可以提供一个分享链接,从投递箱或谷歌驱动器给你。
  • 如果你已经在 github 上,你可以给我发送一个 repo 的邀请,如果我想出一个,我可以推送一个修复。除了那个保管箱之外很好。

标签: objective-c iphone audio-recording audiokit


【解决方案1】:

我运行了你的项目,它在设备上与模拟器一样工作,只是模拟器的麦克风是计算机的,而且看起来比设备上灵敏得多,所以我不得不将增益设置得更高:

self.recordingPlotView.gain = 20;

在我注意到波形之前。

【讨论】:

  • 谢谢!关于增益,即使增益很小,我仍然应该看到值为 0 的线,因为它穿过视图,对吗?这是我使用这个库时的经验。我不确定问题是什么。由于某种原因,这个项目仍然没有在我的任何设备上显示波形,但我最近尝试将它与我的另一个项目(类似的逻辑)集成,它显示在设备和 sim 上就好了。不用担心,感谢您的时间。我只是想检查一下这不是我对这个库的基本内容的误解。
  • 是的,仍然有值通过零。我不知道为什么它有时片状。感谢您接受答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-11
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多