【问题标题】:Covert video file to audio file in Xamarin Forms在 Xamarin Forms 中将视频文件转换为音频文件
【发布时间】:2018-05-24 04:49:12
【问题描述】:

我正在尝试创建一个应用程序,允许用户在 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 中不起作用。只能安装不包含 Engine 或 MediaFile 定义的可移植版本的 nuget 包。

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

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

【问题讨论】:

    标签: c# audio xamarin.forms file-conversion


    【解决方案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

    显然 MediaToolkit 至少不适用于 Android,因此您必须采用相同的方式 - 使用平台依赖项 - 并使用开箱即用的东西来实现您需要的东西.请参阅this answer 了解如何从视频中提取 PCM 数据,以及this one 了解如何将 PCM 转换为 MP3 - 只是为了给你一个想法。

    请注意

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

    source

    【讨论】:

    • 这确实有道理,但我将如何使用它来解决这个错误:Could not install package 'MediaToolkit 1.1.0.1'. You are trying to install this package into a project that targets 'MonoAndroid,Version=v8.0', but the package does not contain any assembly references or content files that are compatible with that framework. For more information, contact the package author.
    • @MuhammadKhan - 不幸的是它似乎不支持安卓。
    • mp4 到 PCM 到 mp3 的解决方法都在 java 中,我怎样才能在 Xamarin.Forms (C#) 中使用它?
    • Xamarin.Android 封装了整个 Java API,在 Android 下你应该可以使用这些功能。请参阅 Xamarin 文档以查看类和函数名称,因为访问器方法已转换为属性。
    猜你喜欢
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多