iOS 画音频波形曲线 根据音频数据版

效果图
 
 
 
 
DrawView.h
 
 
[objc]  
#import <UIKit/UIKit.h>  
  
@interface DrawView : UIView  
  
@property shortshort *drawBuffer;  
@property int  dataLen;  
@property floatfloat *outRel;  
@property floatfloat *outImg;  
@property int bias;  
@property int wSize;  
- (void)genKernel;  
  
  
@end  
 
DrawView.m
 
[objc]  
#import "DrawView.h"  
  
@implementation DrawView  
  
#define KSIZE 20  
#define BIAS 10000  
  
static double fk[KSIZE] = {0};  
static double _filterData[2048];  
  
  
  
- (void)genKernel  
{  
    double fc = .05;  
    for (int i = 0; i < KSIZE; i++)  
    {  
        if ((i - KSIZE/2) == 0)fk[i] = 22 * M_PI *fc;  
        if ((i - KSIZE/2) != 0 )fk[i] = sin(22 * M_PI * fc * (i - KSIZE/2))/(i - KSIZE/2);  
        fk[i] = fk[i] * (0.54 - 0.46 * cos(22 * M_PI * i / KSIZE ));  
          
    }  
      
    double sum = 0;  
    for (int m = 0; m < KSIZE; m++)  
        sum+=fk[m];  
      
    for (int n = 0; n < KSIZE; n++)  
        fk[n]/=sum;  
}  
  
- (void)improveSpectrum  
{  
    memset(_filterData, 0x0, sizeof(double) * 1024);  
    short transData[(int)self.wSize];  
    memcpy(transData, self.drawBuffer+_bias, _wSize * sizeof(short));  
    for (int i = 0; i < _wSize; i++)  
    {  
        for (int j = 0; j < KSIZE; j++)  
        {  
            _filterData[i] = _filterData[i] + transData[ i - j] * fk[j];  
        }  
    }  
      
}  
  
  
- (id)initWithFrame:(CGRect)frame  
{  
    self = [super initWithFrame:frame];  
    if (self) {  
    }  
    return self;  
}  
  
  
  
- (void)drawRect:(CGRect)rect  
{  
    float delta = 320. / _wSize;  
    [self improveSpectrum];  
  
    [[UIColor grayColor] set];  
    UIRectFill ([self bounds]);  
      
      
    CGContextRef currentContext = UIGraphicsGetCurrentContext();  
    CGContextBeginPath(currentContext);  
    CGContextMoveToPoint(currentContext, 0., 230.);  
    CGContextAddLineToPoint(currentContext, 320., 230.);  
    [[UIColor blueColor] setStroke];  
    CGContextStrokePath(currentContext);  
  
      
    CGContextBeginPath(currentContext);  
    CGContextMoveToPoint(currentContext, 0., 230.);  
    for (int i = 0; i < _wSize; i++)  
    {  
        CGFloat x = i * delta;  
        CGFloat y = _filterData[i] / 150.0 + 230.0;  
          
          
          
          
          
        CGContextAddLineToPoint(currentContext, x, y);  
          
    }  
    [[UIColor redColor] setStroke];  
    CGContextStrokePath(currentContext);  
  
}  
  
  
@end  
 
 
 
ViewController.h
 
 
 
[objc]  
#import <UIKit/UIKit.h>  
  
@interface ViewController : UIViewController  
  
@end  
 
 
 
 
 
 
 
 
ViewController.m
 
 
 
[objc] 
#import "ViewController.h"  
#import "DrawView.h"  
  
  
struct WavInfo  
{  
    int   size;  
    char  *data;  
    short channels;  
    short block_align;  
    short bits_per_sample;  
    unsigned long sample_rate;  
    unsigned long format_length;  
    unsigned long format_tag;  
    unsigned long avg_bytes_sec;  
      
};  
  
  
@interface ViewController ()  
  
@end  
  
