我的需求是手机上传录音。客户因手机上传的文件是m4a录音文件,按需求方要求,只要是m4a文件统一转成mp3格式上传,并且保留m4a格式文件。这两种方法跟自己业务有关,希望能帮到相同业务需求的朋友
第一个方法:
直接改后缀名,这种编码格式肯定有问题,如果只是电脑播放的话,应该没啥问题,其他平台播放可能兼容不好,或者对音频音段有要求的也不行。
第二种方法:
工具下载地址:
百度网盘 请输入提取码
提取码:xi9f
正经转换为mp3格式,那就使用到ffmpeg.exe工具转换。
下面两个方法只是转文件的方法,
与业务无关(如果只是转格式只需看这里)
。上代码
:
调用:
static void Main(string[] args)
{
var exePath = @”D:\desktop\M4aToMp3\M4aToMp3\ffmpeg.exe”; //转换工具地址
var m4aPath = @”D:\desktop\M4aToMp3\M4aToMp3\files\qwe.m4a”; //源文件地址,不知道为啥复制过来的路径不好使,但是得纯手打才管用
var mp3Path = @”D:\desktop\M4aToMp3\M4aToMp3\files\qwe.mp3″; //转换目标地址可直接命名自定义文件名
var result = ConvertAudio(exePath, m4aPath, mp3Path); //转换
}
/// <summary>
/// 音频运行格式转换( .m4a => .mp3 )
/// </summary>
/// <param name=”ffmpegVirtualPath”>ffmpeg.exe本地文件的存放路径</param>
/// <param name=”sourceFile”>m4a源文件物理路径</param>
/// <param name=”fileVirtualPath”>mp3目标文件虚拟路径</param>
/// <returns></returns>
public static string ConvertAudio(string ffmpegVirtualPath, string sourceFile, string fileVirtualPath)
{
//取得ffmpeg.exe的物理路径
string ffmpeg = ffmpegVirtualPath;
if (!File.Exists(ffmpeg))
{
return “找不到格式转换程序!”;
}
if (!File.Exists(sourceFile))
{
return “找不到源文件!”;
}
string destFile = fileVirtualPath;
System.Diagnostics.ProcessStartInfo FilestartInfo = new System.Diagnostics.ProcessStartInfo(ffmpeg);
FilestartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
/*ffmpeg参数说明
* -i 1.avi 输入文件
* -ab/-ac <比特率> 设定声音比特率,前面-ac设为立体声时要以一半比特率来设置,比如192kbps的就设成96,转换
均默认比特率都较小,要听到较高品质声音的话建议设到160kbps(80)以上
* -ar <采样率> 设定声音采样率,PSP只认24000
* -b <比特率> 指定压缩比特率,似乎ffmpeg是自动VBR的,指定了就大概是平均比特率,比如768,1500这样的 –加了以后转换不正常
* -r 29.97 桢速率(可以改,确认非标准桢率会导致音画不同步,所以只能设定为15或者29.97)
* s 320×240 指定分辨率
* 最后的路径为目标文件
*/
//FilestartInfo.Arguments = ” -i ” + sourceFile + ” -vn -ar 8 -ac 2 -ab 192 -f mp3 ” + destFile;
FilestartInfo.Arguments = ” -i ” + sourceFile + ” -f mp3 ” + destFile;
try
{
//转换
System.Diagnostics.Process process = System.Diagnostics.Process.Start(FilestartInfo);
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardInput = true;
StreamWriter q1 = process.StandardInput;
StreamReader q2 = process.StandardOutput;
}
catch (Exception ex)
{
return “格式转换失败!”;
}
return “格式转换成功!”;
}