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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QProcess и консольное приложение  (Прочитано 10846 раз)
Ilya_181
Новичок

Offline Offline

Сообщений: 33


Просмотр профиля
« : Март 18, 2018, 15:39 »

Может кто-то помочь? Почему не работает? Консольная программа (sox) должна объединить два трека, через cmd вручную проверял - работает, однако написанный код не работает.
Код
C++ (Qt)
void MainWindow::on_pushButton_begin_clicked()
{
QProcess process;
QStringList strListKey;
strListKey << "track01.wav track02.wav result.wav";
 
process.start(QDir::currentPath() + "/SoX-Sound_eXchange/sox.exe", strListKey);
process.waitForFinished(-1);
}
« Последнее редактирование: Март 18, 2018, 17:11 от Ilya_181 » Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #1 : Март 19, 2018, 13:17 »

QString programm = qApp->applicationDirPath() + QString("/sox/sox.exe");
process.start("cmd", QStringList() << "/C" << programm << "track01.wav track02.wav result.wav");
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #2 : Март 22, 2018, 14:28 »

Может кто-то помочь? Почему не работает? Консольная программа (sox) должна объединить два трека, через cmd вручную проверял - работает, однако написанный код не работает.
Код
C++ (Qt)
void MainWindow::on_pushButton_begin_clicked()
{
QProcess process;
QStringList strListKey;
strListKey << "track01.wav track02.wav result.wav";
 
process.start(QDir::currentPath() + "/SoX-Sound_eXchange/sox.exe", strListKey);
process.waitForFinished(-1);
}
Мне кажется дело может быть в этом:
Код
C++ (Qt)
strListKey << "track01.wav track02.wav result.wav";
 
надо так:
Код
C++ (Qt)
strListKey << "track01.wav" << "track02.wav" << "result.wav";
 
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #3 : Март 22, 2018, 14:57 »

Код:
strListKey << "track01.wav track02.wav result.wav";

Здесь ты создаёшь ОДИН аргумент для sox. И он пытается открыть файл "track01.wav track02.wav result.wav". Выше написано как правильно.
Записан
Ilya_181
Новичок

Offline Offline

Сообщений: 33


Просмотр профиля
« Ответ #4 : Апрель 18, 2018, 18:58 »

Код
C++ (Qt)
strListKey << "track01.wav" << "track02.wav" << "result.wav";
Так тоже не работает.


