- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想用 swift 3 编写一个应用程序,以便在从一个文件传递到另一个文件时播放排队的音频文件时没有任何间隙、裂缝或噪音。
我的第一次尝试是使用 AvAudioPlayer 和 AvAudioDelegate ( AVAudioPlayer using array to queue audio files - Swift ),但我不知道如何预加载下一首歌曲以避免间隙。即使我知道该怎么做,我也不确定这是实现我目标的最佳方式。 AVQueuePlayer似乎是这份工作的更好候选人,它是为此目的而制作的,但我找不到任何例子来帮助我。也许这只是预加载或缓冲的问题?我有点迷失在这片充满可能性的海洋中。
欢迎任何建议。
最佳答案
它远非完美,特别是如果您想执行两次或更多次(“文件存在”错误),但它可以作为基础。
它所做的是获取两个文件(我的是 ap. 4 秒的 aif 样本),将它们编码在一个文件中并播放生成的文件。如果您有数百个,无论是否随机组装,都会非常有趣。
mergeAudioFiles 函数的所有功劳归于@Peyman 和@Pigeon_39。 Concatenate two audio files in Swift and play them
swift 3
import Cocoa
import AVFoundation
var action = AVAudioPlayer()
let path = Bundle.main.path(forResource: "audiofile1.aif", ofType:nil)!
let url = URL(fileURLWithPath: path)
let path2 = Bundle.main.path(forResource: "audiofile2.aif", ofType:nil)!
let url2 = URL(fileURLWithPath: path2)
let array1 = NSMutableArray(array: [url, url2])
class ViewController: NSViewController, AVAudioPlayerDelegate
{
@IBOutlet weak var LanceStop: NSButton!
override func viewDidLoad()
{
super.viewDidLoad()
}
override var representedObject: Any?
{
didSet
{
// Update the view, if already loaded.
}
}
@IBAction func Lancer(_ sender: NSButton)
{
mergeAudioFiles(audioFileUrls: array1)
let url3 = NSURL(string: "/Users/ADDUSERNAMEHERE/Documents/FinalAudio.m4a")
do
{
action = try AVAudioPlayer(contentsOf: url3 as! URL)
action.delegate = self
action.numberOfLoops = 0
action.prepareToPlay()
action.volume = 1
action.play()
}
catch{print("error")}
}
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool)
{
if flag == true
{
}
}
var mergeAudioURL = NSURL()
func mergeAudioFiles(audioFileUrls: NSArray) {
//audioFileUrls.adding(url)
//audioFileUrls.adding(url2)
let composition = AVMutableComposition()
for i in 0 ..< audioFileUrls.count {
let compositionAudioTrack :AVMutableCompositionTrack = composition.addMutableTrack(withMediaType: AVMediaTypeAudio, preferredTrackID: CMPersistentTrackID())
let asset = AVURLAsset(url: (audioFileUrls[i] as! NSURL) as URL)
let track = asset.tracks(withMediaType: AVMediaTypeAudio)[0]
let timeRange = CMTimeRange(start: CMTimeMake(0, 600), duration: track.timeRange.duration)
try! compositionAudioTrack.insertTimeRange(timeRange, of: track, at: composition.duration)
}
let documentDirectoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! as NSURL
self.mergeAudioURL = documentDirectoryURL.appendingPathComponent("FinalAudio.m4a")! as URL as NSURL
let assetExport = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetAppleM4A)
assetExport?.outputFileType = AVFileTypeAppleM4A
assetExport?.outputURL = mergeAudioURL as URL
assetExport?.exportAsynchronously(completionHandler:
{
switch assetExport!.status
{
case AVAssetExportSessionStatus.failed:
print("failed \(assetExport?.error)")
case AVAssetExportSessionStatus.cancelled:
print("cancelled \(assetExport?.error)")
case AVAssetExportSessionStatus.unknown:
print("unknown\(assetExport?.error)")
case AVAssetExportSessionStatus.waiting:
print("waiting\(assetExport?.error)")
case AVAssetExportSessionStatus.exporting:
print("exporting\(assetExport?.error)")
default:
print("Audio Concatenation Complete")
}
})
}
}
关于swift - Mac - Swift 3 - 排队音频文件和播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45313535/
我有一些基于 TThreads 的操作。现在我需要创建包含要完成的作业列表的线程,然后在前一个完成后立即触发每个线程...我应该如何编写它?我不能允许线程同时运行,因为可能有超过 10 000 个操作
我正在尝试使用 RxJS 来实现服务调用限制/排队。 例如,Google Maps 的 Geocoder API。假设我不希望它每秒被调用一次以上,但是我的应用程序的一个或多个部分可能会比这更频繁
我目前正在通过 freecodecamp 网站的 javascript 部分进行练习,我试图理解为什么特定的方法可以解决它。 function nextInLine(arr, item) { /
详情 我有一个带有动画的功能,当点击按钮时它会.append一个div到body。然后,div 将为其位置向下移动一点点设置动画。添加另一个时,所有 div 也会向下移动,因此它们不会重叠。 现在我们
我有一个正在发送 http 请求的应用程序,每次用户键入时都会返回一个 promise 。我让它每 500 毫秒去抖一次。有时我请求的 api 需要很长时间才能响应。例如,我对 a 发出搜索请求,该请
我一直在做一项作业,涉及实现包含空指针的队列,以便它们可以针对任何类型的数据进行泛化。我目前遇到一个奇怪的问题,虽然出队节点减少了列表的大小但没有返回我期望的节点。在出列操作中省略对 free() 的
我正在寻找概述“排队”的文章和引用资料(我在这里可能甚至没有使用正确的术语)。我希望通过 Redis、RabbitMQ、Celery、Kombu 以及我尚未了解的任何其他组件以及它们如何组合在一起的世
我使用 mbostock/queue用于排队一些异步操作。更多的是速率限制(UI 生成的事件很少,后端可以慢慢处理),并确保它们按顺序处理。我像这样使用它 function request(d, cb
我有我的 android 应用程序,它不是为离线工作而构建的,因此它依赖于网络连接/数据。 应用程序进行大量网络调用,使用新数据集更新 api。 我正在对其进行更改以使其脱机工作。 方法我想我将创建一
我想将 div 的内容更改 3 次,每次更改之间延迟 1 秒。delay() 在此代码中不起作用: $('#import-status-msg').html('Importing content ..
我需要根据存储在数据库中的时间线在 jQuery 中制作一系列动画。我将这些信息与函数名称(动画、幻灯片、淡入淡出...)、函数的选项/参数以及函数的回调一起存储。 我知道 jQuery 确实有 .q
我有以下方法 public async Task SomeMethod(parameters) { // here we execute some instructions which are
在我的 winforms 应用程序中,我有一个包含对象的队列: Queue _queuedRows = new Queue(); 对于每个对象,我必须启动一个单独的 backgroundwor
我有以下代码: for (int i = 1; i <= 500; i++) { BackgroundWorker t = new BackgroundWorker(); t.DoWo
我有一个 CAShapeLayer,我在其中设置了一个圆圈的动画。动画是先顺时针“撤消”圆圈,然后顺时针重画圆圈。有点像“旋转圈”。另一种说法是:将路径描边终点移动到起点,然后将起点移到终点。 动画本
所以,在前一段时间了解完成 block 之后,我非常喜欢使用完成 block 。我喜欢关闭,我喜欢将任何东西传递到任何我想要的地方的能力。 作为线程编程的新手,我一直远离 GCD 和 NSOperat
我有一些使用 FMDB sqllite 包装器 ( https://github.com/ccgus/fmdb ) 的代码,并且我希望从多个线程执行此代码。因此,我使用 FMDatabaseQueue
页面加载速度比预期慢。我用 Firebug 检查了时间线,我看到很多图像阻塞: http://i.imgur.com/tenTNVH.png 我想我做错了什么。 (我知道我这里有双 jquery,会消
我在使用 Alamofire 时遇到任务执行问题我使用了两次 Alamofire,第一次是收集数据( token ),然后我将使用它来发送我的 Post 请求。 我的两次请求之间的问题,数据的恢复是在
我想知道如何将选定的 YouTube 视频添加到临时播放列表/播放队列中? 我有一个选项,用户必须选择要包含在播放队列中的所有视频。 Click on the ADD icon (black back
我是一名优秀的程序员,十分优秀!