QtMultimedia, how can I save a recording in any format such as mp3, wav or smth else?

Well, I saw something like this in the textbook, but I wanted to save it in one of the readable formats for the music player. Is it possible?

file   = new QFile("smth.raw");
file->open(QIODevice::WriteOnly | QIODevice::Truncate );

QAudioFormat format;
format.setFrequency(8000);
format.setChannels(1);
format.setSampleSize(8);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::UnSignedInt);
QAudioDeviceInfo info = QAudioDeviceInfo::defaultInputDevice();
if (!info.isFormatSupported(format)) {
    qWarning()<<"default format not supported try to use nearest";
    format = info.nearestFormat(format);
}
audioInput = new QAudioInput(format, this);
+3
source share
1 answer

Well, if this is interesting to someone, this algorithm is for conversion. If you have a better idea, answer!

 #include <stdio.h>
 int rawToWav(const char *rawfn, const char *wavfn, long frequency)
 {
    long chunksize=0x10;

    struct
    {
        unsigned short    wFormatTag;
        unsigned short    wChannels;
        unsigned long     dwSamplesPerSec;
        unsigned long     dwAvgBytesPerSec;
        unsigned short    wBlockAlign;
        unsigned short    wBitsPerSample;
    } fmt;

    FILE *raw = fopen(rawfn,"rb");
    if(!raw)
        return -2;

    fseek(raw, 0, SEEK_END);
    long bytes = ftell(raw);
    fseek(raw, 0, SEEK_SET);

    long samplecount = bytes/2;
    long riffsize    = samplecount*2+0x24;
    long datasize    = samplecount*2;

    FILE *wav=fopen(wavfn,"wb");
    if(!wav)
    {
        fclose(raw);
        return -3;
    }

    fwrite( "RIFF",     1, 4, wav );
    fwrite( &riffsize,  4, 1, wav );
    fwrite( "WAVEfmt ", 1, 8, wav );
    fwrite( &chunksize, 4, 1, wav );

    fmt.wFormatTag = 1;      // PCM
    fmt.wChannels  = 1;      // MONO
    fmt.dwSamplesPerSec  = frequency*1;
    fmt.dwAvgBytesPerSec = frequency*1*2; // 16 bit
    fmt.wBlockAlign      = 2;
    fmt.wBitsPerSample   = 16;

    fwrite( &fmt,      sizeof(fmt), 1, wav );
    fwrite( "data",    1,           4, wav );
    fwrite( &datasize, 4,           1, wav );
    short buff[1024];
    while( !feof(raw) )
    {
          int cnt=fread(buff,2,1024,raw);
          if( cnt == 0 )
              break;
          fwrite(buff,2,cnt,wav);
    }
    fclose( raw );
    fclose( wav );
}
+3
source

Source: https://habr.com/ru/post/1788085/


All Articles