使用 Swift 完成FFmpeg音频录制、播放和视频格式转换应用

server/2025/2/6 17:07:21/

使用 Swift 构建音频录制、播放和视频格式转换应用

在这篇博客中,我们介绍如何用ffmpeg在swift上实现音频录制、音频播放、通过ffmpeg命令实现视频格式转换

  1. 音频录制:通过 AVAudioRecorder 实现音频录制功能。
  2. 音频播放:通过 AVAudioPlayer 实现录制音频的播放。
  3. 视频格式转换:通过 FFmpegKit 实现视频格式的转换。

这段代码展示了如何结合 iOS 的音频和视频处理框架,以及第三方库 FFmpegKit,来构建一个功能丰富的多媒体应用。
完整代码:

import AVFoundation
import Foundation// 定义协议,用于通知录音状态的变化
protocol AudioRecorderDelegate: AnyObject {func customAudioRecorderDidFinishRecording(successfully flag: Bool)func customAudioRecorderDidEncounterError(_ error: Error)
}class AudioRecorder: NSObject {private var audioRecorder: AVAudioRecorder?private var recordingSession: AVAudioSession!weak var delegate: AudioRecorderDelegate?private var isRecording: Bool = false// 录音文件保存路径(可自定义)private var recordingFileURL: URL {// 获取 Documents 目录let documentsPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]// 创建文件名,修改扩展名为 .wavlet audioFilename = documentsPath.appendingPathComponent("recording.wav")return audioFilename}// 请求麦克风权限并设置音频会话排func requestPermissionAndSetupSession(completion: @escaping (Bool) -> Void) {recordingSession = AVAudioSession.sharedInstance()// 请求麦克风权限AVAudioSession.sharedInstance().requestRecordPermission { [unowned self] allowed inDispatchQueue.main.async {if allowed {do {// 设置音频会话类别和模式try recordingSession.setCategory(.playAndRecord, mode: .default)try recordingSession.setActive(true)completion(true)} catch {print("音频会话配置失败:\(error.localizedDescription)")self.delegate?.customAudioRecorderDidEncounterError(error)completion(false)}} else {print("麦克风权限被拒绝")completion(false)}}}}// 开始录音func startRecording() {

http://www.ppmy.cn/server/165464.html

相关文章

51单片机 04 编程

一、模块化编程 .c文件:函数、变量的定义 .h文件:可被外部调用的函数、变量的声明 函数在调用前必须有定义或者声明。 预编译:以#开头,作用是在真正的编译开始之前,对代码做一些处理(预编译&#xff09…

算法 哈夫曼树和哈夫曼编码

目录 前言 一,二进制转码 二,哈夫曼编码和哈夫曼树 三,蓝桥杯 16 哈夫曼树 总结 前言 这个文章需要有一定的树的基础,没学过树的伙伴可以去看我博客树的文章 当我们要编码一个字符串转成二进制的时候,我们要怎么…

Android 开发:新的一年,新的征程

回顾 2023 年,Android 开发领域可谓成果斐然。这一年,Android 系统不断迭代,新技术、新工具层出不穷,为开发者们带来了前所未有的机遇与挑战。如今,我们站在新的起点,怀揣着对技术的热爱与追求,…

java 日常下拉框接口字典封装

Operation(description "字典") GetMapping("/dict") public Result dict() {Long userItemId super.getUserItemId();Page<Manure> objectPage new Page<>();objectPage.setSize(100000);objectPage.setCurrent(1);Page<Manure> pag…

在Ubuntu子系统中基于Nginx部署Typecho

下载部署程序 typecho上传文件到子系统 创建文件夹typecho 在目录/var/www/html中创建一个目录typecho cd /var/www/html mkdir typecho将文件typecho.zip上传至新建的目录下&#xff0c;并解压文件 unzip typecho.zip授权文件夹 sudo chown -R www-data:www-data /var/www…

简易CPU设计入门:指令单元(二)

项目代码下载 请大家首先准备好本项目所用的源代码。如果已经下载了&#xff0c;那就不用重复下载了。如果还没有下载&#xff0c;那么&#xff0c;请大家点击下方链接&#xff0c;来了解下载本项目的CPU源代码的方法。 CSDN文章&#xff1a;下载本项目代码 上述链接为本项目…

MATLAB与计算机视觉:手势识别实战技术

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;手势识别是现代科技领域的一个重要应用方向&#xff0c;它在人机交互、虚拟现实和智能安防等多个领域中都发挥着关键作用。本项目详细介绍利用MATLAB这一工具结合计算机视觉理论&#xff0c;实现一个高效的手势识…

防火墙安全策略实验

拓扑 需求 1.VLAN2属于办公区&#xff1b;VLAN3属于生产区。 2.办公区PC在工作日时间&#xff08;周一到周五&#xff0c;早8到玩6&#xff09;可以正常访问OA server&#xff0c;其他时间不允许。 3.办公区PC可以在任意时刻访问web server。 4.生产去PC可以在任意时刻访问…