C# 以Xamarin格式将视频文件转换为音频文件

C# 以Xamarin格式将视频文件转换为音频文件,c#,audio,xamarin.forms,file-conversion,C#,Audio,Xamarin.forms,File Conversion,我正在尝试创建一个应用程序,允许用户以Xamarin.Forms下载youtube视频的音频。我可以使用“VideoLibrary”下载视频,并在C#Console应用程序中使用“MediaToolkit”将其转换为mp3,而不会出现任何错误 static void DownloadAudio(string videoUrl, string saveDir) { YouTube youtube = YouTube.Default; Video vid = youtube.GetV

我正在尝试创建一个应用程序,允许用户以Xamarin.Forms下载youtube视频的音频。我可以使用“VideoLibrary”下载视频,并在C#Console应用程序中使用“MediaToolkit”将其转换为mp3,而不会出现任何错误

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软件包的便携式版本,其中不包含
引擎
媒体文件
的定义

此外,并非所有视频都以
.mp4
的形式下载,有些视频以
.webm
的形式下载。我需要输出文件同时为
.mp3
.mp4


如何将视频文件转换为Xamarin.Forms中的音频文件?

如果PCL无法提供该文件,您可以选择使用平台依赖关系。基本上,您可以为所需的功能创建一个接口,在特定于平台的项目中实现类,并使用导出它们。现在,您可以从PCL获得一个带有
DependencyService
(请参阅和)的实例

该接口可能如下所示

public interface IMediaHelper
{
    void ConvertToMp3(string fullFileName);
}
以及实现(在您的iOS和Android项目中-使用SharedProject以避免代码重复)

因此,您的客户机代码将是

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);
}
void downloaddaudio(字符串videoUrl,字符串saveDir)
{
YouTube=YouTube.Default;
Video vid=youtube.GetVideo(videoUrl);
var fullFileName=Path.Combine(saveDir,vid.FullName);
writealBytes(fullFileName,vid.GetBytes());
var mediaheloper=DependencyService.Get();
mediaheloper.ConvertToMp3(完整文件名);
}
请注意:我已使用调用
path.Combine
,替换了手动连接路径和文件,该调用处理路径已带有路径分隔符的情况。此外,它还为您处理不同的平台

没有MediaToolkit 显然,MediaToolkit(至少)不适用于Android,因此您必须以同样的方式使用平台依赖项,并使用现成的工具实现所需的功能。请参见“如何从视频中提取PCM数据”和“如何将PCM转换为MP3”-仅为您提供一个想法

请注意

[…]如果您想对mp3文件进行编码/解码,可能需要支付许可证/专利费


这是有道理的,但我如何使用它来避免此错误:
无法安装程序包“MediaToolkit 1.1.0.1”。您正在尝试将此软件包安装到目标为“MonoAndroid,Version=v8.0”的项目中,但该软件包不包含任何与该框架兼容的程序集引用或内容文件。有关更多信息,请联系软件包作者。
@MuhammadKhan-不幸的是,它似乎不支持android。
mp4
to
PCM
to
mp3
解决方案都是java的,我如何在Xamarin.Forms(C#)中使用它?Xamarin.android包装了整个java API,在android下,您应该能够使用这些函数。请参阅Xamarin文档以查看类和函数名,因为访问器方法被转换为属性。
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);
}