我正在尝试创建一个应用程序,允许用户在Xamarin.Forms中下载YouTube视频的音频。我可以使用' VideoLibrary'下载视频。并使用' MediaToolkit'将其转换为mp3。在C#控制台应用程序中没有任何错误。
static void DownloadAudio(string videoUrl, string saveDir)
{
YouTube youtube = YouTube.Default;
Video vid = youtube.GetVideo(videoUrl);
File.WriteAllBytes(saveDir + vid.FullName, vid.GetBytes());
string originalFile = saveDir + vid.FullName;
var inputFile = new MediaToolkit.Model.MediaFile { Filename = saveDir + vid.FullName };
var outputFile = new MediaToolkit.Model.MediaFile { Filename = $"{saveDir + vid.FullName}.mp3" };
using (var engine = new MediaToolkit.Engine())
{
engine.GetMetadata(inputFile);
engine.Convert(inputFile, outputFile);
if (File.Exists(originalFile))
{
File.Delete(originalFile);
}
}
}
问题是这在Xamarin中不起作用。只能安装可携带版本的nuget软件包,它不包含Engine
或MediaFile
的定义。
此外,并非所有视频都以[{1}}下载,有些下载为.mp4
。我需要输出文件为.webm
和.mp3
。
如何将视频文件转换为Xamarin.Forms中的音频文件?
答案 0 :(得分:1)
如果PCL无法提供,您可以选择平台依赖关系。基本上,您可以为所需的功能创建一个界面,在特定于平台的项目中实现这些类,并使用DependencyAttribute
导出它们。现在,您可以通过PCL获取DependencyService
的实例(请参阅here和here)。
界面可能如下所示
public interface IMediaHelper
{
void ConvertToMp3(string fullFileName);
}
和实现(在您的iOS和Android项目中 - 使用SharedProject来避免代码重复)
[assembly: Dependency(typeof(MediaHelper))]
public class MediaHelper
{
public void ConvertToMp3(string fullFileName)
{
var infile = new MediaToolkit.Model.MediaFile { Filename = fullFileName;
var outfile = new MediaToolkit.Model.MediaFile { Filename = $"{fullFileName}.mp3" };
using (var engine = new MediaToolkit.Engine())
{
engine.GetMetadata(infile);
engine.Convert(infile, outfile);
if (File.Exists(fullFileName))
{
File.Delete(fullFileName);
}
}
}
}
因此,您的客户端代码将是
void DownloadAudio(string videoUrl, string saveDir)
{
YouTube youtube = YouTube.Default;
Video vid = youtube.GetVideo(videoUrl);
var fullFileName = Path.Combine(saveDir, vid.FullName);
File.WriteAllBytes(fullFileName, vid.GetBytes());
var mediaHelper = DependencyService.Get<IMediaHelper>();
mediaHelper.ConvertToMp3(fullFileName);
}
请注意:我已将Path.Combine
的调用替换为路径和文件的手动并置,后者处理路径分隔符已经附带路径的情况。此外,它为您处理不同的平台。
显然,MediaToolkit不会为Android工作(至少),因此你必须采用相同的方式 - 平台依赖 - 并用你已经得到的东西实现你需要的东西-of即装即用。请参阅this answer有关如何从视频中提取PCM数据的信息,以及this one有关如何将PCM转换为MP3的信息 - 只是为了给您一个想法。
请注意
[...]如果你想编码/解码一个mp3文件,你可能需要支付许可证/专利费。