Russian Qt Forum
Ноябрь 22, 2024, 11:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QMediaPlayer и QIODevice  (Прочитано 13153 раз)
carrygun
Гость
« : Октябрь 26, 2013, 08:51 »

Здравствуйте.

Возникла проблема с QMediaPlayer, хочу к примеру проигрывать аудио по ссылке и знать загружаемый прогресс. Да, можно у медиа плеера воспользоваться просто setMedia() и передать туда url, но тогда не понятно сколько уже загрузилось. В тот же setMedia() можно передавать поток, а при создании плеера указать флаг QMediaPlayer::StreamPlayback. Я решил воспользоваться QNetworkReply, который вроде как потомок QIODevice. Но вот проблема, я не знаю в какой момент правильно его нужно передавать плееру и когда плеер стартовать. Ничего про QIODevice у плеера в доках не написано, гугление не помогло. Пробовал вызывать у QNAM get и сразу стартовать плеер по QNetworkReply, но эффекта никакого. На первый сигнал readyRead() тоже не проканало, на finished() это уже не то.

К слову если попробовать чтото в духе нижеприведенного кода, то все работает:
Код
C++ (Qt)
   mf = new QFile("test.mp3");
   mf->open(QIODevice::ReadOnly);
   m_mediaPlayer->setMedia(QMediaContent(), mf);
   m_mediaPlayer->setVolume(50);
   m_mediaPlayer->play();
 

Помогите пожалуйста, если кто сталкивался с такой проблемой, или наставьте на путь истиный.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #1 : Октябрь 28, 2013, 11:10 »

тоже интересует, но немного в другой ипостаси, хочу записывать потоковое аудио на диск с сжатием... пока ничего вразумительного не нашёл для Qt. QMediaRecorder с QMediaPlayer в связке не работает.
Записан
carrygun
Гость
« Ответ #2 : Октябрь 29, 2013, 05:31 »

У меня с плеером вообще проблема на проблеме. Оказалось что он даже просто по ссылке не хочет воспроизводить аудио. Из локального файла (QUrl::fromLocalFile) работает, а вот тот же файл по ссылке плеер молчит (кодеки даже обновлял), сигналит только ошибку об InvalidResource. Причем тот же код в Qt 5.0.1 работает нормально. Сижу жду 5.2, может что выйдет.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #3 : Ноябрь 03, 2013, 23:26 »

ну у меня кое какой прогресс наметился.
по факту:
1. удалось записать данные потока на диск и они воспроизводятся (ура)
2. поспроизвести поток через QNetworkReply не получилось, делал так же как и Вы.
Но есть вопросы:
1 - как узнать в каком формате идет вещание (кодек, битрейт и все такое)
2. как проигрывать данные полученные из потока (пробовал через mediaPlayer, audioDecoder, audioOutput) пока толку никакого.
Плеер и декоред говорят что в потоке нет данных, а ouput вообще молчит. Я пордозреваю что я много еще не знаю.
Вот привожу свой код как писать в файл. Пробовал открывать в vlc - играет нормально.

Код:
void MainWindow::readBytes()
{
    Q_ASSERT(freply);


    QByteArray  array = freply->readAll();
    //qDebug("got %i bytes",array.size());

    qint64 wrote = ffile->write(array);
    qDebug("wrote %lli bytes",wrote);
}

void MainWindow::finished()
{
    qDebug("finished");
}

void MainWindow::slotError(QNetworkReply::NetworkError)
{
    Q_ASSERT(freply);
    qDebug("reply error : %s",qPrintable(freply->errorString()));
}

