2012-05-29 48 views
11

Gần đây tôi đã phát hiện thấy một vấn đề khi sử dụng AVMutableComposition và tôi đang tìm kiếm một số thông tin chi tiết về vấn đề này.AVMutableComposition Xoay Video

Tôi muốn có thể quay video theo hai hướng - phong cảnh trái và phải. Khi tôi quay video ở chế độ ngang bên phải (nút trang chủ ở bên phải), chúng được thêm vào bố cục và phát theo đúng hướng. Tuy nhiên, nếu tôi ghi nó theo hướng bên trái (nút trang chủ ở bên trái), các clip này sẽ bị lộn ngược.

NHƯNG, chúng chỉ được phát lộn ngược nếu chúng được chèn vào bố cục. Nếu không, họ sẽ chơi đúng hướng. Tại sao bố cục đảo chiều quay của các clip được quay ở chế độ ngang? Làm thế nào tôi có thể sửa lỗi này? Bất kỳ trợ giúp được đánh giá cao!

+0

Tôi cũng đã nhận thấy như rõ rằng bất kể những gì tôi làm điều này đang xảy ra. Đặt định hướng ghi trước, xoay vòng, v.v. Bản nhạc sẽ phát ở bên phải nếu tôi phát clip đầu tiên, nhưng ngay sau khi nó được kết hợp thành một bố cục, nó sẽ lật ngược lộn ngược. – bgoers

Trả lời

27

Đây là cách dễ dàng hơn một chút nếu bạn chỉ muốn duy trì xoay vòng ban đầu.

// Grab the source track from AVURLAsset for example. 
AVAssetTrack *assetVideoTrack = [asset tracksWithMediaType:AVMediaTypeVideo].lastObject; 

// Grab the composition video track from AVMutableComposition you already made. 
AVMutableCompositionTrack *compositionVideoTrack = [composition tracksWithMediaType:AVMediaTypeVideo].lastObject; 

// Apply the original transform.  
if (assetVideoTrack && compositionVideoTrack) { 
    [compositionVideoTrack setPreferredTransform:assetVideoTrack.preferredTransform]; 
} 

// Export... 
+0

Giải pháp này đã làm việc hoàn hảo cho tôi để duy trì vòng xoay ban đầu. – Brad

+0

không thể hoạt động khi chuyển đổi nhanh chóng ??? –

+1

Nếu có nhiều bản nhạc trong bố cục có các phép biến đổi khác nhau, bạn không thể đặt đơn giản thành biến đổi của mỗi bản nhạc, bạn cần phải bù lại khác nhau. –

8

Giải quyết được sự cố của tôi. Cuối cùng đã có thể xoay bản nhạc và dịch nó thành khung. Làm việc như một say mê.

//setting up the first video based on previous recording 
    CMTimeRange videoDuration = CMTimeRangeMake(kCMTimeZero, [self.previousRecording duration]); 
    AVAssetTrack *clipVideoTrack = [[self.previousRecording tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; 
    AVAssetTrack *clipAudioTrack = [[self.previousRecording tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; 
    [compositionVideoTrack insertTimeRange:videoDuration ofTrack:clipVideoTrack atTime:nextClipStartTime error:nil]; 
    [compositionAudioTrack insertTimeRange:videoDuration ofTrack:clipAudioTrack atTime:nextClipStartTime error:nil]; 

    //our first track instruction - set up the instruction layer, then check the orientation of the track 
    //if the track is in landscape-left mode, it needs to be rotated 180 degrees (PI) 
    AVMutableVideoCompositionLayerInstruction *firstTrackInstruction = 
     [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:clipVideoTrack]; 

    if([self orientationForTrack:clipVideoTrack] == UIDeviceOrientationLandscapeLeft) { 
     CGAffineTransform rotation = CGAffineTransformMakeRotation(M_PI); 
     CGAffineTransform translateToCenter = CGAffineTransformMakeTranslation(640, 480); 
     CGAffineTransform mixedTransform = CGAffineTransformConcat(rotation, translateToCenter); 
     [firstTrackInstruction setTransform:mixedTransform atTime:kCMTimeZero]; 
    } 
+0

Hi bgoers .... Tôi cũng có cùng một vấn đề ... tôi đã sử dụng mã của bạn nhưng tôi nhận được lỗi gần [self orientationForTrack: clipVideoTrack] (phương pháp không tìm thấy) u có thể giúp tôi trong ... – ask123

+0

Đó là một phương pháp tôi tự định nghĩa để xác định hướng của một bản nhạc. Phải mất một tham số AVAssetTrack làm thông số rồi sử dụng hướng ưa thích. Tôi đã thay đổi một chút nhưng điều này sẽ giúp http://stackoverflow.com/a/6046421/1415949 – bgoers

+0

'[self orientationForTrack:]' là gì? Triển khai của nó là gì? –

0

Tôi nghĩ câu trả lời chắc chắn là lựa chọn tốt nhất, nhưng nó chỉ đúng một phần. Trong thực tế, để làm cho nó hoạt động, chúng tôi cũng phải điều chỉnh kích thước hiển thị của xuất, chiều cao lật và chiều rộng của kích thước tự nhiên theo chiều dọc.

tôi chỉ thử nghiệm nó và tôi cũng trích dẫn AVFoundation Lập trình Hướng dẫn - Chỉnh sửa phần, điều này gợi ý để thực hiện những gì đang thực sự gợi ý trong câu trả lời của @dizy nhưng với việc bổ sung nêu:

đối tượng

Tất cả AVAssetTrack có một preferredTransform thuộc tính chứa thông tin định hướng cho bản nhạc đó. Biến đổi này được áp dụng bất cứ khi nào bản nhạc được hiển thị trên màn hình. Trong mã trước, chuyển đổi của hướng dẫn lớp được đặt thành chuyển đổi của bản nhạc nội dung để video trong bố cục mới hiển thị đúng cáchsau khi bạn điều chỉnh kích thước hiển thị của bản nhạc đó.

Mã nên được như thế này rồi (chỉ cần hai dòng để thêm):

// Grab the source track from AVURLAsset for example. 
AVAssetTrack *assetVideoTrack = [asset tracksWithMediaType:AVMediaTypeVideo].lastObject; 

// Grab the composition video track from AVMutableComposition you already made. 
AVMutableCompositionTrack *compositionVideoTrack = [composition tracksWithMediaType:AVMediaTypeVideo].lastObject; 

// Apply the original transform.  
if (assetVideoTrack && compositionVideoTrack) { 
    [compositionVideoTrack setPreferredTransform:assetVideoTrack.preferredTransform]; 
} 

flippedSize = CGSize(compositionVideoTrack.naturalSize.height, compositionVideoTrack.naturalSize.width); 
composition.renderSize = flippedSize; 

// Export.. 
Các vấn đề liên quan