使用 ffmpeg,我想知道是否可以在接收数据块时转换 mp3 比特率?
这意味着我会缓慢地将块发送到 ffmpeg,以便它输出具有另一个比特率的 mp3。
所以在非常伪的代码中,它看起来像这样:
-
来自用户的 MP3 请求
-
将默认mp3发送到ffmpeg,其中包含要转换为所需比特率的参数。
-
当它正在写入一个新文件时,请在响应输出流中写入到目前为止所写的内容(我在 ASP.Net)
这是否可行,或者我需要切换到另一种技术?
[编辑]
现在,我正在尝试这样的解决方案:使用 C# 和 ffmpeg 将 wma 流转换为 mp3 流
[编辑2]
我回答了我的问题,使用 url 作为输入和标准输出作为输出是可行的。使用 url 可以逐块处理文件,使用 stdout,我们可以在处理数据时访问数据。
这是 C# 中的方法,请继续阅读 http://jesal.us/2008/04/how-to-manipulate-video-in-net-using-ffmpeg-updated/并更改为从一个流到另一个流。这意味着使用 ffmpeg 对流进行"实时"转换。
命令末尾的"-"代表"标准输出",所以这就是为什么它是目的地。
private void ConvertVideo(string srcURL)
{
string ffmpegURL = @"C:ffmpeg.exe";
DirectoryInfo directoryInfo = new DirectoryInfo(@"C:");
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = ffmpegURL;
startInfo.Arguments = string.Format("-i "{0}" -ar 44100 -f mp3 -", srcURL);
startInfo.WorkingDirectory = directoryInfo.FullName;
startInfo.UseShellExecute = false;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardInput = true;
startInfo.RedirectStandardError = true;
startInfo.CreateNoWindow = false;
startInfo.WindowStyle = ProcessWindowStyle.Normal;
using (Process process = new Process())
{
process.StartInfo = startInfo;
process.EnableRaisingEvents = true;
process.ErrorDataReceived += new DataReceivedEventHandler(process_ErrorDataReceived);
process.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived);
process.Exited += new EventHandler(process_Exited);
try
{
process.Start();
process.BeginErrorReadLine();
process.BeginOutputReadLine();
process.WaitForExit();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
process.ErrorDataReceived -= new DataReceivedEventHandler(process_ErrorDataReceived);
process.OutputDataReceived -= new DataReceivedEventHandler(process_OutputDataReceived);
process.Exited -= new EventHandler(process_Exited);
}
}
}
void process_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
if (e.Data != null)
{
byte[] b = System.Text.Encoding.Unicode.GetBytes(e.Data);
// If you are in ASP.Net, you do a
// Response.OutputStream.Write(b)
// to send the converted stream as a response
}
}
void process_Exited(object sender, EventArgs e)
{
// Conversion is finished.
// In ASP.Net, do a Response.End() here.
}