太行一角 發表於 2024-7-18 10:51:00

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

<p>在iOS开发中,音频录制过程涉及几个关键步骤,包括配置录音设置、创建和启动录音机、处理录音会话以及将录制的音频文件上传到服务器。</p>
<h3 id="1-设置音频会话">1. 设置音频会话</h3>
<p>我们需要使用AVFoundation框架来处理音频录制。在录制开始之前,需要配置音频会话。</p>
<pre><code class="language-objc">#import &lt;AVFoundation/AVFoundation.h&gt;

- (void)setupAudioSession {
    AVAudioSession *session = ;
    NSError *sessionError = nil;
   
    // 设置音频会话类别为录音和播放
    ;
    if (sessionError) {
      NSLog(@"Error setting AVAudioSession category: %@", sessionError.localizedDescription);
    }
   
    // 激活音频会话
    ;
    if (sessionError) {
      NSLog(@"Error activating AVAudioSession: %@", sessionError.localizedDescription);
    }
}
</code></pre>
<h3 id="2-配置录音设置">2. 配置录音设置</h3>
<p>创建并配置录音设置字典,可以定义音频格式、采样率、声道数等参数。</p>
<pre><code class="language-objc">- (NSDictionary *)audioRecordingSettings {
    NSDictionary *settings = @{
      AVFormatIDKey : @(kAudioFormatLinearPCM),
      AVSampleRateKey : @44100.0,
      AVNumberOfChannelsKey : @2,
      AVLinearPCMBitDepthKey : @16,
      AVLinearPCMIsBigEndianKey : @NO,
      AVLinearPCMIsFloatKey : @NO
    };
    return settings;
}
</code></pre>
<h3 id="3-创建和启动录音机">3. 创建和启动录音机</h3>
<p>创建一个AVAudioRecorder实例,并使用之前的音频设置字典来初始化录音机,开始录音。</p>
<pre><code class="language-objc">@property (nonatomic, strong) AVAudioRecorder *audioRecorder;
@property (nonatomic, strong) NSURL *audioFileURL;

// 开始录制音频
- (void)startRecording {
    ;

    // 设置录音文件路径
    NSString *documentsPath = ;
    NSString *filePath = ;
    self.audioFileURL = ;

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

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

// AVAudioRecorderDelegate 方法,录音结束时的回调
- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag {
    if (flag) {
      NSLog(@"Recording finished successfully.");
    } else {
      NSLog(@"Recording failed.");
    }
}
</code></pre>
<h3 id="4-提交上传至服务器">4. 提交上传至服务器</h3>
<p>假设服务器端点为<code>https://example.com/upload</code>,我们可以使用<code>NSURLSession</code>来上传音频文件。</p>
<pre><code class="language-objc">- (void)uploadAudioFile {
    NSString *urlString = @"https://example.com/upload";
    NSURL *url = ;
    NSMutableURLRequest *request = ;
    ;
   
    NSString *boundary = @"Boundary-\(NSUUID.UUID.UUIDString)";
    NSString *contentType = ;
    ;
   
    NSData *audioData = ;
    if (!audioData) {
      NSLog(@"Failed to create audio data.");
      return;
    }
   
    NSMutableData *body = ;
    dataUsingEncoding:NSUTF8StringEncoding]];
    dataUsingEncoding:NSUTF8StringEncoding]];
    ];
    ;
    dataUsingEncoding:NSUTF8StringEncoding]];
   
    request.HTTPBody = body;
   
    NSURLSession *session = ;
    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);
      }
    }];
   
    ;
}
</code></pre>
<h3 id="详细的作用说明">详细的作用说明</h3>
<ul>
<li><strong>setupAudioSession</strong>: 配置并激活音频会话,以确保设备可以录音和播放。</li>
<li><strong>audioRecordingSettings</strong>: 定义录音设置,包括音频格式、采样率、声道数等。</li>
<li><strong>startRecording</strong>: 开始录音,准备并启动AVAudioRecorder实例。</li>
<li><strong>stopRecording</strong>: 停止录音。</li>
<li><strong>audioRecorderDidFinishRecording</strong>: 录音结束时的回调,处理录音完成事件。</li>
<li><strong>uploadAudioFile</strong>: 使用NSURLSession将录制的音频文件上传到服务器。</li>
</ul>
<h3 id="小结">小结</h3>
<p>通过以上步骤,我们实现了一个完整的音频录制和上传过程。该示例涵盖了配置音频会话、初始化录音机、处理录音回调、以及将录制的音频文件上传到服务器的详细代码。进一步调试和优化可以根据需要进行扩展和调整。</p>
<hr>
<h3 id="使用websocket上传至服务器">使用websocket上传至服务器</h3>
<p>使用SocketRocket库进行与服务器的通信并通过字节流上传文件,需要几个关键步骤。这些步骤包括连接到WebSocket服务器、准备要上传的音频字节数据、通过SocketRocket发送字节流以及处理服务器的响应。下面是一个详细的示例,包括如何实现这些步骤。</p>
<h3 id="1-引入socketrocket库">1. 引入SocketRocket库</h3>
<p>首先,你需要确保项目中包含了<code>SocketRocket</code>库。可以通过CocoaPods来安装:</p>
<p>在你的<code>Podfile</code>中添加以下代码:</p>
<pre><code class="language-ruby">pod 'SocketRocket'
</code></pre>
<p>然后运行以下命令以安装库:</p>
<pre><code class="language-bash">pod install
</code></pre>
<h3 id="2-配置并连接websocket">2. 配置并连接WebSocket</h3>
<p>导入SocketRocket库,并创建和配置WebSocket连接。</p>
<pre><code class="language-objc">#import &lt;SocketRocket/SocketRocket.h&gt;