void MainWindow::on_recordAction_triggered(bool checked)
{
    QAction *   action = qobject_cast<QAction*>(sender());
    Q_ASSERT(action);
    if(checked)
    {
        ffile = new QFile("/home/anton/sound.bin");
        if(!ffile->open(QIODevice::WriteOnly))
        {
            QMessageBox::warning(this,trUtf8("Ошибка создания файла"),trUtf8("Не удалось создать файл\n%1").arg(ffile->errorString()));
            delete ffile;
            ffile =  NULL;
            action->setChecked(false);
            return;
        }

        QUrl    url("http://streaming208.radionomy.com:80/abacusfm-vintage-jazz");
        QNetworkRequest request(url);
        freply = fnetManager.get(request);
        connect(freply,SIGNAL(readyRead()),this,SLOT(readBytes()));
        connect(freply, SIGNAL(error(QNetworkReply::NetworkError)),
                this, SLOT(slotError(QNetworkReply::NetworkError)));
        connect(freply,SIGNAL(finished()),this,SLOT(finished()));

        fplayer.setMedia(QMediaContent(),freply);
        fplayer.setVolume(40);
        fplayer.play();
    }
    else
    {
        if(freply)
        {
            fplayer.stop();

            disconnect(freply,SIGNAL(readyRead()),this,SLOT(readBytes()));
            disconnect(freply, SIGNAL(error(QNetworkReply::NetworkError)),
                    this, SLOT(slotError(QNetworkReply::NetworkError)));
            disconnect(freply,SIGNAL(finished()),this,SLOT(finished()));

            freply->deleteLater();
            freply = NULL;
        }

        if(ffile)
        {
            ffile->close();
            delete ffile;
            ffile = NULL;
        }
    }
}

Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #4 : Ноябрь 03, 2013, 23:31 »

И еще вопрос, в потоке идет в том формате, который на диске на серве или идет декодированный wav?
судя по записанному файлу я понял что шло в mp3. так как vlc сказал что это кодек мп3, битрейт 128 и т.д.
При чем в файл я не писал никакого заголовка и закрывал его при нажатии на кнопку, тем не менее vlc играет нормально. В других плеерах не пробовал, пока не ставил. Все это под ubuntu проверялось.
Записан
carrygun
Гость
« Ответ #5 : Ноябрь 04, 2013, 12:20 »

Я не знаю, но проиграть из QNetworkReply у меня не получилось. Тут возможно поток потоку рознь, и из файла играться может нормально, а вот из репли могут быть ограничения. Суть в том, что медиаплеер работает через DirectShow, а там Бог знает как все устроено. Тут либо писать свои плагины, либо использовать другие библиотеки. Возможно, репли содержит лишние заголовки, может еще что. Как вариант, попробуй читать в QBuffer, а уже оттуда в плеер, может чего и выйдет, у меня пока нет времени на это.

P.S.
Пока писал пост, краем гляза взглянул в сорцы плагина и нашел интересные строки про поток:
Код
C++ (Qt)
...
   } else if (stream && (!stream->isReadable() || stream->isSequential())) {
       m_pendingTasks = 0;
       m_graphStatus = InvalidMedia;
       m_error = QMediaPlayer::ResourceError;
   } else {
...
 
directshowplayerservice.cpp строка 239. Возможно прокатит следующее: на доступные байты из репли вешать сигнал и писать в QBuffer, а вот потом уже буффер пробовать играть, если конечно он не isSequential(). Так что если у вас есть время, попробуйте и расскажите о результатах.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #6 : Ноябрь 07, 2013, 11:40 »

Пробовал передавать звук напрямую - идет шум, я так понял нужно сначала жекодировать в wav, а позже уже его передавать а аудиовыход. Но пока не понял как это сделать.
Записан
carrygun
Гость
« Ответ #7 : Ноябрь 08, 2013, 04:24 »

Я так понимаю что QAudioInput(Output) работают со звуком в raw формате, и медиаплеер их не скушает.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #8 : Ноябрь 08, 2013, 11:03 »

Я хочу написать прогу, которая позволяла бы записывать интернет радио в несколько потоков, т.е. одновременно с нескольких радиостанций + возможность прослушивания выбранной станции.
Кое какие наработки есть, но вот пока с декодированием и воспроизведением пока туго. Записать на диск особой проблемы нет, так как данные идут уже в сжатом формате и успешно воспроизовдятся (опробовано), есть несколько загвосток с парсингом метаданных, но это реашемо. А вот с воспроизведением в реальном времени пока туго.
Записан
carrygun
Гость
« Ответ #9 : Ноябрь 08, 2013, 12:52 »

А QNetworkRelpy->QBuffer + QMediaPlayer не проканали? И если мне не изменяет память для радио же чтото было? Просто сейчас под рукой нет Qt и времени мало.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #10 : Ноябрь 08, 2013, 23:30 »

Увы не проканало.
Записан
Montegro
Гость
« Ответ #11 : Ноябрь 18, 2014, 20:21 »

Получилось у кого-нибудь проиграть аудио\видео из QBuffer? Та же проблема. Видео напрямую через m_MPlayer->setMedia(QUrl("http://192...")) получилось (там поступают сырые данные rawvideo на порт)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.085 секунд. Запросов: 23.