2016-07-08 6 views
1

私はXamarin(iOS)でビデオ(アップロード用)を圧縮したいと思っています。 AVAssetWriterクラスについて知りました。解像度、ビットレートなどを設定できました。 どうやって使用しますか?どの他のクラスですか? 既に気づいているかもしれませんが、私は非常に新しいアプリ開発に取り組んでいます。Xamarinビデオサイズを小さくする

答えて

1

ここ再サンプル及び/又はトランスビデオにAVAssetWriterを供給するAVAssetReaderを使用したサンプルです。

この例では、アプリケーションバンドル(BundleResource)に含まれ、 "NewVideo.mp4"という名前の "tmp"ディレクトリに1Mbpsで300x300のサイズで保存された "Pool.mp4"という名前のビデオを撮影しています元のファイルサイズを〜50%縮小します)

:戻り値もエラーコードもチェックされておらず、それは実装者に残されています。

var asset = AVAsset.FromUrl(NSUrl.FromFilename("Pool.mp4")); 
NSError assetReaderError; 
var assetReader = AVAssetReader.FromAsset(asset, out assetReaderError); 
var assetTrack = asset.Tracks.First(); 
var inputSettings = new AVVideoSettingsUncompressed() 
{ 
    Height = 300, 
    Width = 300, 
}; 
var assetReaderOutput = new AVAssetReaderTrackOutput(assetTrack, settings: inputSettings); 
assetReaderOutput.AlwaysCopiesSampleData = false; 

string tempFile = Path.Combine(Path.GetTempPath(), "NewVideo.mp4"); 
if (File.Exists(tempFile)) File.Delete(tempFile); 
var url = NSUrl.FromFilename(tempFile); 
NSError assetWriterError; 
var assetWriter = new AVAssetWriter(url, AVFileType.Mpeg4, out assetWriterError); 
var outputSettings = new AVVideoSettingsCompressed() 
{ 
    Height = 300, 
    Width = 300, 
    Codec = AVVideoCodec.H264, 
    CodecSettings = new AVVideoCodecSettings 
    { 
     AverageBitRate = 1000000 
    } 
}; 
var assetWriterInput = new AVAssetWriterInput(mediaType: AVMediaType.Video, outputSettings: outputSettings); 
assetWriterInput.ExpectsMediaDataInRealTime = false; 
assetWriter.AddInput(assetWriterInput); 

assetWriter.StartWriting(); 
assetReader.AddOutput(assetReaderOutput); 
assetReader.StartReading(); 
assetWriter.StartSessionAtSourceTime(CoreMedia.CMTime.Zero); 

var mediaInputQueue = new DispatchQueue("mediaInputQueue"); 
assetWriterInput.RequestMediaData(mediaInputQueue,() => 
{ 
    while (assetWriterInput.ReadyForMoreMediaData) 
    { 
     var nextBuffer = assetReaderOutput.CopyNextSampleBuffer(); 
     if (nextBuffer != null) 
     { 
      assetWriterInput.AppendSampleBuffer(nextBuffer); 
     } 
     else 
     { 
      assetWriterInput.MarkAsFinished(); 
      assetWriter.FinishWritingAsync(); 
      assetReader.CancelReading(); 
      assetReader.Dispose(); 
      assetReaderOutput.Dispose(); 
      assetWriter.Dispose(); 
      assetWriterInput.Dispose(); 
      break; 
     } 
    } 
}); 
+0

ありがとうございました!やってみます! – Reaper

関連する問題