Tag: avfoundation

如何正确编写扫描QR码的ViewController

让我们编写一个解耦的代码,通过使用组合甚至可以测试我们的ViewController! 😱 当我不得不编写QR码扫描仪应用程序时,我以前从未使用过AVFoundation。 因此,我遵循了通常的脚本:我阅读了一些文档,阅读了一些教程并将学习的内容应用于我的需求。 通用方法的问题在于,它使ViewController符合另一种协议。 因此,它增加了另一个责任! 我将以一个简单的应用程序为例,向您展示一种更好的方法。 第一个ViewController需要一种使用摄像机捕获视频并显示在此辣味混合框中捕获的内容的方法。 另外,当用户将相机指向QR码时,它需要解释并解码其值。 之后,它可以停止捕获视频。 AVFoundation助我们一臂之力! AVFoundation 尽管QR代码已经很老了,但是直到iOS 7才有了AV Nativeation的巨大改进,我们没有在iOS上读取它们的原生方法。 现在,这是在iOS上实现代码读取器的最简单方法! 它具有我们完成此任务所需的所有功能。 AVCaptureDevice Input负责捕获视频。 AVCaptureVideo 预览层,用于显示实时视频。 AVCaptureMetadata 输出是将解释和解码QR码的输出。 AVCapture Session可以管理输入和输出之间的数据流。 我将所有这些逻辑包装在名为AVCodeReader的类中。 它的界面由两个函数和一个属性组成。 该函数开始读取QR码并使用转义闭包来通知何时解码值。 另一个停止使用相机资源。 还有CALayer属性,其中包含正在捕获的视频。 定义AVCodeReader接口的协议 AVCodeReader 我使用init来设置前面提到的所有AVFoundation类。 https://github.com/danielCarlosCE/aguente/blob/master/Aguente/Model/Implementation/AVCodeReader.swift 首先要记住的是,该设备(如模拟器)可能没有摄像头。 您必须决定接下来会发生什么。 我选择不破坏应用程序,而是选择一个空的videoPreview和一个nil captureSession 。 现在,它可以在不为captureSession时使用captureSession启动和停止读取QR码。 https://github.com/danielCarlosCE/aguente/blob/master/Aguente/Model/Implementation/AVCodeReader.swift 请注意,我将completion闭包分配给didRead属性,因此可以从另一个函数调用它。 要用作输出的委托,它必须符合AVCaptureMetadataOutputObjectsDelegate 。 该协议需要NSObjectProtocol ,因此我将类NSObject的子类。 https://github.com/danielCarlosCE/aguente/blob/master/Aguente/Model/Implementation/AVCodeReader.swift ReaderViewController 承诺是写一个解耦的代码! 让我们看看ViewController的样子。 https://github.com/danielCarlosCE/aguente/blob/master/Aguente/Controller/ReaderViewController.swift 尽管ViewController不知道如何扫描QR码,但它具有依赖关系。 由于在使用情节提要时不能使用构造函数注入,因此我在此处使用了强制展开属性。 因此,如果有人在调用此视图之前忘记设置依赖项,则应用程序将崩溃! 请注意,我不仅要添加videoPreview图层,而且还要在视图布局其子视图时对其进行更新,因为在viewDidLoad尚未设置自动布局的约束。 […]

使iOS Audio Player变得简单

因为互联网上的点点滴滴令人费解! 任务:创建没有外部库的音频播放器(差不多) 我搜寻了已知的google空间的长度,以查找有关使用Swift和基本功能制作音频播放器的所有可用信息。 简单吧? 事实证明……不多。 大多数StackOverflow(从现在开始为SO)处理过程的一部分,通常分为Obj-C,Swift-2,Swift-3和一小部分Swift-4。 文章还受Swift版本控制的困扰,或者缺少它,并且完全用Obj-C编写。 插件和库也已过时,用Obj-C编写或未维护。 第一个子任务:创建一个AudioQueue并播放一个曲目。 因此,我们开始使用AVFramework创建一个简单的AudioQueue 主要故事任务:建立一个AudioPlayer类 为了做到这一点,我们首先需要做两件事。 如我们所见,为了将项目添加到AVQueuePlayer我们必须将它们转换为AVPlayerItem并且要做到这一点,我们必须首先将它们转换为AVAsset 。 但是这里有个问题, AVAsset在定义AVAsset开始加载,这意味着我们不想立即添加它,因为它AVAsset无法播放,我们需要先加载它,然后将其添加到AVQueuePlayer 。 这里还有第二个陷阱,如果我们按照上面描述的路径进行操作,我们会将异步功能添加到队列中,并且很可能肯定不会以我们希望它们添加的顺序添加内容。 我们做什么? 抢救同步队列! 完成加载后,曲目将被一一添加。 循环每个.mp3 url->使它成为队列中的资产->加载资产(异步)时->将其转换为AVPlayerItem->队列继续下一个.mp3 url 那么什么时候知道所有物品都准备好了呢? 很简单(不是,但是确实如此) 在上面的代码中,我们缺少AVItemPool参考。 这里是: 如果您有任何疑问或更正,请在评论中打上我一行,希望对您有用。 请享用!