Пытался сделать как ниже. Выдает ошибку.
Код
C++ (Qt)
void MainWindow::on_pushButton_clicked()
{
   QProcess process;
   QStringList strList;
 
   process.start("D://Programing//Sox//sox.exe", strList);
   process.waitForReadyRead(-1);
   QString strWrite = "track01.wav track02.wav Sometrack03.wav\n";
   process.write(strWrite.toLatin1());
   process.waitForBytesWritten();
   process.waitForReadyRead();
   qDebug() << "Text " << process.readAll() <<endl;
}
Ошибка в консоли:
QWindowsPipeWriter::write failed. (Идет закрытие канала.)
Text  "D:\\\\Programing\\\\Sox\\\\sox.exe:      SoX v14.4.2\r\n\r\nUsage summary: [gopts] [[fopts] infile]... [fopts] outfile [effect [effopt]]...\r\n\r\nSPECIAL FILENAMES (infile, outfile):\r\n-                        Pipe/redirect input/output (stdin/stdout); may need -t\r\n-d, --default-device     Use the default audio device (where available)\r\n-n, --null               Use the `null' file handler; e.g. with synth effect\r\n-p, --sox-pipe           Alias for `-t sox -'\r\n\r\nSPECIAL FILENAMES (infile only):\r\n\"|program [options] ...\" Pipe input from external program (where supported)\r\nhttp://server/file       Use the given URL as input file (where supported)\r\n\r\nGLOBAL OPTIONS (gopts) (can be specified at any point before the first effect):\r\n--buffer BYTES           Set the size of all processing buffers (default 8192)\r\n--clobber                Don't prompt to overwrite output file (default)\r\n--combine concatenate    Concatenate all input files (default for sox, rec)\r\n--combine sequence       Sequence all input files (default for play)\r\n-D, --no-dither          Don't dither automatically\r\n--dft-min NUM            Minimum size (log2) for DFT processing (default 10)\r\n--effects-file FILENAME  File containing effects and options\r\n-G, --guard              Use temporary files to guard against clipping\r\n-h, --help               Display version number and usage information\r\n--help-effect NAME       Show usage of effect NAME, or NAME=all for all\r\n--help-format NAME       Show info on format NAME, or NAME=all for all\r\n--i, --info              Behave as soxi(1)\r\n--input-buffer BYTES     Override the input buffer size (default: as --buffer)\r\n--no-clobber             Prompt to overwrite output file\r\n-m, --combine mix        Mix multiple input files (instead of concatenating)\r\n--combine mix-power      Mix to equal power (instead of concatenating)\r\n-M, --combine merge      Merge multiple input files (instead of concatenating)\r\n--multi-threaded         Enable parallel effects channels processing\r\n--norm                   Guard (see --guard) & normalise\r\n--play-rate-arg ARG      Default `rate' argument for auto-resample with `play'\r\n--plot gnuplot|octave    Generate script to plot response of filter effect\r\n-q, --no-show-progress   Run in quiet mode; opposite of -S\r\n--replay-gain track|album|off  Default: off (sox, rec), track (play)\r\n-R                       Use default random numbers (same on each run of SoX)\r\n-S, --show-progress      Display progress while processing audio data\r\n--single-threaded        Disable parallel effects channels processing\r\n--temp DIRECTORY         Specify the directory to use for temporary files\r\n-T, --combine multiply   Multiply samples of corresponding channels from all\r\n                         input files (instead of concatenating)\r\n--version                Display version number of SoX and exit\r\n-V[LEVEL]                Increment or set verbosity level (default 2); levels:\r\n                           1: failure messages\r\n                           2: warnings\r\n                           3: details of processing\r\n                           4-6: increasing levels of debug messages\r\nFORMAT OPTIONS (fopts):\r\nInput file format options need only be supplied for files that are headerless.\r\nOutput files will have the same format as the input file where possible and not\r\noverridden by any of various means including providing output format options.\r\n\r\n-v|--volume FACTOR       Input file volume adjustment factor (real number)\r\n--ignore-length          Ignore input file length given in header; read to EOF\r\n-t|--type FILETYPE       File type of audio\r\n-e|--encoding ENCODING   Set encoding (ENCODING may be one of signed-integer,\r\n                         unsigned-integer, floating-point, mu-law, a-law,\r\n                         ima-adpcm, ms-adpcm, gsm-full-rate)\r\n-b|--bits BITS           Encoded sample size in bits\r\n-N|--reverse-nibbles     Encoded nibble-order\r\n-X|--reverse-bits        Encoded bit-order\r\n--endian little|big|swap Encoded byte-order; swap means opposite to default\r\n-L/-B/-x                 Short options for the above\r\n-c|--channels CHANNELS   Number of channels of audio data; e.g. 2 = stereo\r\n-r|--rate RATE           Sample rate of audio\r\n-C|--compression FACTOR  Compression factor for output format\r\n--add-comment TEXT       Append output file comment\r\n--comment TEXT           Specify comment text for the output file\r\n--comment-file FILENAME  File containing comment text for the output file\r\n--no-glob                Don't `glob' wildcard match the following filename\r\n\r\nAUDIO FILE FORMATS: 8svx aif aifc aiff aiffc al amb amr-nb amr-wb anb au avr awb cdda cdr cvs cvsd cvu dat dvms f32 f4 f64 f8 flac fssd gsm gsrt hcom htk ima ircam la lpc lpc10 lu maud mp2 mp3 nist ogg prc raw s1 s16 s2 s24 s3 s32 s4 s8 sb sf sl sln smp snd sndr sndt sou sox sph sw txw u1 u16 u2 u24 u3 u32 u4 u8 ub ul uw vms voc vorbis vox wav wavpcm wv wve xa\r\nPLAYLIST FORMATS: m3u pls\r\nAUDIO DEVICE DRIVERS: waveaudio\r\n\r\nEFFECTS: allpass band bandpass bandreject bass bend biquad chorus channels compand contrast dcshift deemph delay dither divide+ downsample earwax echo echos equalizer fade fir firfit+ flanger gain highpass hilbert input# ladspa loudness lowpass mcompand noiseprof noisered norm oops output# overdrive pad phaser pitch rate remix repeat reverb reverse riaa silence sinc spectrogram speed splice stat stats stretch swap synth tempo treble tremolo trim upsample vad vol\r\n  * Deprecated effect    + Experimental effect    # LibSoX-only effect\r\nEFFECT OPTIONS (effopts): effect dependent; see --help-effect\r\n"

Помогите кто-то. Так и не могу понять. Через консоль все работает, а через QProcess не работает.
« Последнее редактирование: Апрель 18, 2018, 19:55 от Ilya_181 » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Апрель 18, 2018, 22:21 »

ну так выложи минимальный проект или хотя бы эту программу sox.exe

в твоем последнем коде написано точно неправильно
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Ilya_181
Новичок

Offline Offline

Сообщений: 33


Просмотр профиля
« Ответ #6 : Апрель 22, 2018, 08:18 »

Код
C++ (Qt)
#include <QMainWindow>
#include <QApplication>
#include <QProcess>
#include <qDebug>
 
// https://sourceforge.net/projects/sox/ - ссылка где скачал Sox - Sound eXchange
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   QMainWindow w;
 
       QProcess process;
       QStringList strList;
       process.start("D://FolderSox//sox-14-4-2//sox", strList);
       process.waitForReadyRead(-1);
       QString strWrite = "track01.wav track02.wav Sometrack03.wav";
       process.write(strWrite.toLatin1());
       process.waitForBytesWritten();
       process.waitForReadyRead();
       qDebug() << "Text " << process.readAll() <<endl;
 
