微信小程序+.NET(十八) ffmpeg音频转码/拼接/混合

  继续完善小程序,昨天对crawler接口进行了修改,解决了网页压缩导致的html乱码问题和JSON对象序列化问题,现在对tts接口进行修改,使其处理科大讯飞在线tts接口的1000字节问题。
  1000字节,也就是500中文,为了避免有些网页的乱码等情况,经尝试取text切分长度=345(?340-350之间),然后是调用第一版的tts方法,这里我用的是多线程处理的,最后将生成的多段语音拼接(注意这里不是合并,合并/混合是将两段音频并到一条时间轴上,这里的拼接是将两段时间轴连接)
  先来说一说ffmpeg,我之前使用ffmpeg转码微信小程序录音.mp3为科大讯飞iat接口要求的.wav格式 :

ffmpeg -y -i D:\IISLocalServer\audios\a.mp3 -acodec pcm_s16le -f s16le -ac 1 -ar 16000 D:\IISLocalServer\audios\a.wav

  这次用的他的音视频拼接功能:
  网上找到的几个方法我都尝试过,最后选择的是下图第三种,先将文件名写入.txt然后进行拼接,最后将中间的.wav和.txt删除,保留最后结果,并返回相对路径:

//混合音频
ffmpeg -i 1.wav -i 2.wav -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -f wav c.wav
//拼接音频
ffmpeg.exe -i "concat:123.mp3|124.mp3" -acodec copy output.mp3
ffmpeg -f concat -i list.txt -c copy res.wav

  上图第一种为合并,最后效果是混合的,类似多重唱,感觉可以用来做音乐伴奏之类的。第二种为直接写文件名,测试时没得到我想要的结果,建议采用第三种写入文件的方式,不过这样会对多个文件进行创建写入甚至还有删除操作,会很慢,即使最大化了gap=345依然很慢,后期我会慢慢尝试改进,包括这里的多线程处理的优化也是,对多线程一直接触很少,Java期间也基本没用过。
  这里要注意一下,第三条若是在.NET中无法合并,建议用命令行尝试命令,若是报错类似于“文件名不合法”,尝试加入-safe -0

ffmpeg -f concat -safe -0 -i list.txt -c copy res.wav

  附上最新版本代码:

/// <summary>
/// 拼接音频
/// </summary>
/// <param name="list">需要合并的音频绝对路径列表</param>
/// <param name="fileCatlog">最后的拼接音频放入的目录,也是拼接的工作区</param>
/// <returns></returns>
#region 合并音频
public string mergeAudios(ArrayList list,string fileCatlog)
{
    string mergeListName = CreateFileName(".txt");
    string mergeList = System.IO.Path.Combine(fileCatlog, mergeListName);
    FileStream fs = new FileStream(mergeList, FileMode.Create);
    StreamWriter sw = new StreamWriter(fs);
    foreach (string s in list)
    {
        sw.Write("file '"+s+ "'\r\n");
    }
    sw.Flush();//清空缓冲区
    sw.Close();
    fs.Close();

    string mergeFileName = CreateFileName(".wav");
    string mergeFile = System.IO.Path.Combine(fileCatlog, mergeFileName);
    string strCmd = "-f concat -safe -0 -i " + mergeList + " -c copy " + mergeFile;

    //调用ffmpeg.exe
    System.Diagnostics.Process p = new System.Diagnostics.Process();
    p.StartInfo.FileName = "D:\\ffmpeg\\bin\\ffmpeg.exe"; 
    p.StartInfo.Arguments = " " + strCmd;
    p.StartInfo.UseShellExecute = true;
    p.StartInfo.RedirectStandardInput = false;//可能接受来自调用程序的输入信息 
    p.StartInfo.RedirectStandardOutput = false;//由调用程序获取输出信息 
    p.StartInfo.RedirectStandardError = false;//重定向标准错误输出
    p.StartInfo.CreateNoWindow = false;//不显示程序窗口
    //启动程序
    p.Start();
    //等待程序执行完退出进程
    p.WaitForExit();
    
    //删除中间.txt文件,中间.wav文件
    deleteFile(mergeList,1);
    foreach(string file in list)
    {
        deleteFile(file, 1);
    }

    if (System.IO.File.Exists(mergeFile))
    {
        //return returnURL;
        return mergeFile;
    }
    return "";
}
#endregion
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值