1

AVFoundation のヘルプを探しています。完璧ではない英語で申し訳ありません。

私は今ビデオエディタをプログラミングしています。まず、ライブラリからビデオを読み込み、AVAsset インスタンスに配置します。次に、ユーザーがビデオ領域を選択して速度パラメータを設定するたびに、次のようにします。

AVMutableComposition *mixComposition = [[AVMutableComposition alloc] init];
AVMutableCompositionTrack *track = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo
                                                                           preferredTrackID:kCMPersistentTrackID_Invalid];

[track insertTimeRange:CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(startOfEditedFrame, 600))
                           ofTrack:[self.videoAsset tracksWithMediaType:AVMediaTypeVideo][0] atTime:mixComposition.duration error:&error];

[track insertTimeRange:CMTimeRangeFromTimeToTime(CMTimeMakeWithSeconds(startOfEditedFrame, 600), CMTimeMakeWithSeconds(endOfEditedFrame, 600))
                           ofTrack:[self.videoAsset tracksWithMediaType:AVMediaTypeVideo][0] atTime:mixComposition.duration error:nil];

[track scaleTimeRange:CMTimeRangeFromTimeToTime(CMTimeMakeWithSeconds(startOfEditedFrame, 600), CMTimeMakeWithSeconds(endOfEditedFrame, 600))
                    toDuration:CMTimeMultiplyByFloat64(CMTimeMakeWithSeconds(endOfEditedFrame - startOfEditedFrame, 600), 1/[self.speeds[self.currentFrameStartIndex] floatValue])];

[track insertTimeRange:CMTimeRangeFromTimeToTime(CMTimeMakeWithSeconds(endOfEditedFrame, 600), self.videoAsset.duration)
                           ofTrack:[self.videoAsset tracksWithMediaType:AVMediaTypeVideo][0] atTime:mixComposition.duration error:nil];

self.videoAsset = mixComposition;

1回目は問題なく動作しますが、2回目は「insertTimeRange」のミスがあり、構成時間がゼロです。ここで何がうまくいかないのか、または別の方法で/より正しく行う方法の提案があれば教えてください。

4

2 に答える 2

1

この問題の解決策があるようです。あなたがしようとしているように、AVMutableComposition を複数回編集することはできません。

現時点では、URL (任意の URL) から作成した AVAsset であるため、初めて問題なく動作します。したがって、初めて編集を行った後、アセットの形式が変わります。AVAsset のままではなくなりましたが、 AVMutableCompositionです。そのため、新しい URL を使用してコンポジションをエクスポートし、その URL を使用して新しい AVAsset を作成し、そのアセットでこのコードを実行する必要があります。これは確実に機能します。

詳細な理由: ここでは、各部分を理解するのに役立ついくつかの提案を示します。

1.エクスポートせずにアセットを複数回編集しようとした場合。
これは、初めて編集を行ったときのアセットの外観です。

    <AVURLAsset: 0x7ff6404736c0, URL = file:///Users/puneetgurtoo/Library/Developer/CoreSimulator/Devices/8CC36C99-62B4-47F4-82BB-205DFE93FD96/data/Containers/Data/Application/26EFAB87-EA98-47DD-B7D9-A28CEE0DA043/Documents/28DBF785-58A4-4F3D-9AF0-77E300D89658-1595-000008AB6974EF7A.mov>

しかし、編集操作を行うと、次のようになります。

    AVMutableComposition: 0x7ff640403e50 tracks = (
"<AVMutableCompositionTrack: 0x7ff64046bb90 trackID = 1, mediaType = vide, editCount = 1>",
"<AVMutableCompositionTrack: 0x7ff64046c490 trackID = 2, mediaType = soun, editCount = 1>"
)>

そこで問題が発生します。

2.新しいURLでAVMutableCompositionをエクスポートするときは、そのURLでAVAssetの新しいインスタンスを作成するだけで問題は解決します。

今日の後半に、同じデモ バージョンへのリンクを投稿します。それまでは、このコンセプトを実行できます。

于 2016-08-13T10:18:13.850 に答える
0

私があなたに与えることができる 1 つのポインターは、のヘッダー ファイルを調べることですAVMutableComposition

insertTimeRange メソッドのコメントは、tracks パラメータについて述べています。

挿入するトラックを含むアセットを指定します。のインスタンスのみAVURLAssetがサポートされています。

したがって、トラックから挿入するトラックは、AVURLAssetクラスおよびこのクラスのみのものである必要があります。

于 2014-04-02T16:59:47.237 に答える