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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: чем можно записать аудио в файл? (НЕ С МИКРОФОНА!!!)  (Прочитано 6685 раз)
megido
Гость
« : Июнь 15, 2016, 02:59 »

значит у меня есть QMediaPlayer, и буффер с него.
нужно писать аудио в файл
кстати писать надо сначала в память а затем когда я нажму кнопку сохранять в файл и продолжить запись, теперь уже в файл.
чем это можно сделать?

пробовал писать

Код:
(char*)buffer.constData(),buffer.byteCount()

получается фигня а не Mp3
« Последнее редактирование: Июнь 15, 2016, 06:22 от megido » Записан
Tamori Nao
Гость
« Ответ #1 : Июнь 15, 2016, 09:06 »

Заголовок аудио файла должен делать сам
Записан
megido
Гость
« Ответ #2 : Июнь 15, 2016, 09:47 »

Заголовок аудио файла должен делать сам
да я уже понял, смотрел исходник декодера в wav. там ппц какой то. нет ли доки по этой теме? гугл ничего полезного не выдает. зато примеров записи в wav вагон

Записан
megido
Гость
« Ответ #3 : Июнь 15, 2016, 13:00 »

блин это мозгоеб какой то.и в гугле ниче нет.
вот думаю а что если просто скачивать файл и его подсовывать плееру. а поток данных нехрен делать в файл записать

только вот мне нужно не сразу записывать в файл а начинать как только кнопку нажму.
тоесть сначала я сохраняю поток в память (QBuffer)
а затем мне надо как то без остановок сохранить его в физический файл.
если остановить запись то запись опять должна вестись в память. ну а потом в другой файл
это можно на лету все делать?

Записан
Tamori Nao
Гость
« Ответ #4 : Июнь 15, 2016, 13:59 »

А что ты хочешь сделать? Записывать с микрофона или брать кусок файла и записывать в другой со своими параметрами?
Записан
megido
Гость
« Ответ #5 : Июнь 15, 2016, 15:56 »

А что ты хочешь сделать? Записывать с микрофона или брать кусок файла и записывать в другой со своими параметрами?
на кой мне писать с микрофона? это онлайн радио плеер
вот сейчас пытаюсь забирать данные с QNetworkReply
по сигналу readyRead, получается не очень. между кусками есть паузы.

если бы этот сигнал  посылался один раз я бы мог в цикле читать.
а пока делаю так:
Код:
void MainWindow::reply_readyRead()
{
      QByteArray line(reply->readLine());
      buf.write(line);
    }
и затем этот буфер отдаю плееру
Код:
   
    buf.seek(0);
    player->setMedia(QMediaContent(),&buf);
    player->setVolume(55);
    player->play();
    qDebug() << "audio avail" << player->isAudioAvailable(); // return false
    qDebug() << player->errorString(); // return "*/"
этот процесс у меня на кнопку законектен. нажимаю кнопку - 1 секунду играет. в файл как то получилось записать там таже хрень, играет - 1сек тишина - дальше играет.
 
Записан
megido
Гость
« Ответ #6 : Июнь 15, 2016, 17:36 »

какое же это громкое слово кроссплатформ...
вобщем запустил все это на лине. буфер плееру кормить не пришлось, он прекрасно там работает с QMediaContent(reply->url())
*хотя это выходит двойное скачивание стрима, ну да пофиг пока.


но вот с сохранением файла не все так хорошо, хотя он получше   сохраняется чем на винде.
вот такой вот файлик получается.
там пропущены семплы и заголовки, хз че так.




в файл вставляю сразу кучей
Код:
    buff.seek(0);
    QFile file("/tmp/file.mp3");
    file.open(QIODevice::WriteOnly | QFile::Truncate);
    qDebug() << buff.size();
    file.write(buff.data(),buff.size());
    file.close();

в в буфер пишу так:
Код:
buff.write(reply->readLine())
« Последнее редактирование: Июнь 15, 2016, 18:32 от megido » Записан
Tamori Nao
Гость
« Ответ #7 : Июнь 16, 2016, 10:00 »

Из QMediaResourse  достаешь все данные для заголовка. Запись заголовка нужно делать самому в Qt нет готового функционала.
Записан
megido
Гость
« Ответ #8 : Июнь 16, 2016, 20:05 »

Из QMediaResourse  достаешь все данные для заголовка. Запись заголовка нужно делать самому в Qt нет готового функционала.
это другое, я же тут файл переписываю просто
 вот смотри

Код:
import requests,io,urllib2
url="http://mp3.stream.tb-group.fm/tb.mp3?"
response = urllib2.urlopen(url)
CHUNK = 16 * 1024
with open("out_.mp3","wb") as f:
   while True:
      try:
       chunk = response.read(CHUNK)
       if not chunk: break
       f.write(chunk)
      except KeyboardInterrupt:
       f.close()
       break

отлично работает  на питоне, на QT  у меня по сути тот же код,
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #9 : Июнь 16, 2016, 21:36 »

Из QMediaResourse  достаешь все данные для заголовка. Запись заголовка нужно делать самому в Qt нет готового функционала.
это другое, я же тут файл переписываю просто
 вот смотри

Код:
import requests,io,urllib2
url="http://mp3.stream.tb-group.fm/tb.mp3?"
response = urllib2.urlopen(url)
CHUNK = 16 * 1024
with open("out_.mp3","wb") as f:
   while True:
      try:
       chunk = response.read(CHUNK)
       if not chunk: break
       f.write(chunk)
      except KeyboardInterrupt:
       f.close()
       break

