iOSで、フレームレートを変更し、継続時間をクリップして、入力MOVファイルを再エンコードしようとしています。現時点では、AVAssetWriterでビデオプロパティを次のように設定しています。
NSMutableDictionary* compressionPropertiesDict = [NSMutableDictionary new];
compressionPropertiesDict[AVVideoProfileLevelKey] = AVVideoProfileLevelH264High40;
if(self.fps > 0) {
compressionPropertiesDict[AVVideoAverageNonDroppableFrameRateKey] = [NSNumber numberWithInt:self.fps];
_sessionMgr.videoSettings = @
{
AVVideoCodecKey: AVVideoCodecH264,
AVVideoWidthKey: [NSNumber numberWithFloat:self.outputSize.width],
AVVideoHeightKey: [NSNumber numberWithFloat:self.outputSize.height],
AVVideoCompressionPropertiesKey: compressionPropertiesDict,
};
これは、実行時に次のようになります。
videoSettings =
{
AVVideoCodecKey = avc1;
AVVideoCompressionPropertiesKey = {
AverageNonDroppableFrameRate = 15;
ProfileLevel = "H264_High_4_0";
};
AVVideoHeightKey = 960;
AVVideoWidthKey = 640;
}
最後に、でクラッシュしNSInvalidArgumentException: "Compression property AverageNonDroppableFrameRate is not supported for video codec type avc1"
ます。(シミュレーターを使用した単体テストで。)
iOSで使用できるコーデックタイプはAVVideoCodecH264 / "avc1"の1つだけAVVideoAverageNonDroppableFrameRateKey
です。そして、他のプロジェクトがを使用していることに気付きました。実際、私はSDAVAssetExportSessionを使用しており、そのコードベースでは、このキーが明示的に使用されていることがわかります。したがって、このキーを使用してフレームレートを設定する方法があるはずだと思いました。
AVVideoMaxKeyFrameIntervalKey
代わりに少し実験もしましたが、フレームレートはまったく変わりません...
要約すると、iOS AVFoundationベースのビデオ変換用に異なる(常に低い)出力フレームレートを設定するのを手伝ってくれる人はいますか?ありがとう!
質問で述べたように、私はビデオのエクスポートを容易にするためにSDAVAssetExportSessionを使用しました。フレームレートを簡単に変更できるように、いくつかの小さな変更を加えました。
主な要点はAVMutableVideoComposition
、を使用してフレームレートを変更し、frameDuration
プロパティを目的のフレームレートに設定し、このコンポジションオブジェクトをAVAssetReaderVideoCompositionOutput
トランスコーディングで使用されるオブジェクトに渡すことができることです。
SDAVAssetExportSessionのbuildDefaultVideoComposition
メソッドで、次のように変更しました。
- (AVMutableVideoComposition *)buildDefaultVideoComposition
{
AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition];
AVAssetTrack *videoTrack = [[self.asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
// ...
videoComposition.frameDuration = CMTimeMake(1, myDesiredFramerate);
// ...
それがトリックでした。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加