Xamarin C# 使用 AVAsset Native 将 .mov 转码为 .mp4 IOS
Xamarin C# Transcode .mov to .mp4 with AVAsset Native IOS
问题:我们的跨平台应用程序(IOS 和 Android)无法在 Android 上播放来自 IOS 的视频。
解决方案:在上传之前,在客户端 IOS 应用程序上将 .mov 视频文件转码为 .mp4。
问题:无法获取 IOS 上的文件位置(字符串输入为空)。不确定我的本机代码/方法是否合理。
异常:错误域=AVFoundationErrorDomain 代码=-11800“操作无法完成”
共享代码:
try
{
MediaPickResult pickresult = await MediaGallery.PickAsync(1, MediaFileType.Video);
if (pickresult != null)
{
foreach (var video in pickresult.Files)
{
string guid = Guid.NewGuid().ToString();
blobupload.BlobID = guid + ".mp4";
string inputfilename = video.NameWithoutExtension + "." + video.Extension;
string input = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), inputfilename);
string output = Path.Combine(AzureStorage.localpath, guid + ".mp4");
if (File.Exists(input))
{
await IVideoConverter.ConvertVideo(input, output);
}
}
}
原生 IOS:
public async Task ConvertVideo(string inputpath, string outputpath)
{
//string OutputFilePath = Path.ChangeExtension(outputpath, "mp4");
AVAsset asset = AVAsset.FromUrl(NSUrl.FromFilename(inputpath));
AVAssetExportSession export = new AVAssetExportSession(asset, AVAssetExportSession.PresetPassthrough);
export.OutputUrl = NSUrl.FromFilename(outputpath);
export.OutputFileType = AVFileType.Mpeg4;
export.ShouldOptimizeForNetworkUse = true;
var results = export.DetermineCompatibleFileTypesAsync();
try
{
export.ExportAsynchronously(() =>
{
if (export.Error != null)
{
System.Diagnostics.Debug.WriteLine(export.Error.LocalizedDescription);
}
});
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex);
}
我建议
- 从 MediaFile 获取流
- 写入本地应用程序文件夹
- 将该本地副本的路径传递给
ConvertVideo
问题:我们的跨平台应用程序(IOS 和 Android)无法在 Android 上播放来自 IOS 的视频。
解决方案:在上传之前,在客户端 IOS 应用程序上将 .mov 视频文件转码为 .mp4。
问题:无法获取 IOS 上的文件位置(字符串输入为空)。不确定我的本机代码/方法是否合理。
异常:错误域=AVFoundationErrorDomain 代码=-11800“操作无法完成”
共享代码:
try
{
MediaPickResult pickresult = await MediaGallery.PickAsync(1, MediaFileType.Video);
if (pickresult != null)
{
foreach (var video in pickresult.Files)
{
string guid = Guid.NewGuid().ToString();
blobupload.BlobID = guid + ".mp4";
string inputfilename = video.NameWithoutExtension + "." + video.Extension;
string input = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), inputfilename);
string output = Path.Combine(AzureStorage.localpath, guid + ".mp4");
if (File.Exists(input))
{
await IVideoConverter.ConvertVideo(input, output);
}
}
}
原生 IOS:
public async Task ConvertVideo(string inputpath, string outputpath)
{
//string OutputFilePath = Path.ChangeExtension(outputpath, "mp4");
AVAsset asset = AVAsset.FromUrl(NSUrl.FromFilename(inputpath));
AVAssetExportSession export = new AVAssetExportSession(asset, AVAssetExportSession.PresetPassthrough);
export.OutputUrl = NSUrl.FromFilename(outputpath);
export.OutputFileType = AVFileType.Mpeg4;
export.ShouldOptimizeForNetworkUse = true;
var results = export.DetermineCompatibleFileTypesAsync();
try
{
export.ExportAsynchronously(() =>
{
if (export.Error != null)
{
System.Diagnostics.Debug.WriteLine(export.Error.LocalizedDescription);
}
});
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex);
}
我建议
- 从 MediaFile 获取流
- 写入本地应用程序文件夹
- 将该本地副本的路径传递给
ConvertVideo