在 Xamarin Forms 中将视频文件转换为音频文件

Covert video file to audio file in Xamarin Forms

我正在尝试创建一个允许用户下载 Xamarin.Forms 中 YouTube 视频音频的应用程序。我可以使用 'VideoLibrary' 下载视频,并在 C# 控制台应用程序中使用 '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 中不起作用。只能安装不包含 EngineMediaFile.

定义的 nuget 包的便携版本

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

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

如果 PCL 中不可用,您可以选择平台依赖项。基本上你为你需要的功能创建一个接口,在你的平台特定项目中实现 类 并使用 DependencyAttribute. From your PCL you can now obtain an instance with the DependencyService (see here and 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

显然 MediaToolkit 不适用于 Android(至少),因此您必须采用相同的方式 - 使用平台依赖性 - 并根据您的需求实现您所需要的开箱即用。请参阅 this answer on how to extract PCM data from a video and 了解如何将 PCM 转换为 MP3 - 仅供您参考。

请注意

[...] if you want to encode/decode a mp3 file you may have to pay license/patent fees.

source