@interface ViewController () &lt;SRWebSocketDelegate&gt;

@property (nonatomic, strong) SRWebSocket *webSocket;

@end

@implementation ViewController

- (void)viewDidLoad {
    ;
    ;
}

- (void)setupWebSocket {
    NSURL *url = ;
    self.webSocket = [ initWithURL:url];
    self.webSocket.delegate = self;
    ;
}

// 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
</code></pre>
<h3 id="3-使用字节流上传音频文件">3. 使用字节流上传音频文件</h3>
<p>假设你已经有音频文件的URL,可以将其转换为字节数据,然后通过WebSocket发送二进制数据。</p>
<pre><code class="language-objc">- (void)uploadAudioFileThroughWebSocket {
    if (self.webSocket.readyState != SR_OPEN) {
      NSLog(@"WebSocket is not open.");
      return;
    }

    NSData *audioData = ;
    if (!audioData) {
      NSLog(@"Failed to create audio data.");
      return;
    }
   
    // 设定好标识符,区分是普通消息还是音频数据
    const char identifier[] = {0x01}; // 0x01 作为音频数据的标识
    NSMutableData *dataToSend = ;
    ;
   
    ;
}
</code></pre>
<h3 id="4-整合与测试">4. 整合与测试</h3>
<p>在WebSocket连接成功后,你可以通过调用<code>uploadAudioFileThroughWebSocket</code>方法进行音频文件的上传。</p>
<pre><code class="language-objc">- (void)webSocketDidOpen:(SRWebSocket *)webSocket {
    NSLog(@"WebSocket connection opened.");
    ;
}
</code></pre>
<h3 id="详细的作用说明-1">详细的作用说明</h3>
<ul>
<li><strong>-setupWebSocket</strong>: 创建并配置WebSocket实例,并启动连接。</li>
<li><strong>SRWebSocketDelegate</strong>: 处理WebSocket连接的各种回调,例如收到消息、连接成功、连接失败、连接关闭等。</li>
<li><strong>uploadAudioFileThroughWebSocket</strong>: 将音频文件转换为字节数据,并通过WebSocket发送到服务器。使用标识符来区分数据类型(可选,根据实际需求使用)。</li>
<li><strong>webSocketDidOpen</strong>: WebSocket连接成功后的回调,在这里可以触发音频文件上传。</li>
</ul>
<h3 id="服务端处理">服务端处理</h3>
<p>要处理客户端发送的二进制数据,服务端需要能够识别并正确解析特定的标识符数据,为了简单说明,以下为伪代码示例:</p>
<pre><code class="language-javascript">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 === 0x01) {
      console.log('Received audio data:', audioData);
      // 处理音频数据
    } else {
      console.log('Received message:', data);
    }
});

ws.send('Connection established.');

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


</div>
<div id="MySignature" role="contentinfo">
    将来的你会感谢今天如此努力的你!
版权声明:本文为博主原创文章,未经博主允许不得转载。<br><br>
来源:https://www.cnblogs.com/chglog/p/18309031
頁: [1]
查看完整版本: iOS开发基础129-音频录制上传