首页 > 其他分享 >iOS开发基础129-音频录制上传

iOS开发基础129-音频录制上传

时间:2024-07-18 10:52:14浏览次数:13  
标签:WebSocket NSLog 音频 iOS void 129 self webSocket

在Objective-C中,音频录制过程涉及几个关键步骤,包括配置录音设置、创建和启动录音机、处理录音会话以及将录制的音频文件上传到服务器。下面是一个详细的示例,包括创建一个简单的音频录制应用,以及将录制的音频文件上传到服务器的代码。

1. 设置音频会话

我们需要使用AVFoundation框架来处理音频录制。在录制开始之前,需要配置音频会话。

#import <AVFoundation/AVFoundation.h>

- (void)setupAudioSession {
    AVAudioSession *session = [AVAudioSession sharedInstance];
    NSError *sessionError = nil;
    
    // 设置音频会话类别为录音和播放
    [session setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];
    if (sessionError) {
        NSLog(@"Error setting AVAudioSession category: %@", sessionError.localizedDescription);
    }
    
    // 激活音频会话
    [session setActive:YES error:&sessionError];
    if (sessionError) {
        NSLog(@"Error activating AVAudioSession: %@", sessionError.localizedDescription);
    }
}

2. 配置录音设置

创建并配置录音设置字典,可以定义音频格式、采样率、声道数等参数。

- (NSDictionary *)audioRecordingSettings {
    NSDictionary *settings = @{
        AVFormatIDKey : @(kAudioFormatLinearPCM),
        AVSampleRateKey : @44100.0,
        AVNumberOfChannelsKey : @2,
        AVLinearPCMBitDepthKey : @16,
        AVLinearPCMIsBigEndianKey : @NO,
        AVLinearPCMIsFloatKey : @NO
    };
    return settings;
}

3. 创建和启动录音机

创建一个AVAudioRecorder实例,并使用之前的音频设置字典来初始化录音机,开始录音。

@property (nonatomic, strong) AVAudioRecorder *audioRecorder;
@property (nonatomic, strong) NSURL *audioFileURL;

// 开始录制音频
- (void)startRecording {
    [self setupAudioSession];

    // 设置录音文件路径
    NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    NSString *filePath = [documentsPath stringByAppendingPathComponent:@"recordedAudio.caf"];
    self.audioFileURL = [NSURL fileURLWithPath:filePath];

    NSError *error = nil;
    self.audioRecorder = [[AVAudioRecorder alloc] initWithURL:self.audioFileURL settings:[self audioRecordingSettings] error:&error];
    
    if (error) {
        NSLog(@"Error initializing AVAudioRecorder: %@", error.localizedDescription);
        return;
    }
    
    self.audioRecorder.delegate = self;
    [self.audioRecorder prepareToRecord];
    [self.audioRecorder record];
}

// 停止录制音频
- (void)stopRecording {
    if (self.audioRecorder.isRecording) {
        [self.audioRecorder stop];
    }
}

// AVAudioRecorderDelegate 方法,录音结束时的回调
- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag {
    if (flag) {
        NSLog(@"Recording finished successfully.");
    } else {
        NSLog(@"Recording failed.");
    }
}

4. 提交上传至服务器

假设服务器端点为https://example.com/upload,我们可以使用NSURLSession来上传音频文件。

- (void)uploadAudioFile {
    NSString *urlString = @"https://example.com/upload";
    NSURL *url = [NSURL URLWithString:urlString];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"POST"];
    
    NSString *boundary = @"Boundary-\(NSUUID.UUID.UUIDString)";
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
    [request setValue:contentType forHTTPHeaderField:@"Content-Type"];
    
    NSData *audioData = [NSData dataWithContentsOfURL:self.audioFileURL];
    if (!audioData) {
        NSLog(@"Failed to create audio data.");
        return;
    }
    
    NSMutableData *body = [NSMutableData data];
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"recordedAudio.caf\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[@"Content-Type: audio/caf\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:audioData];
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    
    request.HTTPBody = body;
    
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *uploadTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        if (error) {
            NSLog(@"Error uploading file: %@", error.localizedDescription);
        } else {
            NSLog(@"File uploaded successfully with response: %@", response);
        }
    }];
    
    [uploadTask resume];
}

