ios - Xamarin降低影片大小

标签 ios video xamarin xamarin.ios

我想在Xamarin(iOS)中“压缩”视频(用于上传)。
我发现了有关AVAssetWriter类的信息,我可以设置分辨率,比特率等。
您将如何使用它?还有哪几类?
您可能已经注意到,对于应用程序开发来说,它是非常新的。

最佳答案

这是一个使用AVAssetReader将AVAssetWriter馈送给的示例,以重新采样和/或转码视频。

在此示例中,我正在拍摄包含在应用程序捆绑包(BundleResource)中的名为“Pool.mp4”的视频,并以1Mbps的大小将300x300的大小作为“NewVideo.mp4”保存到“tmp”目录中(缩小原始文件大小增加约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;
        }
    }
});

关于ios - Xamarin降低影片大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38262302/

相关文章:

c# - 使用 Xamarin.Insights 时异常通常会导致崩溃

ios - Swift 2 类型转换字典

ios - Sitecore 媒体库与 iOS 不兼容?

actionscript-3 - AS3 - 如何知道视频是否结束?

android - Xamarin 安卓 : Convert PendingResult parameter to SubmitScoreResult

c# - Xamarin Studio btouch 不支持字段类型 : NSUuid

ios - 音频录制和播放同时进行

iphone - 使用水平滚动 TableView 时的滑动标题 View 栏

ios - Swift:如何在字符串的特定索引处插入 UIImage?

php - ffmpeg 命令通过命令行执行,而不是通过 PHP 脚本