【发布时间】:2013-12-18 11:13:14
【问题描述】:
我开发了一个使用 ffmpeg 工具进行视频音频合并的 wpf 程序。为此,我正在使用后台工作人员类。我将在此处包含我的代码。
public VideoAudioMergeUserControl()
{
InitializeComponent();
bw.WorkerSupportsCancellation = true;
bw.WorkerReportsProgress = true;
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
}
void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
string progress= e.ProgressPercentage.ToString();
}
void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
}
void bw_DoWork(object sender, DoWorkEventArgs e)
{
Process interactiveProcess = new Process();
string processOutput = "";
interactiveProcess.StartInfo.FileName = @"E:\ffmpeg.exe";
interactiveProcess.StartInfo.UseShellExecute = false;
interactiveProcess.StartInfo.CreateNoWindow = true;
interactiveProcess.StartInfo.RedirectStandardInput = true;
interactiveProcess.StartInfo.RedirectStandardError = true;
ObservableCollection<VideoAudioCombined> videosAudios = (ObservableCollection<VideoAudioCombined>)e.Argument;
foreach (VideoAudioCombined va in videosAudios)
{
string absoluteVideoPath = aviVideoPath + va.Video;
string absoluteAudioPath = wavAudioPath + va.Audio;
string relativeVideoPathSplit = va.Video.Substring(0, va.Video.Length - 4);
string relativeAudioPathSplit = va.Audio.Substring(0, va.Audio.Length - 4);
string outputavi = relativeVideoPathSplit + "_" + relativeAudioPathSplit + ".avi";
string SelectedFileNameToSave = selectedFolder + outputavi;
interactiveProcess.StartInfo.Arguments = "-i " + absoluteVideoPath + " -i " + absoluteAudioPath + " -c:v copy -c:a aac -strict experimental " + SelectedFileNameToSave + " ";
interactiveProcess.Start();
interactiveProcess.EnableRaisingEvents = true;
interactiveProcess.ErrorDataReceived += new DataReceivedEventHandler((process, outputEventArgs) => processOutput += outputEventArgs.Data);
interactiveProcess.BeginErrorReadLine();
bw.ReportProgress(100);
}
}
private void ButtonMerge_Click(object sender, RoutedEventArgs e)
{
System.Windows.Forms.FolderBrowserDialog folderDlg = new System.Windows.Forms.FolderBrowserDialog();
folderDlg.ShowNewFolderButton = true;
folderDlg.Description = Properties.Resources.MSG_Select_Folder_Merge_Audio_Video;
// Show the FolderBrowserDialog.
System.Windows.Forms.DialogResult result = folderDlg.ShowDialog();
if (result == System.Windows.Forms.DialogResult.OK)
{
selectedFolder = folderDlg.SelectedPath+"\\";
}
bw.RunWorkerAsync(VideoAudioCollection);
}
循环的第一次迭代不会产生任何问题。第二次迭代带来了以下问题 - “已在流上启动异步读取操作。”请帮忙。
【问题讨论】:
-
启动后台工作者的代码部分在哪里?
-
我包含了调用后台worker的代码。
-
你的错误的原因是行'interactiveProcess.BeginErrorReadLine();'。您不必在 foreach 循环中使用单个进程调用该方法。在第一次迭代中,您启动了异步读取操作并继续,但在下一次迭代中,此操作已经开始。您必须查看逻辑才能启动流程。