QtMultimedia, как я могу сохранить запись в любом формате, таком как mp3, wav или что-то еще? - PullRequest
3 голосов
/ 27 января 2011

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

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);

1 Ответ

3 голосов
/ 27 января 2011

Ну, если кому-то интересно, это алгоритм конвертации. Если у вас есть идея получше, пожалуйста, ответьте!

 #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 );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...