详细的作用说明

  • setupAudioSession: 配置并激活音频会话,以确保设备可以录音和播放。
  • audioRecordingSettings: 定义录音设置,包括音频格式、采样率、声道数等。
  • startRecording: 开始录音,准备并启动AVAudioRecorder实例。
  • stopRecording: 停止录音。
  • audioRecorderDidFinishRecording: 录音结束时的回调,处理录音完成事件。
  • uploadAudioFile: 使用NSURLSession将录制的音频文件上传到服务器。

小结

通过以上步骤,我们实现了一个完整的音频录制和上传过程。该示例涵盖了配置音频会话、初始化录音机、处理录音回调、以及将录制的音频文件上传到服务器的详细代码。进一步调试和优化可以根据需要进行扩展和调整。


使用websocket上传至服务器

使用SocketRocket库进行与服务器的通信并通过字节流上传文件,需要几个关键步骤。这些步骤包括连接到WebSocket服务器、准备要上传的音频字节数据、通过SocketRocket发送字节流以及处理服务器的响应。下面是一个详细的示例,包括如何实现这些步骤。

1. 引入SocketRocket库

首先,你需要确保项目中包含了SocketRocket库。可以通过CocoaPods来安装:

在你的Podfile中添加以下代码:

pod 'SocketRocket'

然后运行以下命令以安装库:

pod install

2. 配置并连接WebSocket

导入SocketRocket库,并创建和配置WebSocket连接。

#import <SocketRocket/SocketRocket.h>

@interface ViewController () <SRWebSocketDelegate>

@property (nonatomic, strong) SRWebSocket *webSocket;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self setupWebSocket];
}

- (void)setupWebSocket {
    NSURL *url = [NSURL URLWithString:@"wss://example.com/socket"];
    self.webSocket = [[SRWebSocket alloc] initWithURL:url];
    self.webSocket.delegate = self;
    [self.webSocket open];
}

// SRWebSocketDelegate 方法
- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message {
    NSLog(@"Received message: %@", message);
}

- (void)webSocketDidOpen:(SRWebSocket *)webSocket {
    NSLog(@"WebSocket connection opened.");
}

- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error {
    NSLog(@"WebSocket connection failed with error: %@", error);
}

- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean {
    NSLog(@"WebSocket closed with reason: %@", reason);
}

@end

3. 使用字节流上传音频文件

假设你已经有音频文件的URL,可以将其转换为字节数据,然后通过WebSocket发送二进制数据。

- (void)uploadAudioFileThroughWebSocket {
    if (self.webSocket.readyState != SR_OPEN) {
        NSLog(@"WebSocket is not open.");
        return;
    }

    NSData *audioData = [NSData dataWithContentsOfURL:self.audioFileURL];
    if (!audioData) {
        NSLog(@"Failed to create audio data.");
        return;
    }
    
    // 设定好标识符,区分是普通消息还是音频数据
    const char identifier[] = {0x01}; // 0x01 作为音频数据的标识
    NSMutableData *dataToSend = [NSMutableData dataWithBytes:identifier length:sizeof(identifier)];
    [dataToSend appendData:audioData];
    
    [self.webSocket send:dataToSend];
}

4. 整合与测试

在WebSocket连接成功后,你可以通过调用uploadAudioFileThroughWebSocket方法进行音频文件的上传。

- (void)webSocketDidOpen:(SRWebSocket *)webSocket {
    NSLog(@"WebSocket connection opened.");
    [self uploadAudioFileThroughWebSocket];
}

详细的作用说明

  • -setupWebSocket: 创建并配置WebSocket实例,并启动连接。
  • SRWebSocketDelegate: 处理WebSocket连接的各种回调,例如收到消息、连接成功、连接失败、连接关闭等。
  • uploadAudioFileThroughWebSocket: 将音频文件转换为字节数据,并通过WebSocket发送到服务器。使用标识符来区分数据类型(可选,根据实际需求使用)。
  • webSocketDidOpen: WebSocket连接成功后的回调,在这里可以触发音频文件上传。

服务端处理

要处理客户端发送的二进制数据,服务端需要能够识别并正确解析特定的标识符数据,为了简单说明,以下为伪代码示例:

const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', function connection(ws) {

  ws.on('message', function incoming(data) {
    let identifier = data.slice(0, 1);
    let audioData = data.slice(1);

    if (identifier[0] === 0x01) {
      console.log('Received audio data:', audioData);
      // 处理音频数据
    } else {
      console.log('Received message:', data);
    }
  });

  ws.send('Connection established.');

});

总结