отлично работает  на питоне, на QT  у меня по сути тот же код,

По сути тот же код в Qt тоже работает:
main.cpp
Код
C++ (Qt)
#include <QCoreApplication>
#include <QNetworkAccessManager>
 
#include <QFile>
#include <QDebug>
#include <QThread>
#include <QNetworkReply>
#include <QNetworkRequest>
 
class KeyboaradHandler : public QObject
{
   Q_OBJECT
public:
   Q_INVOKABLE void start() {
       if (QThread::currentThread() != thread()) {
           QMetaObject::invokeMethod(this, "start", Qt::QueuedConnection);
           return;
       }
       getchar();
       emit done();
   }
 
signals:
   void done();
};
 
class Handler : public QObject
{
   Q_OBJECT
public:
   Handler() :
       mKeyboard(new KeyboaradHandler()),
       mFile(nullptr)
   {
       connect(mKeyboard, &KeyboaradHandler::done,
               this, &Handler::onDone, Qt::QueuedConnection);
 
       QNetworkRequest req(QUrl::fromUserInput("http://mp3.stream.tb-group.fm/tb.mp3?"));
       QNetworkReply *reply = mNetworkManager.get(req);
       connect(reply, &QNetworkReply::readyRead,
               this, &Handler::onReadyRead);
   }
 
   ~Handler() {
       if (mFile) {
           mFile->close();
           delete mFile;
       }
       mKeyboard->deleteLater();
       mThread.quit();
       mThread.wait();
   }
 
   void onDone() {
       qDebug() << "finish....";
 
       qApp->quit();
   }
 
   void onReadyRead() {
       if (!mFile) {
           mFile = new QFile("test.mp3");
           if (!mFile->open(QIODevice::WriteOnly)) {
               qDebug() << "unable to open file";
               qApp->quit();
               return;
           }
       } else if (!mThread.isRunning()) {
           qDebug() << "let's go!";
           startWaitAnyKey();
       }
       QNetworkReply *r = qobject_cast<QNetworkReply*>(sender());
       mFile->write(r->readAll());
   }
 
   void startWaitAnyKey() {
       mThread.start();
       mKeyboard->moveToThread(&mThread);
       mKeyboard->start();
   }
 
 
signals:
 
 
private:
   QNetworkAccessManager mNetworkManager;
   QThread mThread;
   KeyboaradHandler *mKeyboard;
   QFile *mFile;
};
 
 
 
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
   Handler h;
 
   return a.exec();
}
 
#include "main.moc"
 
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
megido
Гость
« Ответ #10 : Июнь 17, 2016, 02:34 »

Kurles, добавил в твой код свой кусок


        } else if (!mThread.isRunning()) {
            qDebug() << "let's go!";
            startWaitAnyKey();
           QMediaPlayer* player =new QMediaPlayer(0, QMediaPlayer::StreamPlayback);
            player->setVolume(50);
            player->setMedia(QMediaContent(), &buf);
            player->play();

        }

        QNetworkReply *r = qobject_cast<QNetworkReply*>(sender());
        QByteArray qa;
        qa=r->readAll();
        mFile->write(qa);
        buf.write(qa.data(),qa.size());


плеер пару сек играет и замолкает - у плеера кончился контент
QMediaPlayer::BufferedMedia
QMediaPlayer::EndOfMedia
« Последнее редактирование: Июнь 17, 2016, 02:38 от megido » Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #11 : Июнь 17, 2016, 17:19 »

Kurles, добавил в твой код свой кусок


        } else if (!mThread.isRunning()) {
            qDebug() << "let's go!";
            startWaitAnyKey();
           QMediaPlayer* player =new QMediaPlayer(0, QMediaPlayer::StreamPlayback);
            player->setVolume(50);
            player->setMedia(QMediaContent(), &buf);
            player->play();

        }

        QNetworkReply *r = qobject_cast<QNetworkReply*>(sender());
        QByteArray qa;
        qa=r->readAll();
        mFile->write(qa);
        buf.write(qa.data(),qa.size());


плеер пару сек играет и замолкает - у плеера кончился контент
QMediaPlayer::BufferedMedia
QMediaPlayer::EndOfMedia
Тут уже не подскажу - с QMediaPlayer не сталкивался. Но вообще бы попробовал бы ffmpeg прикрутить и уже обработанный поток через QAudioOutput играл.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
megido
Гость
« Ответ #12 : Июнь 17, 2016, 19:41 »

Тут уже не подскажу - с QMediaPlayer не сталкивался. Но вообще бы попробовал бы ffmpeg прикрутить и уже обработанный поток через QAudioOutput играл.
так плеер тут не причем,тут что-то с буффером.
вот
    void onDone() {
        QFile file("all.mp3");
        file.open(QIODevice::WriteOnly |QFile::Truncate  );
        file.write(buf.data());
        file.close();

        qDebug() << "finish....";
        qApp->quit();
    }


на второй секунде проигрывание полученого файла в любом плеере слышен лаг, вот на нем плеер и останавливается.

а вообще я bass прикрутил, чтоб играть и рисовать уровни 10 строк кода хватает.
правда до сохранения  в файл еще  руки не дошли.

UPD:
  в bass.dll сохранение в файл реализовывается одной строкой кода.  теперь ясно почему этот упоротый куплеер никто не использует и вобще никому он не нужен.
« Последнее редактирование: Июнь 17, 2016, 22:05 от megido » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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