如何在iOS上创建可暂停的音频录制应用

我们的应用程序允许志愿者记录盲人和印刷品受损人士的文章。 使用AVAudioRecorder非常简单AVAudioRecorder ,它还允许暂停,但是它没有提供任何方法来监听录音,直到过程暂停为止。 必须停止记录才能将数据写入磁盘,并使播放器(例如AVAudioPlayer , AVPlayer , AVQueuePlayer等)可以播放数据。 下图希望有助于突出显示本文中使用的类之间的联系。 NSObject隐式隐含为没有继承箭头的超类。 注意:黑色继承箭头的方向选择可能很不幸。 要解决此问题,请阅读下图, “ AVQueuePlayer 继承了 AVPlayer ” 要么 “ AVComposition 继承了 AVAsset ” 一个重要的推论是AVPlayerItem将在其init接受AVAsset , AVComposition和AVMutableComposition 。 (有关官方证明,请参阅AVMutableComposition的文档。) CAVEAT:该应用程序已经超出了这些控件的范围,但是仍然适用于一般用例(并且将提供全面的文档)。 发现这一事实后,很明显 在部分录音中必须保留参考(以最终由所选音频播放器控制的类型为准-参见下文),以及 阅读完文章后,使用AVAssetExportSession将它们连接起来。 所有这些都应在后台完成,使控件对用户透明: 记录 :实例化AVAudioRecorder对象,并开始记录。 STOP / PAUSE :停止录音,取消self.audioRecorder属性,并将音频追加到self.articleChunks数组。 播放 :用该点的部分录音实例化播放器(即self.articleChunks )并开始播放。 队列和提交 :除了目标略有不同外,它们都将连接录音片段,并使生成的音频文件充满元数据。 在使用RECORD,STOP / PAUSE和PLAY时,记录尚未完成,但在按QUEUE或SUBMIT后,将导出最终结果,并且UI会重置为其初始状态(即, self.articleChunks设置为空数组,没有发布)已选择,标题已清除等)。 AVQueuePlayer选择AVQueuePlayer作为播放器,是因为在我们的方案中,它是最简单,最快的管理方式。 反对其他玩家的原因: 可以直接使用URL或Data初始化AVAudioPlayer ,然后将播放器对象存储在数组中,但是需要花费大量精力才能实现连续播放。 AVPlayer有点高级,它仍然允许通过URL进行初始化,并且可以使用replaceCurrentItem替换当前播放的项目,因此一个对象就足够了。 缺点是后一种方法需要提供AVPlayerItem ,并且需要帮助方法来以正确的顺序连续播放音频块。 […]

在Swift 3中创建音乐播放器应用

在此博客中,我将逐步创建一个音乐播放器应用程序,以播放我最喜欢的歌曲之一:Purple Rain☔️。 在此应用程序中,我们将使用AVFoundation,这是一个Apple框架,可让我们记录/播放/编辑照片,视频和音频。 步骤1:建立使用者介面 对于我的UI,在Storyboard中 ,我拖动了一个带有三个按钮的工具栏 。 在Attributes Inspector中 ,我使用PLAY按钮,PAUSE按钮将按钮更改为Systems Items ,并在最后一个按钮上键入“ Restart”。 我还确保在三个按钮之间分别拖动了弹性空格键按钮项 。 步骤2:为这些按钮创建IBAction。 按住Control键,将故事板中的3个按钮分别拖到ViewController文件中。 确保每个连接都是一个动作 ,而不是一个插座 。 步骤3:选择歌曲! 我已经从iTunes下载了《 Purple Rain》这首歌,因此将其从iTunes拖到“项目导航器”窗格中(位于Main.storyboard下方 )文件中。 如果需要,复制项目。 当它出现在“导航器”窗格中时,我将其重命名为简单的名称,例如PurpleRain。 文件类型为.m4a 。 请勿将其更改为mp3。 当我尝试将其更改为mp3时,发生了坏事。 步骤4和5:导入AVFoundation并创建一个AVAudioPlayer。 就像我之前提到的,AVFoundation是Apple的框架,允许您播放/编辑/创建视频/照片/音频。 从Apple文档中: AV Foundation框架提供了一个Objective-C界面,用于在iOS和macOS应用程序中管理和播放视听媒体。 我们在顶部导入此框架,并创建一个AVAudioPlayer类的实例,该类正是这样做的,它播放文件中的音频。 第6步:编写一个函数来设置我们的歌曲和会话。 从Apple文档中: 音频会话用于与系统交流您打算如何在应用程序中使用音频。 音频会话充当您的应用程序与操作系统之间的中介,进而充当基础音频硬件之间的中介。 我编写了一个函数prepareSongAndSession()来处理此功能: 步骤7–13:设置我们的AVAudioPlayer和AVAudioSession。 由于我是从iTunes手动将Purple Rain歌曲拖到项目中的,所以现在它已成为项目Bundle的一部分。 #7 —我将歌曲(来自捆绑包)插入我的AVAudioPlayer中 。 我用“!”来敲它,因为我确定这首歌存在于项目中。 此操作将引发错误,因此将执行do / try / catch块。 转到“ […]