void decodeWaveInfo(const charchar *fname, struct WavInfo *info)  
{  
      
    FILEFILE *fp;  
    fp = fopen(fname, "rb");  
  
    if(fp)  
    {  
        char id[5];  
        unsigned long dataSize,size;  
          
        fread(id, sizeof(char), 4, fp);  
        id[4]='\0';  
        if (!strcmp(id, "RIFF"))  
        {  
            fread(&size, sizeof(unsigned long), 1, fp);//read file size  
            fread(id, sizeof(char), 4, fp);//read wave  
            id[4]='\0';  
              
            if (!strcmp(id, "WAVE"))  
            {  
                fread(id, sizeof(char), 4, fp);  
                fread(&info->format_length, sizeof(unsigned long), 1, fp);  
                fread(&info->format_tag, sizeof(short), 1, fp);  
                fread(&info->channels, sizeof(short), 1, fp);  
                fread(&info->sample_rate, sizeof(unsigned long), 1, fp);  
                fread(&info->avg_bytes_sec, sizeof(unsigned long), 1, fp);  
                fread(&info->block_align, sizeof(short), 1, fp);  
                fread(&info->bits_per_sample, sizeof(short), 1, fp);  
                fread(id, sizeof(char), 4, fp);  
                fread(&dataSize, sizeof(unsigned long), 1, fp);  
                info->size = dataSize;  
                info->data = ( charchar *)malloc(sizeof(char)*dataSize);  
                fread(info->data, sizeof(char), dataSize, fp);  
                  
            }  
            else  
            {  
                printf("Error\n");  
            }  
        }  
        else  
        {  
            printf("Error\n");  
        }  
        fclose(fp);  
    }  
}  
  
@implementation ViewController  
  
- (void)viewDidLoad  
{  
    [super viewDidLoad];  
    NSString *path = [[NSBundle mainBundle] pathForResource:@"effect1" ofType:@"wav"];  
    struct WavInfo wavInfo;  
    decodeWaveInfo([path UTF8String], &wavInfo);  
      
      
    DrawView *d = (DrawView *)self.view;  
    d.drawBuffer = (shortshort *)malloc(sizeof(short) * wavInfo.size / 2 );  
    [d genKernel];  
    d.dataLen = wavInfo.size / 2;  
    d.wSize = 256;  
    d.bias = 0;  
      
    int n = 0;  
    for (int m = 0; m < wavInfo.size / 2; m++)  
    {  
        d.drawBuffer[n++] = wavInfo.data[m * 2 + 1] << 8 | wavInfo.data[m * 2];  
    }  
      
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(dragView:)];  
    [self.view addGestureRecognizer:pan];  
      
    UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchView:)];  
    [self.view addGestureRecognizer:pinch];  
  
      
}  
  
#pragma mark -  
#pragma mark Gesture Recognizer callback  
  
- (void)dragView:(UIPanGestureRecognizer *)recognizer  
{  
    DrawView *d = (DrawView *)self.view;  
      
    CGPoint p = [recognizer translationInView:self.view];  
    NSLog(@"translate point is : %@",NSStringFromCGPoint(p));  
    d.bias -= p.x;  
      
    [self.view setNeedsDisplay];  
}  
  
- (void)pinchView:(UIPinchGestureRecognizer *)recognizer  
{  
    DrawView *d = (DrawView *)self.view;  
      
    if (recognizer.scale > 1.0)  
    {  
        if (d.wSize > 128)  
        {  
            d.wSize *= 0.95;  
        }  
    }  
    else  
    {  
        if (d.wSize < 1024)  
        {  
            d.wSize *= 1.05;  
        }  
    }  
      
    [self.view setNeedsDisplay];  
}  
  
  
- (void)didReceiveMemoryWarning  
{  
    [super didReceiveMemoryWarning];  
    // Dispose of any resources that can be recreated.  
}  
  
@end  
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现将网络音频URL存储到本地并播放,可以按照以下步骤进行操作: 1. 首先,使用AVPlayer或AVPlayerViewController来播放网络音频。例如: ```swift let url = URL(string: "http://example.com/audio.mp3") let player = AVPlayer(url: url!) let playerViewController = AVPlayerViewController() playerViewController.player = player present(playerViewController, animated: true) { player.play() } ``` 2. 接下来,使用URLSession来下载音频文件并将其保存到本地。例如: ```swift let url = URL(string: "http://example.com/audio.mp3") let task = URLSession.shared.downloadTask(with: url!) { (location, response, error) in guard let location = location else { return } let documentsUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! let destinationUrl = documentsUrl.appendingPathComponent("audio.mp3") do { try FileManager.default.moveItem(at: location, to: destinationUrl) // 播放本地音频 let player = AVPlayer(url: destinationUrl) let playerViewController = AVPlayerViewController() playerViewController.player = player present(playerViewController, animated: true) { player.play() } } catch { print(error) } } task.resume() ``` 3. 最后,为了节省空间,可以在不需要时删除本地音频文件。例如: ```swift let fileManager = FileManager.default let documentsUrl = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first! let destinationUrl = documentsUrl.appendingPathComponent("audio.mp3") do { try fileManager.removeItem(at: destinationUrl) } catch { print(error) } ``` 以上就是实现将网络音频URL存储到本地并播放的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值