我的应用程序做了一些处理,在某些时候它需要调用AVAssetExportSession.
如果会话已经开始,然后我对应用程序进行后台处理,一切都正常完成.不过,如果我的背景之前调用应用程序exportAsynchronouslyWithCompletionHandler.我收到此错误:
AVAssetExportSessionStatusFailed Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo=0x1e550db0 {NSLocalizedFailureReason=An unknown error occurred (-12985), NSUnderlyingError=0x1e574910 "The operation couldn’t be completed. (OSStatus error -12985.)", NSLocalizedDescription=The operation could not be completed}
是否可以在后台启动AVAssetExportSession?
我正在尝试合并一些音频文件(通过MPMediaPickerController选择),但导出始终失败,错误代码为-12780.
当我尝试使用AVPlayer对象播放我的合成时,它会正确播放.只是出口失败了.
我究竟做错了什么?
这是我的代码:
AVAssetExportSession *exportSession;
AVPlayer *player;
- (void)mergeAudiofiles {
// self.mediaItems is an NSArray of MPMediaItems
if (self.mediaItems.count == 0) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
message:@"No Tracks selected."
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
return;
}
// Configure audio session
NSError *sessionError;
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryAudioProcessing error:nil];
[session setActive:YES error:&sessionError];
if (sessionError) NSLog(@"Session-Error: %@", sessionError.localizedDescription);
// Create composition
AVMutableComposition *composition = [AVMutableComposition composition];
AVMutableCompositionTrack *track = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
CMTime position = kCMTimeZero;
for …Run Code Online (Sandbox Code Playgroud) 我正在尝试将图像和视频结合起来.我将它们组合并输出但是它是旋转的侧面方式.
很抱歉批量代码粘贴.我已经看到了关于应用变换的答案,compositionVideoTrack.preferredTransform但是什么也没做.添加AVMutableVideoCompositionInstruction也没有做任何事情.
我觉得这个区域是事情开始出错的地方.这儿这儿:
// I feel like this loading here is the problem
let videoTrack = videoAsset.tracksWithMediaType(AVMediaTypeVideo)[0]
// because it makes our parentLayer and videoLayer sizes wrong
let videoSize = videoTrack.naturalSize
// this is returning 1920x1080, so it is rotating the video
print("\(videoSize.width) , \(videoSize.height)")
Run Code Online (Sandbox Code Playgroud)
所以在这里我们的帧大小对于该方法的其余部分是错误的.现在,当我们尝试去创建叠加图像层时,框架不正确:
let aLayer = CALayer()
aLayer.contents = UIImage(named: "OverlayTestImageOverlay")?.CGImage
aLayer.frame = CGRectMake(0, 0, videoSize.width, videoSize.height)
aLayer.opacity = 1
Run Code Online (Sandbox Code Playgroud)
这是我完整的方法.
func combineImageVid() {
let path = NSBundle.mainBundle().pathForResource("SampleMovie", ofType:"MOV")
let fileURL = NSURL(fileURLWithPath: …Run Code Online (Sandbox Code Playgroud) AVPlayer 将随机播放音频,而不是显示视频轨道...
AVPlayer在进行活动压缩会话时正确播放视频AVAssetExportSession:exportAsynchronouslyWithCompletionHandler现在失败了.它似乎会导致一些不稳定,直到应用程序进入后台并返回.
检查AVURLAsset视频播放失败时,即使没有视频输出,也有视频轨道.我也没有从压缩器或其他播放组件中得到任何错误......压缩会话返回后,问题就会发生一段时间.
我尝试过不同的单独线程但没有成功.
从iOS 10开始,似乎有些事情会导致两个进程之间发生某种冲突......
我想将存储在AVPlayerItem中的.mp4-video导出到文件系统.如果成功,我想把它变成一个NSData变量(但这不是问题的一部分,只是想告诉你为什么我想把它存储到文件系统中).
//This is the AVPlayerItem-Object
let item = self.talentView.getCurrentItem()
//They return all true, so the item itself is not the issue
print(item.asset.isPlayable)
print(item.asset.isReadable)
print(item.asset.isExportable)
//Creating Path, where the file will be stored, also tried "video.mp4" at the appending string
var exportPath: NSString = NSTemporaryDirectory().appendingFormat("/video.mp4")
var exportUrl: NSURL = NSURL.fileURL(withPath: exportPath as String) as NSURL
let session = AVAssetExportSession(asset: item.asset, presetName: AVAssetExportPresetPassthrough)
session?.outputFileType = AVFileTypeMPEG4
session?.outputURL = exportUrl as URL
session?.exportAsynchronously(completionHandler: {
//case is always .failed
switch session!.status {
case .failed: …Run Code Online (Sandbox Code Playgroud) 在我的iOS应用程序中,我正在尝试将mp3文件从iPod库导出到设备上的应用程序文档目录.目前我正在尝试使用AVAssetExportSession,但它不适用于mp3文件.它适用于m4a文件.
是否可以使用AVAssetExportSession导出mp3文件?
AVAssetExportSession 的相应outputFileType是什么?(AVFileTypeAppleM4A适用于m4a文件)
谢谢!
尝试将一些视频合并在一起并将它们作为单个文件导出,从查看教程/示例看,一切似乎都是正确的但是我的AVAssetExportSession似乎永远不会完整,我的视频文件永远不会被导出,任何关于明显错误的帮助我很失望,我将非常感激.
以下是合并视频的功能
注意循环中的'视频'是一个成员变量var videos = [AVAsset](),它在调用merge之前会被填充(我会检查它).
private func merge()
{
// Create AVMutableComposition to contain all AVMutableComposition tracks
var mix_composition = AVMutableComposition()
var total_time_seconds = 0.0
var tracks = [AVCompositionTrack]()
// Loop over videos and create tracks, keep incrementing total duration
for video in videos
{
// Create the composition track for this video
let track = mix_composition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: Int32(kCMPersistentTrackID_Invalid))
// Add video duration to total time
total_time_seconds = total_time_seconds + video.duration.seconds
// Add track to array of …Run Code Online (Sandbox Code Playgroud) 所以,目前我用它来压缩视频:
func compressVideo(inputURL: NSURL, outputURL: NSURL, handler:(session: AVAssetExportSession)-> Void)
{
let urlAsset = AVURLAsset(URL: inputURL, options: nil)
let exportSession = AVAssetExportSession(asset: urlAsset, presetName: AVAssetExportPresetMediumQuality)
exportSession!.outputURL = outputURL
exportSession!.outputFileType = AVFileTypeQuickTimeMovie
exportSession!.shouldOptimizeForNetworkUse = true
exportSession!.exportAsynchronouslyWithCompletionHandler { () -> Void in
handler(session: exportSession!)
}
}
Run Code Online (Sandbox Code Playgroud)
当我在2秒内录制视频时,大小为4.3 MB,当我在6秒内录制视频时,文件大小为9,3 MB.
任何减小尺寸的提示?
我曾尝试过以下代码.
-(void)mediaItemToData : (MPMediaItem * ) curItem
{
NSURL *url = [curItem valueForProperty: MPMediaItemPropertyAssetURL];
AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL: url options:nil];
AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset: songAsset
presetName:AVAssetExportPresetPassthrough];
exporter.outputFileType = @"public.mpeg-4";
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString * myDocumentsDirectory = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSString *exportFile = [myDocumentsDirectory stringByAppendingPathComponent:
@"exported.mp4"];
NSURL *exportURL = [NSURL fileURLWithPath:exportFile];
exporter.outputURL = exportURL;
// do the export
// (completion handler block omitted)
[exporter exportAsynchronouslyWithCompletionHandler:
^{
NSData *data = …Run Code Online (Sandbox Code Playgroud) 更新6:我已经设法完全解决了我的问题,但我仍然想要一个更好的解释,而不是我猜的是如果我不正确它不起作用的原因
我一直试图在视频上制作精灵表,但每次导出视频时,最终结果都是我开始的示例视频.
这是我的代码:
首先我的自定义CALayer来处理我自己的精灵表
class SpriteLayer: CALayer {
var frameIndex: Int
override init() {
// Using 0 as a default state
self.frameIndex = 0
super.init()
}
required init?(coder aDecoder: NSCoder) {
self.frameIndex = 0
super.init(coder: aDecoder)
}
override func display() {
let currentFrameIndex = self.frameIndex
if currentFrameIndex == 0 {
return
}
let frameSize = self.contentsRect.size
self.contentsRect = CGRect(x: 0, y: CGFloat(currentFrameIndex - 1) * frameSize.height, width: frameSize.width, height: frameSize.height)
}
override func action(forKey event: String) -> CAAction? {
if …Run Code Online (Sandbox Code Playgroud) calayer cabasicanimation avvideocomposition avassetexportsession swift
ios ×6
swift ×4
avfoundation ×2
video ×2
avasset ×1
avplayer ×1
avplayeritem ×1
calayer ×1
camera ×1
export ×1
ios10 ×1
ios6 ×1
iphone ×1
m4a ×1
mp3 ×1
mpmediaitem ×1
objective-c ×1
orientation ×1
swift2 ×1
swift3 ×1
xcode ×1