2016-11-30 11 views
0

여기 내 코드입니다 :QMediaPlayer :: duration()이 -1 값을주는 이유는 무엇입니까?

QString BoatProgramming::setDuration(QString path) 
{ 
    if (path.isNull()) { return ""; } 
    QMediaPlayer mp; 
    mp.setMedia(QUrl::fromLocalFile("/home/akiva/deleteme.ogg")); 
    qDebug() << mp.duration(); // Outputting a value of -1 

    m_Duration = QString::number(mp.duration()); 
    emit durationChanged(); 
    return m_Duration; 
} 

어딘가에 분명히 오류가 있습니다 만, 파일 이름을 확인하는 이상, 나는 문제가 무엇인지에 관해서는 유감스럽게도 나쁘게입니다. 단순히 .ogg이 지원되지 않을 수 있습니까? 객체가 메모리에 완전히로드되기 전에 함수를 호출합니까? 아니면 다른 것입니까?

감사합니다. docs에서 비동기 로딩

답변

1

QMediaPlayer::setMedia() 수행

이 함수는 지정된 미디어의 소스를 기록한 후 즉시 반환한다. 미디어로드가 완료 될 때까지 기다리지 않고 오류를 확인하지 않습니다. 미디어가로드 될 때 및로드하는 동안 오류가 발생할 때 알림을받을 mediaStatusChanged()error() 신호를 들어보십시오.

QMediaPlayer 아직 미디어를로드하지 수 있으므로 즉시 setMedia()를 호출 한 후 duration()에 대한 QMediaPlayer를 조회하는 것은 작동하지 않을 수 있다는 것을 의미한다. 그 로딩을 보장하기 위해

duration()를 호출하기 전에 완료, 당신은 mediaStatusChanged() 신호를 수신하고, duration()를 얻을 수있는 경우에만 mediaStatus() 반환 QMediaPlayer::LoadedMedia. 여기에 최소한의 예가 나와 있습니다.

#include <QtWidgets> 
#include <QtMultimedia> 

int main(int argc, char* argv[]) 
{ 
    QApplication app(argc, argv); 
    QLabel label; //a label to display duration 

    QString fileName = QFileDialog::getOpenFileName(nullptr, "Open Media File"); 

    QMediaPlayer mp; 
    mp.setMedia(QUrl::fromLocalFile(fileName)); 
    QObject::connect(&mp, &QMediaPlayer::mediaStatusChanged, 
        [&](QMediaPlayer::MediaStatus status){ 
     if(status == QMediaPlayer::LoadedMedia) //when loading is finished 
     { 
      //show duration in a label 
      qint64 duration= mp.duration(); 
      label.setText(QString("Duration: %1 ms.\n\nThat is: %2") 
          .arg(duration) 
          .arg(QDateTime::fromTime_t(duration/1000).toUTC() 
           .toString("hh:mm:ss"))); 
      label.show(); 
     } 
    }); 

    return app.exec(); 
} 
+0

제 생각에는 다릅니다. 코드를 메인에서 테스트 한 후에는 일이 순조롭게 진행되므로 코드가 작동합니다. 그러나 그것을 내 자신의 수업에서 시험하면, 나는 1 년을 기다릴 수 있고, 그 신호는 절대로 발동하지 않을 것입니다. 그러나 이것을 다음과 같이 변경합니다 : QObject :: connect (& m_MediaPlayer, & QMediaPlayer :: durationChanged, [&] (qint64 fun)' – Akiva

+0

그건 그렇고, 나는 인터넷 검색을 시도했지만, 무엇이든 그 구문은 무엇을합니까? [&]'는 무엇을합니까? 나는 그것을 전혀 보지 못했습니다. – Akiva

+1

@Akiva, 이것은 C++ 11 람다 식입니다. [이 질문에] (http://stackoverflow.com /]/7627098/2666212)'[&]'구문은 람다가 참조하는 변수를 캡쳐합니다. 클래스 메소드의 지역 변수에 대해 그렇게하지 않으면, 귀하의 람다 (이 아마도 메인에서 일하는 이유는 귀하의 클래스에서 작동하지 않습니다.) 당신이 람다 표현에 익숙하지 않은 경우, 대신 정상 슬롯을 사용하여 이러한 문제를 피하십시오 (즉, 그냥이 람다 함수를 수업에 정의되어 있습니다.) – Mike