将视频文件隐藏到Xamarin Forms中的音频文件

时间:2017-12-10 14:26:49

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

我正在尝试创建一个应用程序,允许用户在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软件包,它不包含EngineMediaFile的定义。

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

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

1 个答案:

答案 0 :(得分:1)

如果PCL无法提供,您可以选择平台依赖关系。基本上,您可以为所需的功能创建一个界面,在特定于平台的项目中实现这些类,并使用DependencyAttribute导出它们。现在,您可以通过PCL获取DependencyService的实例(请参阅herehere)。

界面可能如下所示

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工作(至少),因此你必须采用相同的方式 - 平台依赖 - 并用你已经得到的东西实现你需要的东西-of即装即用。请参阅this answer有关如何从视频中提取PCM数据的信息,以及this one有关如何将PCM转换为MP3的信息 - 只是为了给您一个想法。

请注意

  

[...]如果你想编码/解码一个mp3文件,你可能需要支付许可证/专利费。

source