2017-05-16 45 views
3

iOSで、変更可能なフレームレートとクリップされた入力MOVファイルを再エンコードしようとしています。このように見て、実行時に出て来ることAVAssetWriterを使用してH264 movファイルを再エンコードする - フレームレートを設定する方法は?

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, 
}; 

::私はAVAssetWriterは少しこのようにビデオのプロパティを設定する必要があり、現時点での終わりに

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ベースのビデオ変換?ありがとう!

+0

あなたは解決策を見つけましたか? – user924

+0

ああ私は答えとして投稿しました! – Mete

答えて

1

質問で述べたように、私はSDAVAssetExportSessionを使ってビデオの書き出しを容易にしました。私はそれを少し変更して、簡単にフレームレートを変更することができました。

AVMutableVideoCompositionを使用してフレームレートを変更し、frameDurationプロパティを目的のフレームレートに設定し、このコンポジションオブジェクトをトランスコードで使用されるAVAssetReaderVideoCompositionOutputオブジェクトに渡すことができます。トリックをした

- (AVMutableVideoComposition *)buildDefaultVideoComposition 
{ 
    AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition]; 
    AVAssetTrack *videoTrack = [[self.asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; 

    // ... 

    videoComposition.frameDuration = CMTimeMake(1, myDesiredFramerate); 

    // ... 

:SDAVAssetExportSessionのbuildDefaultVideoComposition方法で

は、私はこのようなビットを見て、それを修正しました。

関連する問題