在 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 中不起作用。只能安装不包含 Engine
或 MediaFile
.
定义的 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
我正在尝试创建一个允许用户下载 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
.
此外,并非所有视频都下载为 .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
请注意
[...] if you want to encode/decode a mp3 file you may have to pay license/patent fees.
source