使用 Monotouch 修剪视频失败 "The operation could not be completed"
Trimming video with Monotouch fails with "The operation could not be completed"
我正在尝试以编程方式将视频 trim 缩短为 5 秒。这是我的实现。
AVAssetExportSession exportSession= new AVAssetExportSession(videoAsset,AVAssetExportSession.PresetLowQuality.ToString());
int SystemVersion = Convert.ToInt16(UIDevice.CurrentDevice.SystemVersion.Split('.')[0]);
string filename;
if (SystemVersion >= 8)
{
var documents = NSFileManager.DefaultManager.GetUrls(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomain.User)[0].Path;
filename = Path.Combine(documents, "trimmed.mov");
}
else
{
var documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); // iOS 7 and earlier
filename = Path.Combine(documents, "trimmed.mov");
}
outputUrl=new NSUrl(filename);
exportSession.OutputUrl = outputUrl;
CMTime start = new CMTime((long)1, 1);
CMTime duration = new CMTime((long)5, 1);
CMTimeRange range = new CMTimeRange();
range.Start=start;
range.Duration=duration;
exportSession.TimeRange = range;
exportSession.OutputFileType = AVFileType.QuickTimeMovie;
ExportTrimmedVideo( exportSession);
async void ExportTrimmedVideo(AVAssetExportSession exportSession)
{
await exportSession.ExportTaskAsync ();
if (exportSession.Status == AVAssetExportSessionStatus.Completed) {
InvokeOnMainThread (() => {
new UIAlertView ("Export Sucess", "Video is trimmed", null, "O K").Show ();
});
}
else
{
InvokeOnMainThread (() => {
new UIAlertView ("Export Falure", exportSession.Error.Description, null, "O K").Show ();
});
}
}
但完成后我得到了一个归档状态。全NSError
说明如下
Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo=0x7cebcf80 {NSLocalizedDescription=The operation could not be completed, NSUnderlyingError=0x7cb08410 "The operation couldn’t be completed. (OSStatus error -12105.)", NSLocalizedFailureReason=An unknown error occurred (-12105)}
我可能做错了什么?
编辑
我在 Trimming video 上参考了 apple 的 documentation 并修改了上面的代码,但没有如下积极效果。
var compatiblePresets= AVAssetExportSession.ExportPresetsCompatibleWithAsset(videoAsset).ToList();
var preset="";
if(compatiblePresets.Contains("AVAssetExportPresetLowQuality"))
{
preset="AVAssetExportPresetLowQuality";
}
else
{
preset=compatiblePresets.FirstOrDefault();
}
AVAssetExportSession exportSession= new AVAssetExportSession(videoAsset,preset);
int SystemVersion = Convert.ToInt16(UIDevice.CurrentDevice.SystemVersion.Split('.')[0]);
string filename;
if (SystemVersion >= 8)
{
var documents = NSFileManager.DefaultManager.GetUrls(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomain.User)[0].Path;
filename = Path.Combine(documents, "trimmed.mov");
}
else
{
var documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); // iOS 7 and earlier
filename = Path.Combine(documents, "trimmed.mov");
}
outputUrl=new NSUrl(filename);
exportSession.OutputUrl = outputUrl;
exportSession.OutputFileType = AVFileType.QuickTimeMovie;
CMTime start = new CMTime((long)1, 600);
CMTime duration = new CMTime((long)5, 600);
CMTimeRange range = new CMTimeRange();
range.Start=start;
range.Duration=duration;
exportSession.TimeRange = range;
ExportTrimmedVideo( exportSession);
试试下面的代码。我修改了 exportSession.OutputUrl 以及您初始化 CMTimeRange 的方式。你要把它剪成 4 秒的片段吗?
var compatiblePresets= AVAssetExportSession.ExportPresetsCompatibleWithAsset(videoAsset).ToList();
var preset="";
if(compatiblePresets.Contains("AVAssetExportPresetLowQuality"))
{
preset="AVAssetExportPresetLowQuality";
}
else
{
preset=compatiblePresets.FirstOrDefault();
}
using (var exportSession = new AVAssetExportSession(videoAsset, preset))
{
int SystemVersion = Convert.ToInt16(UIDevice.CurrentDevice.SystemVersion.Split('.')[0]);
string filename;
if (SystemVersion >= 8)
{
var documents = NSFileManager.DefaultManager.GetUrls(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomain.User)[0].Path;
filename = Path.Combine(documents, "trimmed.mov");
}
else
{
var documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); // iOS 7 and earlier
filename = Path.Combine(documents, "trimmed.mov");
}
exportSession.OutputUrl = NSUrl.FromFilename(filename);
exportSession.OutputFileType = AVFileType.QuickTimeMovie;
var range = new CMTimeRange();
range.Start = CMTime.FromSeconds (1, videoAsset.Duration.TimeScale);
range.Duration = CMTime.FromSeconds (5, videoAsset.Duration.TimeScale);
exportSession.TimeRange = range;
}
ExportTrimmedVideo( exportSession);
我正在尝试以编程方式将视频 trim 缩短为 5 秒。这是我的实现。
AVAssetExportSession exportSession= new AVAssetExportSession(videoAsset,AVAssetExportSession.PresetLowQuality.ToString());
int SystemVersion = Convert.ToInt16(UIDevice.CurrentDevice.SystemVersion.Split('.')[0]);
string filename;
if (SystemVersion >= 8)
{
var documents = NSFileManager.DefaultManager.GetUrls(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomain.User)[0].Path;
filename = Path.Combine(documents, "trimmed.mov");
}
else
{
var documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); // iOS 7 and earlier
filename = Path.Combine(documents, "trimmed.mov");
}
outputUrl=new NSUrl(filename);
exportSession.OutputUrl = outputUrl;
CMTime start = new CMTime((long)1, 1);
CMTime duration = new CMTime((long)5, 1);
CMTimeRange range = new CMTimeRange();
range.Start=start;
range.Duration=duration;
exportSession.TimeRange = range;
exportSession.OutputFileType = AVFileType.QuickTimeMovie;
ExportTrimmedVideo( exportSession);
async void ExportTrimmedVideo(AVAssetExportSession exportSession)
{
await exportSession.ExportTaskAsync ();
if (exportSession.Status == AVAssetExportSessionStatus.Completed) {
InvokeOnMainThread (() => {
new UIAlertView ("Export Sucess", "Video is trimmed", null, "O K").Show ();
});
}
else
{
InvokeOnMainThread (() => {
new UIAlertView ("Export Falure", exportSession.Error.Description, null, "O K").Show ();
});
}
}
但完成后我得到了一个归档状态。全NSError
说明如下
Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo=0x7cebcf80 {NSLocalizedDescription=The operation could not be completed, NSUnderlyingError=0x7cb08410 "The operation couldn’t be completed. (OSStatus error -12105.)", NSLocalizedFailureReason=An unknown error occurred (-12105)}
我可能做错了什么?
编辑
我在 Trimming video 上参考了 apple 的 documentation 并修改了上面的代码,但没有如下积极效果。
var compatiblePresets= AVAssetExportSession.ExportPresetsCompatibleWithAsset(videoAsset).ToList();
var preset="";
if(compatiblePresets.Contains("AVAssetExportPresetLowQuality"))
{
preset="AVAssetExportPresetLowQuality";
}
else
{
preset=compatiblePresets.FirstOrDefault();
}
AVAssetExportSession exportSession= new AVAssetExportSession(videoAsset,preset);
int SystemVersion = Convert.ToInt16(UIDevice.CurrentDevice.SystemVersion.Split('.')[0]);
string filename;
if (SystemVersion >= 8)
{
var documents = NSFileManager.DefaultManager.GetUrls(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomain.User)[0].Path;
filename = Path.Combine(documents, "trimmed.mov");
}
else
{
var documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); // iOS 7 and earlier
filename = Path.Combine(documents, "trimmed.mov");
}
outputUrl=new NSUrl(filename);
exportSession.OutputUrl = outputUrl;
exportSession.OutputFileType = AVFileType.QuickTimeMovie;
CMTime start = new CMTime((long)1, 600);
CMTime duration = new CMTime((long)5, 600);
CMTimeRange range = new CMTimeRange();
range.Start=start;
range.Duration=duration;
exportSession.TimeRange = range;
ExportTrimmedVideo( exportSession);
试试下面的代码。我修改了 exportSession.OutputUrl 以及您初始化 CMTimeRange 的方式。你要把它剪成 4 秒的片段吗?
var compatiblePresets= AVAssetExportSession.ExportPresetsCompatibleWithAsset(videoAsset).ToList();
var preset="";
if(compatiblePresets.Contains("AVAssetExportPresetLowQuality"))
{
preset="AVAssetExportPresetLowQuality";
}
else
{
preset=compatiblePresets.FirstOrDefault();
}
using (var exportSession = new AVAssetExportSession(videoAsset, preset))
{
int SystemVersion = Convert.ToInt16(UIDevice.CurrentDevice.SystemVersion.Split('.')[0]);
string filename;
if (SystemVersion >= 8)
{
var documents = NSFileManager.DefaultManager.GetUrls(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomain.User)[0].Path;
filename = Path.Combine(documents, "trimmed.mov");
}
else
{
var documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); // iOS 7 and earlier
filename = Path.Combine(documents, "trimmed.mov");
}
exportSession.OutputUrl = NSUrl.FromFilename(filename);
exportSession.OutputFileType = AVFileType.QuickTimeMovie;
var range = new CMTimeRange();
range.Start = CMTime.FromSeconds (1, videoAsset.Duration.TimeScale);
range.Duration = CMTime.FromSeconds (5, videoAsset.Duration.TimeScale);
exportSession.TimeRange = range;
}
ExportTrimmedVideo( exportSession);