为什么这个MP3文件不stream式传输

我试图用`avPlayer`播放这个mp3文件,但是当我尝试播放时,我只是沉默。 我没有收到任何错误,这里是我的代码 @IBAction func Test(sender: AnyObject) { println("Preparing to play") let urlString = "http://www.mp3juices.cc/get/3/194751031/x_ambassadors_-_renegades/" let url = NSURL(string: urlString) var avPlayer = AVPlayer(URL: url) avPlayer.play() }

如何迅速将base64转换成NSDATA

我正在开发一个iOS项目。 它以base64string的forms将audio存储在Web服务器上。 当我请求服务器获得所有audio的base64string,并试图在NSData转换,我得到nil 。 do { var audioData: NSData! = NSData(base64EncodedString: audioBase64String, options: NSDataBase64DecodingOptions(rawValue:0)) if audioData != nil { let sound = try AVAudioPlayer(data: audioData) sound.play() } else { print("Data Not Exist") } } catch { } 在Android上,相同的base64string被转换成字节数组并且正在播放,但是在iOS中, audioBase64String为NSData返回nil 。

AVPlayer&AVAudioSession

当我试图从无线电服务stream式传输audio时,我会疯狂地遇到一个问题。 我得到它在后台运行正常,在我的.plist文件中设置所需的背景模式。 但是,只要audio中断(或者如果我在stream成功启动之前退出应用程序),我的应用程序(我假设)就被占用了,因为它不再给我反馈,例如连接的改变。 我想要做到这一点,以便我可以pipe理stream的质量等,即使在应用程序在后台。 任何人有我的任何提示? 感激大卫

在forwardPlaybackEndTime之后恢复AVPlayer

我已经创build了一个AVPlayer并设置forwardPlaybackEndTime使一个本地video停在给定的时间戳。 果然,video在我请求的时候停下来了。 都好。 现在,我希望video在用户操作触发后继续(例如,触摸button)。 不幸的是,如果没有从一开始就重新开始video,我似乎无法做到这一点。 我会把所有的AVPlayer设置代码(这些代码主要来自AV Foundation编程指南 ),但是给出这些variables: AVPlayer *avPlayer; AVPlayerItem *playerItem; 我可以像这样设置结束时间: [playerItem setForwardPlaybackEndTime: CMTimeMake(30, 30)]; 为了尝试简历,我试过这个: [playerItem setForwardPlaybackEndTime: CMTimeMake(30, 30)]; [avPlayer setRate: 1.0]; 没有骰子。 我也尝试设置结束时间和调用play 。 没有运气。 我已经试过seekToTime把播放头放在video停止的地方,以防万一。 它不。 有人可以解释如何使这项工作? 谢谢!

OBJ。 C – QR阅读应用程序运行速度太慢

我在这个网站上通过教程(Appcoda的教程),用AVFoundation制作了一个QR码阅读应用程序。 阅读QR码后,该应用程序显示一个UIAlertView。 但是花了近2分钟(有时超过3分钟)。 我将在这里粘贴整个ViewController.m文件。 我希望这已经足够了。 (UIAlertView在captureOutput方法中) // // ViewController.m // Yuvio // // Created by İhsan Batuğhan YILMAZ on 29/08/15. // Copyright © 2015 Farabius. All rights reserved. // #import "ViewController.h" #import <AVFoundation/AVFoundation.h> @interface ViewController () @property (nonatomic) BOOL isReading; @property (nonatomic, strong) AVCaptureSession *captureSession; @property (nonatomic, strong) AVCaptureVideoPreviewLayer *videoPreviewLayer; -(BOOL)startReading; -(void) stopReading; @end @implementation […]

AVURLAsset的caching行为

我使用AVURLAsset与各种AV / MP播放器类,它似乎是无视我的服务器的caching头。 我正在处理逐渐下载的小video(而不是HLS)。 有没有办法确保video被caching? 有没有办法预先cachingvideo,以便他们立即播放? 我尝试了简单地改变NSURLCache中的参数,但是到目前为止我还没有运气。 我也找不到任何直接的方式来操作如何通过AVURLAssetcachingURL提取。 我不想单独下载文件并指向本地版本,因为在开始播放之前我不想等待文件完全下载。 理想情况下,我也想避免自己pipe理本地磁盘caching。