CSCore:可能,剪切音频文件
本文关键字:音频 文件 可能 CSCore | 更新日期: 2023-09-27 18:02:49
是否可以使用CSCore-Library剪切音频文件?例如,我想在第20秒开始播放mp3在第50秒停止然后我想生成一个新的mp3文件,它会这样做
有两种方法可以剪切mp3文件。
- 解析mp3文件获取所有mp3帧。复制你不想剪掉的帧并粘贴到一个新的流中。
- 解码整个mp3文件,重新编码你不想被剪掉的数据。
第一种方法的缺点是它比方法2更复杂,而且你不能精确地剪切mp3。也就是说,你只能使用mp3帧的大小。
第二种方法正是您正在寻找的。但有一个大问题:从Windows 8开始才支持mp3编码。这意味着你不能在Windows XP、Vista或Windows 7中使用这种方法。
->我建议您使用任何第三方组件,如lame, ffmpeg,…
无论如何……方法2的例子:
private static void Main(string[] args)
{
TimeSpan startTimeSpan = TimeSpan.FromSeconds(20);
TimeSpan endTimeSpan = TimeSpan.FromSeconds(50);
using (IWaveSource source = CodecFactory.Instance.GetCodec(@"C:'Temp'test.mp3"))
using (MediaFoundationEncoder mediaFoundationEncoder =
MediaFoundationEncoder.CreateWMAEncoder(source.WaveFormat, @"C:'Temp'dest0.mp3"))
{
AddTimeSpan(source, mediaFoundationEncoder, startTimeSpan, endTimeSpan);
}
}
private static void AddTimeSpan(IWaveSource source, MediaFoundationEncoder mediaFoundationEncoder, TimeSpan startTimeSpan, TimeSpan endTimeSpan)
{
source.SetPosition(startTimeSpan);
int read = 0;
long bytesToEncode = source.GetBytes(endTimeSpan - startTimeSpan);
var buffer = new byte[source.WaveFormat.BytesPerSecond];
while ((read = source.Read(buffer, 0, buffer.Length)) > 0)
{
int bytesToWrite = (int)Math.Min(read, bytesToEncode);
mediaFoundationEncoder.Write(buffer, 0, bytesToWrite);
bytesToEncode -= bytesToWrite;
}
}