将音频文件拆分

布里巴

我正在尝试将音频文件分成几部分。

事实是:我有一个字节数组,我想将wav文件分成一些随机的片段(例如3个)。

当然,我知道我不能做这样的事情。但是,有人对如何实现有想法吗?

byte[] result = stream.ToArray();
byte[] testing = new byte[44];

for (int ix = 0; ix < testing.Length; ix++)
{
    testing[ix] = result[ix];
}

System.IO.File.WriteAllBytes("yourfilepath_" + System.Guid.NewGuid() + ".wav", testing);

我想在C#中构建此解决方案,但听说有一个名为Sox的库,并且可以像这样静默分裂:

sox in.wav out.wav silence 1 0.5 1% 1 5.0 1% : newfile : restart

但是每次我运行此命令时,只会生成一个文件。(音频文件持续5秒钟,每个分割后的文件必须在1秒钟左右出现变化)。

做这个的最好方式是什么?

非常感谢你!

艾比

编辑

使用SOX:

string sox = @"C:\Program Files (x86)\sox-14-4-1\sox.exe";
string inputFile = @"D:\Brothers Vibe - Rainforest.mp3";
string outputDirectory = @"D:\splittest";
string outputPrefix = "split";

int[] segments = { 10, 15, 30 };

IEnumerable<string> enumerable = segments.Select(s => "trim 0 " + s.ToString(CultureInfo.InvariantCulture));
string @join = string.Join(" : newfile : ", enumerable);
string cmdline = string.Format("\"{0}\" \"{1}%1n.wav" + "\" {2}", inputFile,
    Path.Combine(outputDirectory, outputPrefix), @join);

var processStartInfo = new ProcessStartInfo(sox, cmdline);
Process start = System.Diagnostics.Process.Start(processStartInfo);

如果SOX抱怨libmad(用于MP3):复制其旁边的DLL,请参见此处

另外,您可以以相同方式使用FFMPEG:

ffmpeg -ss 0 -t 30 -i "Brothers Vibe - Rainforest.mp3" "Brothers Vibe - Rainforest.wav"

有关所有详细信息,请参阅文档


您可以使用BASS.NET轻松做到这一点

对于下面的代码,您传入:

  • 输入文件名
  • 每个段的期望持续时间
  • 输出目录
  • 每个段文件要使用的前缀

该方法将检查文件是否足够长以用于指定段,如果是,则它将以相同的采样率,通道,位深度将文件剪切为WAV。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using Un4seen.Bass;
using Un4seen.Bass.Misc;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            if (!Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_DEFAULT, IntPtr.Zero))
                throw new InvalidOperationException("Couldn't initialize BASS");

            string fileName = @"D:\Brothers Vibe - Rainforest.mp3";
            var segments = new double[] {30, 15, 20};
            string[] splitAudio = SplitAudio(fileName, segments, "output", @"D:\split");
        }

        private static string[] SplitAudio(string fileName, double[] segments, string prefix, string outputDirectory)
        {
            if (fileName == null) throw new ArgumentNullException("fileName");
            if (segments == null) throw new ArgumentNullException("segments");
            if (prefix == null) throw new ArgumentNullException("prefix");
            if (outputDirectory == null) throw new ArgumentNullException("outputDirectory");
            int i = Bass.BASS_StreamCreateFile(fileName, 0, 0,
                BASSFlag.BASS_STREAM_PRESCAN | BASSFlag.BASS_STREAM_DECODE);
            if (i == 0)
                throw new InvalidOperationException("Couldn't create stream");

            double sum = segments.Sum();

            long length = Bass.BASS_ChannelGetLength(i);
            double seconds = Bass.BASS_ChannelBytes2Seconds(i, length);
            if (sum > seconds)
                throw new ArgumentOutOfRangeException("segments", "Required segments exceed file duration");
            BASS_CHANNELINFO info = Bass.BASS_ChannelGetInfo(i);

            if (!Directory.Exists(outputDirectory)) Directory.CreateDirectory(outputDirectory);

            int index = 0;
            var list = new List<string>();
            foreach (double segment in segments)
            {
                double d = segment;
                long seconds2Bytes = Bass.BASS_ChannelSeconds2Bytes(i, d);
                var buffer = new byte[seconds2Bytes];
                int getData = Bass.BASS_ChannelGetData(i, buffer, buffer.Length);
                string name = string.Format("{0}_{1}.wav", prefix, index);
                string combine = Path.Combine(outputDirectory, name);
                int bitsPerSample = info.Is8bit ? 8 : info.Is32bit ? 32 : 16;
                var waveWriter = new WaveWriter(combine, info.chans, info.freq, bitsPerSample, true);
                waveWriter.WriteNoConvert(buffer, buffer.Length);
                waveWriter.Close();
                list.Add(combine);
                index++;
            }
            bool free = Bass.BASS_StreamFree(i);

            return list.ToArray();
        }
    }
}

一切

提取没有优化,如果您担心内存使用情况,则应增强该功能以抓取段的一部分并将其逐步写入WaveWriter

笔记

BASS.NET有一个nag屏幕,但您可以在其网站上请求免费注册序列。

注意,安装BASS.NET,然后确保从EXE旁边的基本包中复制bass.dll。此外,您几乎可以使用任何音频格式,请访问其网站以获取格式插件以及如何加载它们(BASS_PluginLoad)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将音频文件拆分为重叠的块

来自分类Dev

如何从文件夹将音频文件拆分为多个音频WAV文件

来自分类Dev

将音频文件拆分为多个文件,每个文件均小于大小阈值

来自分类Dev

将立体声音频文件拆分为每个通道的AudioNodes

来自分类Dev

将 quadri 音频文件拆分为 4 个单声道

来自分类Dev

将音频文件附加到视频

来自分类Dev

使用ffmpeg javascript将wav音频文件转换为pcm音频文件

来自分类Dev

使用ffmpeg javascript将wav音频文件转换为pcm音频文件

来自分类Dev

ffmpeg使用Android将多个音频文件合并为单个音频文件

来自分类Dev

验证音频文件

来自分类Dev

提供音频文件

来自分类Dev

连接音频文件

来自分类Dev

识别音频文件

来自分类Dev

以编程方式将文本保存到音频文件

来自分类Dev

将音量提高X分贝并重写音频文件

来自分类Dev

将选定的音频文件设置为铃声

来自分类Dev

将音频文件分割成任意大小

来自分类Dev

将音频文件从android发送到servlet

来自分类Dev

将音频文件保存在后台

来自分类Dev

将音频文件存储在数组中

来自分类Dev

将图另存为音频文件Matlab

来自分类Dev

如何将音频文件设置为某些特征?

来自分类Dev

如何将音频文件上传到文本通道

来自分类Dev

将音频文件保存到所需路径

来自分类Dev

将音频文件循环到给定的长度

来自分类Dev

将音频文件拖出媒体播放器

来自分类Dev

将音频文件分割成任意大小的片段

来自分类Dev

将浮点数组写入音频文件

来自分类Dev

将音频文件从Phonegap上载到Clypit