//    QProcess process; // Так тоже не работает
//    QStringList strList;
//        strList << "track01.wav";
//        strList << "track02.wav";
//        strList << "Sometrack03.wav";
//    process.start("D://FolderSox//sox-14-4-2//sox.exe", strList);
//    qDebug() << "Text2 " << process.exitCode() <<endl;
 
   w.show();
 
   return a.exec();
}
 

Помогите пожалуйста. Через консоль пробовал все работает.
« Последнее редактирование: Апрель 22, 2018, 08:26 от Ilya_181 » Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #7 : Апрель 22, 2018, 09:17 »

Код
C++ (Qt)
#include <QMainWindow>
#include <QApplication>
#include <QProcess>
#include <qDebug>
 
// https://sourceforge.net/projects/sox/ - ссылка где скачал Sox - Sound eXchange
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   QMainWindow w;
 
       QProcess process;
       QStringList strList;
       process.start("D://FolderSox//sox-14-4-2//sox", strList);
       process.waitForReadyRead(-1);
       QString strWrite = "track01.wav track02.wav Sometrack03.wav";
       process.write(strWrite.toLatin1());
       process.waitForBytesWritten();
       process.waitForReadyRead();
       qDebug() << "Text " << process.readAll() <<endl;
 
//    QProcess process; // Так тоже не работает
//    QStringList strList;
//        strList << "track01.wav";
//        strList << "track02.wav";
//        strList << "Sometrack03.wav";
//    process.start("D://FolderSox//sox-14-4-2//sox.exe", strList);
//    qDebug() << "Text2 " << process.exitCode() <<endl;
 
   w.show();
 
   return a.exec();
}
 

Помогите пожалуйста. Через консоль пробовал все работает.
А где твои wav файлы находятся? Попробуй указать полные пути до них.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Ilya_181
Новичок

Offline Offline

Сообщений: 33


Просмотр профиля
« Ответ #8 : Апрель 23, 2018, 21:31 »

Цитировать
А где твои wav файлы находятся? Попробуй указать полные пути до них.

Код
C++ (Qt)
QString strWrite = "D://FolderSox//sox_14_4_2//track01.wav D://FolderSox//sox_14_4_2//track02.wav D://FolderSox//sox_14_4_2//Sometrack03.wav"; // Такой вариант не срабатывает
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #9 : Апрель 23, 2018, 22:52 »

Цитировать
Я уже говорил тебе,что такое безумие,а? Безумие - это точное повторение одного и того же действия. Раз за разом, в надежде на изменение.

Налицо полное непонимание того, что ты делаешь:

1) скармливаешь сразу все файлы одной строкой для QProcess::start(). Процесс sox, как я уже писал, попытается открыть файл с именем "track01.wav track02.wav Sometrack03.wav", которого естественно нет, и проваливается
2) пытаешься писать в stdin этого процесса с помощью QProcess::write(), хотя sox поддерживает режим записи через stdin совсем по-другому, через спецификацию "-" файла, о чём написано в хелпе -h. Естественно, это не работает
3) скармливаешь Qt-шные пути "D://FolderSox//sox_14_4_2//track01.wav" программе прямо в stdin, хотя она явно не в курсе что такое "//"

Предвижу вопрос типа хватит умничать, просто напиши решение. Пожалуйста, думаю смысл понятен:

Код
C++ (Qt)
int main(int argc, char *argv[])
{
   QCoreApplication app(argc, argv);
 
   QProcess process;
   QStringList strList = { "F:/chimes.wav", "F:/chord.wav", "F:/result.wav" };
   process.start("F:/sox/sox", strList);
 
   if(!process.waitForStarted()) {
       return 1;
   }
 
   if(!process.waitForFinished()) {
       return 2;
   }
 
   return 0;
}
 

Входные файлы - два виндовых wav звука на моём диске F. Выход - result.wav также на моём диске F. Это всё ещё можно сократить ещё больше через QProcess::execute().
« Последнее редактирование: Апрель 23, 2018, 22:56 от Alex Custov » Записан
Ilya_181
Новичок

Offline Offline

Сообщений: 33


Просмотр профиля
« Ответ #10 : Апрель 25, 2018, 20:58 »

Код
C++ (Qt)
int main(int argc, char *argv[])
{
   QCoreApplication app(argc, argv);
 
   QProcess process;
   QStringList strList;
   strList << "D:/track01.wav"
             << "D:/track02.wav"
             << "D:/result03.wav";
   process.start("D:/FolderSox/sox_14_4_2/sox.exe", strList);
 
   if(!process.waitForStarted()) {
       return 1;
   }
 
   if(!process.waitForFinished()) {
       return 2;
   }
 
   return 0;
}
 
Alex Custov спасибо большое. Это отлично работает. Мне жаль что вам пришлось прописывать весь код. Благодарю за терпение.
« Последнее редактирование: Апрель 25, 2018, 21:06 от Ilya_181 » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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