2010-07-21 5 views
5

Danh sách tính năng mới của iOS 4.0 cho biết khung nền tảng AV đã có Quản lý tài sản truyền thông, Quản lý theo dõi, Chỉnh sửa phương tiện và Quản lý siêu dữ liệu cho mục phương tiện. Ý của họ về vấn đề này là như thế nào?AVAsset và AVAssetTrack - Quản lý theo dõi trong IOS 4.0

  1. Sử dụng quản lý theo dõi và quản lý nội dung phương tiện có thể truy cập tệp phương tiện từ ứng dụng ảnh không?
  2. Tôi có thể tạo các tác phẩm tùy chỉnh của mình bằng cách sử dụng AVComposition và xuất và gửi nó tới máy chủ không?
  3. Tôi có thể đổi tên, di chuyển, chỉnh sửa thông tin siêu dữ liệu của nội dung không?

tôi đã cố gắng để có được một số giúp đỡ/tài liệu về vấn đề này và không thể tìm thấy bất cứ điều gì ..

Cảm ơn,

Tony

Trả lời

14

Vâng, bạn có thể làm hầu hết những thứ bạn đề cập. Tôi nghĩ việc truy cập các tập tin media trên điện thoại của bạn không đơn giản. Nhưng bạn có thể đọc dữ liệu từ mạng và xuất dữ liệu đó sang thư viện ảnh nếu muốn.

Trước tiên, bạn phải nhập video hoặc tệp âm thanh của mình.

Những gì bạn cần để bắt đầu là trình phát video riêng của bạn mà bạn tạo trong chế độ xem của riêng bạn. Nếu bạn không thích phát video nhưng chỉ đơn giản là soạn nội dung của mình, bạn có thể dễ dàng đi mà không cần xem.

này là rất dễ dàng: 1. tạo ra một thành phần có thể thay đổi:

AVMutableComposition *composition = [AVMutableComposition composition]; 

này sẽ giữ video của bạn. Bây giờ bạn có một Thành phần-Tài sản trống. Thêm một số tập tin từ thư mục của bạn hoặc từ trang web:

NSURL* sourceMovieURL = [NSURL fileURLWithPath:moviePath]; 
AVURLAsset* sourceAsset = [AVURLAsset URLAssetWithURL:sourceMovieURL options:nil]; 

Sau đó thêm video của bạn thành phần

// calculate time 
CMTimeRange editRange = CMTimeRangeMake(CMTimeMake(0, 600), CMTimeMake(sourceAsset.duration.value, sourceAsset.duration.timescale)); 

// and add into your composition 
BOOL result = [composition insertTimeRange:editRange ofAsset:sourceAsset atTime:composition.duration error:&editError]; 

của bạn Nếu bạn muốn thêm các video khác thành phần của bạn, bạn có thể thêm tài sản khác và đặt lại thành sáng tác của bạn bằng cách sử dụng phạm vi thời gian của bạn. Bây giờ bạn có thể xuất thành phần mới sử dụng mã của bạn như thế này:

NSError *exportError = nil; 

AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetHighestQuality]; 

NSURL *exportURL = [NSURL fileURLWithPath:exportVideoPath]; 
exportSession.outputURL = exportURL; 
exportSession.outputFileType = @"com.apple.quicktime-movie"; 
[exportSession exportAsynchronouslyWithCompletionHandler:^{ 
    switch (exportSession.status) { 
     case AVAssetExportSessionStatusFailed:{ 
      NSLog (@"FAIL"); 
      [self performSelectorOnMainThread:@selector (doPostExportFailed:) 
             withObject:nil 
                waitUntilDone:NO]; 
      break; 
     } 
     case AVAssetExportSessionStatusCompleted: { 
      NSLog (@"SUCCESS"); 
      [self performSelectorOnMainThread:@selector (doPostExportSuccess:) 
         withObject:nil 
         waitUntilDone:NO]; 
      break; 
     } 
    }; 
}]; 

Nếu bạn muốn chơi video của bạn, sử dụng mã như thế này (tôi giả sử, bạn có thể truy cập để xem bạn):

// create an AVPlayer with your composition 
AVPlayer* mp = [AVPlayer playerWithPlayerItem:[AVPlayerItem playerItemWithAsset:composition]]; 

// Add the player to your UserInterface 
// Create a PlayerLayer: 
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:mp]; 

// integrate it to your view. Here you can customize your player (Fullscreen, or a small preview) 
[[self view].layer insertSublayer:playerLayer atIndex:0]; 
playerLayer.frame = [self view].layer.bounds; 
playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; 

Và cuối cùng chơi video của bạn:

[mp play]; 

Xuất khẩu sang cuộn camera:

NSString* exportVideoPath = >>your local path to your exported file<< 
UISaveVideoAtPathToSavedPhotosAlbum (exportVideoPath, self, @selector(video:didFinishSavingWithError: contextInfo:), nil); 

Và nhận được thông báo nếu nó đã hoàn thành (phương pháp gọi lại của bạn)

- (void) video: (NSString *) videoPath didFinishSavingWithError: (NSError *) error contextInfo: (void *) contextInfo { 
    // Error is nil, if succeeded 
    NSLog(@"Finished saving video with error: %@", error); 
    // do postprocessing here, i.e. notifications or UI stuff 

}

Đáng tiếc là tôi đã không tìm thấy bất kỳ giải pháp "hợp pháp" để đọc từ cameraroll.

Một nguồn tin rất tốt về việc bắt đầu là:

http://www.subfurther.com/blog/?cat=51

tải VTM_Player.zip, VTM_AVRecPlay.zip hoặc VTM_AVEditor.zip cho một giới thiệu rất đẹp vào này

+0

Cảm ơn bạn! Câu trả lời tốt! – SAKrisT

+0

Xin chào mã của bạn không hiển thị video ... điều gì có thể là vấn đề? –

+0

@iError: Hmm, không dễ để trả lời vì có rất nhiều chướng ngại vật trên đường. Tôi phát hiện ra rằng lớp phủ trình phát phim đôi khi được xoay, có nghĩa là nó có thể ở đó nhưng bên ngoài khung nhìn hiển thị của bạn. Nếu bạn đang phát triển sử dụng vòng cung, hãy đảm bảo rằng bạn có tham chiếu mạnh hoặc tham chiếu thuộc tính cho trình phát phim của mình. ARC có thể sẽ giải phóng đối tượng người chơi ngay lập tức sau khi rời khỏi phương thức mà nó được tạo ra. Kiểm tra xem bạn đã bật tính năng tự động sửa chưa. Có thể bạn cần sử dụng thuộc tính "layer.transform" để đặt vòng xoay của mình. – JackPearse