这是我用来将视频合并在一起的方法的开始
-(void) mergeVideosAndAudio:(AVAsset *)audioAsset{
//Load Video Assets
NSError *error;
NSArray *dirFiles;
if ((dirFiles = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[self documentsDirectory] error:&error]) == nil) {
// handle the error
};
// find all the temp files
NSArray *movFiles = [dirFiles filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self BEGINSWITH 'temp'"]];
NSLog(@"The are %i temp files",movFiles.count);
//Create assets array
NSMutableArray *assets = [[NSMutableArray alloc]init];
for (int i = 0; i < movFiles.count; i++) {
NSString *videoURL = [[self documentsDirectory] stringByAppendingPathComponent:
[NSString stringWithFormat:@"temp%i.mov", i]];
NSURL *url = [NSURL fileURLWithPath:videoURL];
AVURLAsset *videoAsset …Run Code Online (Sandbox Code Playgroud) 我正在获取普通视频的文件 url,但慢动作视频资产类型是AVComposition. 我正在尝试AVAssetExportSession但它消耗大量时间。
PHVideoRequestOptions *options=[[PHVideoRequestOptions alloc] init];
options.version = PHVideoRequestOptionsVersionCurrent;
options.networkAccessAllowed = YES;
[[PHImageManager defaultManager] requestAVAssetForVideo:asset options:options resultHandler:^(AVAsset *avAsset, AVAudioMix *audioMix, NSDictionary *info) {
if(([avAsset isKindOfClass:[AVComposition class]] && ((AVComposition *)avAsset).tracks.count == 2)) {
//Output URL of the slow motion file.
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = paths.firstObject;
NSString *myPathDocs = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"mergeSlowMoVideo-%d.mov",arc4random() % 1000]];
NSURL *url = [NSURL fileURLWithPath:myPathDocs];
//Begin slow mo video export
AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:avAsset presetName:AVAssetExportPresetHighestQuality];
exporter.outputURL …Run Code Online (Sandbox Code Playgroud) 我在项目导航器中包含了一个mp4资源.我想在AVPlayer中播放它.我知道如何为AVPlayer对象创建一个AVPlayerItem,所以现在我想加载适当的AVAsset指向我的mp4资源.问题是AVAsset只有一个assetWithURL:方法来创建AVAsset.我想要一个assetWithName:方法,但该方法不存在.如果我没有URL,我怎么能播放我的mp4文件?如果无法通过名称引用播放,我如何获取mp4文件的文件URL?
我希望将预览频道添加到AV项目,以便可以在主输出频道上播放视频或音频文件,但用户可以在不同的频道上预览单独的音频或视频文件.
当然,先决条件是用户具有能够具有多个通道的声音设备或用于主输出的单独设备而不是预览.例如,输出可以转到USB音频设备,提供平衡的音频输出,但预览可以通过标准耳机插孔.
我正在努力寻找关于枚举连接到mac的声音设备然后链接AVAudioPlayer或AVPlayer/AVPlayerLayer或底层API的正确文档.
谁知道我应该在哪里看?
这是一个发现声音设备的情况,选择合适的设备,然后NSSound在开始播放文件之前使用类似设置的设备吗?已播放的文件会发生什么?
谢谢
1)我正在从服务器上播放播放器上的视频.每次在应用上播放视频都会增加应用内存.因此,如果我观看视频10次,则应用程序内存中视频大小增加10倍.我正在使用AVPlayer.
2)停止流媒体 - 假设我开始观看视频并在几秒钟后停止播放.我注意到即使停止视频后整个视频也会下载.我取消了加载AVAsset,清除了AVPlayer和AVPlayerItem.它仍然在后台流动.
我一直在寻找Swift文档以保存AVAudioEngine的音频输出,但我找不到任何有用的提示.
有什么建议吗?
解决方案 我找到了解决方法,这要归功于matt的答案.这里有一个示例代码,说明如何在通过AVAudioEngine传递音频之后保存音频(我认为在技术上它是之前的)
newAudio = AVAudioFile(forWriting: newAudio.url, settings: nil, error: NSErrorPointer())
//Your new file on which you want to save some changed audio, and prepared to be bufferd in some new data...
var audioPlayerNode = AVAudioPlayerNode() //or your Time pitch unit if pitch changed
//Now install a Tap on the output bus to "record" the transformed file on a our newAudio file.
audioPlayerNode.installTapOnBus(0, bufferSize: (AVAudioFrameCount(audioPlayer.duration)), format: opffb){
(buffer: AVAudioPCMBuffer!, time: AVAudioTime!) in
if (self.newAudio.length) …Run Code Online (Sandbox Code Playgroud) 我想将 AVAsset- 合并arrayVideos为一个视频并将其保存在相机胶卷中。Raywenderlich.com 有一个很棒的教程,其中两个视频合并为一个。我创建了以下代码,但是导出到相机胶卷后获得的视频仅包含数组中的第一个和最后一个视频(不包括中间的其余视频arrayVideos)。我在这里错过了什么吗?
var arrayVideos = [AVAsset]() //Videos Array
var atTimeM: CMTime = CMTimeMake(0, 0)
var lastAsset: AVAsset!
var layerInstructionsArray = [AVVideoCompositionLayerInstruction]()
var completeTrackDuration: CMTime = CMTimeMake(0, 1)
var videoSize: CGSize = CGSize(width: 0.0, height: 0.0)
func mergeVideoArray(){
let mixComposition = AVMutableComposition()
for videoAsset in arrayVideos{
let videoTrack = mixComposition.addMutableTrack(withMediaType: AVMediaTypeVideo, preferredTrackID: Int32(kCMPersistentTrackID_Invalid))
do {
if videoAsset == arrayVideos.first{
atTimeM = kCMTimeZero
} else{
atTimeM = lastAsset!.duration
}
try videoTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), of: videoAsset.tracks(withMediaType: …Run Code Online (Sandbox Code Playgroud) 我收到此错误:
[GatekeeperXPC] Connection to assetsd was interrupted or assetsd died
Run Code Online (Sandbox Code Playgroud)
这是什么意思?(我目前正在与 AVAssets 合作)
谢谢!
有没有办法将数据转换为 AVAsset/AVURLAsset 或更好的 AVPlayerItem?我找到了一个将数据转换为 PHAsset 的答案,需要先将其保存到桌面。有没有更好的办法?
使用 Xcode 14.0、iOS 16、Swift 5.7、
由于 iOS 16,我收到以下弃用警告:
iOS 16.0 中已弃用“duration”:改用 load(.duration)
这是我的代码:
var actualTime: CMTime = CMTimeMake(value: 0, timescale: asset.duration.timescale)
Run Code Online (Sandbox Code Playgroud)
我需要更改什么才能消除此警告?
我试过:
var actualTime: CMTime = CMTimeMake(value: 0, timescale: asset.load(.duration).timescale)
Run Code Online (Sandbox Code Playgroud)
但这使得一切都是异步的。我真的需要走那条路吗?
avasset ×10
ios ×6
objective-c ×5
avplayer ×3
swift ×3
avplayeritem ×2
video ×2
arrays ×1
avaudiofile ×1
avfoundation ×1
core-audio ×1
ios16 ×1
iphone ×1
nsdata ×1