通过SocketRocket进行字节流上传需要创建并连接WebSocket、准备好音频数据及其标识符、发送二进制数据,并处理服务器响应。服务端需要识别客户端发送的标识符并进行相应的处理。这个流程适用于需要实时数据传输或长连接的音频上传场景。

标签:WebSocket,NSLog,音频,iOS,void,129,self,webSocket
From: https://www.cnblogs.com/chglog/p/18309031

相关文章

  • 小白学习微信小程序开发中的图片和音频处理
    微信小程序开发中,图片和音频的处理是非常常见的功能之一。在本文中,我将详细介绍如何在小程序中进行图片和音频的处理,并提供相关的代码案例。一、图片处理图片的选择和上传在小程序中,用户可以选择图片并上传。首先需要在app.json中注册chooseImage和uploadFile的相关权限。然......
  • 使用Django框架实现音频上传功能
    数据库设计(models.py)classMusic(models.Model):"""音乐"""name=models.CharField(verbose_name="音乐名字",max_length=32)singer=models.CharField(verbose_name="歌手",max_length=32)#本质上数据库也是Cha......
  • iOS开发基础127-深入探讨KVO
    一、基础KVO(Key-ValueObserving,键值观察)是Cocoa提供的一种机制,它允许我们观察属性的变化并做出响应。这种机制非常强大,广泛应用于各种编程场景,如数据绑定、状态变化监控等。在深入了解KVO之前,我们先从KVO的基本概念开始,然后逐步探讨其深层次应用和一些使用实践的注意事项......
  • 在 PowerShell 中Get-WmiObject Win32_PhysicalMemory,SMBIOSMemoryType 是一种用于描
    在PowerShell中Get-WmiObjectWin32_PhysicalMemory,SMBIOSMemoryType是一种用于描述系统中物理内存类型的属性。数字26表示特定的内存类型,具体为DDR4内存。每种内存类型在SMBIOS(SystemManagementBIOS)规范中都有一个对应的数字码,用来标识不同类型的内存。以下是一些常见......
  • iOS开发基础125-深入探索SDWebImage
    SDWebImage是一个流行的用于处理图像下载和缓存的库,广泛用于iOS开发中,提供了一系列方便的API来下载和缓存图像,以提高应用的性能和用户体验。以下是对其进行详细介绍和分析,包括其原理和底层实现。一、SDWebImage的主要功能图像下载和缓存:图像下载:使用异步方式从网络上下......
  • iOS开发基础124-RunLoop实现卡顿检测
    利用RunLoop实现卡顿检测的基本思路是通过监听RunLoop的状态变化来判断主线程的执行时长。如果RunLoop在某个状态停留的时间超过了预设的时间阈值,则认为发生了卡顿。在具体实现中,可以利用CFRunLoopObserver来监听RunLoop的状态变化,并记录时间差。一、卡顿检测的基本原......
  • iOS开发基础122-RunLoop
    深入探讨RunLoop的底层实现需要了解CoreFoundation框架中的CFRunLoop以及与RunLoop工作机制紧密相关的操作系统底层API。这些底层实现主要涉及到事件源、定时器和线程的调度机制。本文将深入剖析RunLoop的底层结构及其运行流程。一、RunLoop底层数据结构涉及RunLo......
  • iOS开发基础123-自动释放池
    自动释放池(AutoreleasePool)是Objective-C中用于管理内存的一个重要机制,它帮助开发者简化内存管理的工作。自动释放池的核心概念是将对象放入池中,在某个时刻由系统统一释放这些对象。这种机制在iOS和macOS的应用开发中广泛使用,尤其是在事件循环和线程运行时。为了深入理解其底层......
  • 基于java+springboot+vue实现的学生选课系统(文末源码+Lw)129
     系统角色:学生、教师、管理员系统功能:管理员管理专业,教师,学生,课程,查看学生选课以及学生成绩信息。教师查询学生,查询课程,审核学生选课信息,为学生学习的课程进行成绩打分学生参与课程选课,查询选课信息,查询已选课程的成绩信息。技术栈:开发语言:JavaJDK版本:JDK8前端......
  • vue请求接口常用写法(axios)
    1.项目根目录下新建一个utils文件夹,并新建一个request.js文件(注意:是以axios方法请求的,所以需要先安装axios或cdn引入)安装:npmnpminstallaxios-Syarnyarnaddaxios-Scdn<scriptsrc="https://unpkg.com/axios/dist/axios.min.js"></script>&&配置代码imp......