2012-05-31 2 views
1

Qprocess에서 mencoder를 시작하고 진행률 표시 줄을 표시하면서 비디오를 변환 한 다음 종료합니다. 문제는 mencoder가 실제로 끝나기 전에 항상 종료된다는 것입니다. 루프가 몇 번 실행 된 다음 닫힙니다. 진행 막대 (progress.setValue())를 업데이트하는 행을 주석 처리하면 mencoder가 완료되어 실행되고 행복하게 종료됩니다.QProcess가 완료되기 전에 종료합니다.

하루 동안이 문제가 발생 했으므로 알아낼 수 없습니다. 또한, 나는 Mac에 있다고 언급해야합니다.

아이디어가 있으십니까?

감사

말론

void MainWindow::convertVideo() 
{ 
    QString input_filename = "/var/input.avi"; 
    QString output_filename = "/var/output.264"; 

    QStringList arguments; 
    arguments << input_filename << "-nosound" << "-of" << "rawvideo" << "-ofps" << "30" << "-vf" << "harddup" << "-ovc" << "x264" << "-x264encopts" << "bframes=0" << "-o" << output_filename; 

    QProcess* myProcess = new QProcess(this); 
    myProcess->setReadChannel(QProcess::StandardOutput); 

    myProcess->start("/opt/local/bin/mencoder", arguments); 

    QString output_string; 
    QStringList output_pieces; 

    QProgressDialog progress("Converting video...", "Abort", 0, 100, this); 
    progress.setWindowModality(Qt::WindowModal); 
    progress.setValue(0); 
    progress.show(); 


    while(myProcess->state() != QProcess::NotRunning) 
    { 
     output_string = myProcess->readAllStandardOutput(); 

     output_pieces = output_string.split(" "); 
     QStringList width_string_list = output_pieces.filter("%)"); 
     if(width_string_list.length() > 0) 
     { 
      width_string_list = width_string_list[width_string_list.length() - 1].split("("); 
      if(width_string_list.length() > 1) 
      { 
       width_string_list = width_string_list[1].split("%"); 
      } 
      else 
      { 
       width_string_list = width_string_list[0].split("%"); 
      } 

      progress.setValue(width_string_list[0].toInt()); 

      qDebug() << width_string_list[0].toInt(); 

     } 

     myProcess->waitForReadyRead(); 
    } 

    return; 
} 

답변

0

나는 그것의 작업을 완료되기 전에 QProcess이 시간 초과 생각합니다. myProcess->waitForFinished(-1)을 추가하면 도움이됩니다. 그런 다음 프로세스가 시간 종료되지 않습니다.