开发者

QtMultimedia, how can i save Recording in any format like mp3, wav or smth else?

Well, smth like this i was saw in tutorial, but i wanted to save in one of the readable formats for 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开发者_Go百科.isFormatSupported(format)) {
    qWarning()<<"default format not supported try to use nearest";
    format = info.nearestFormat(format);
}
audioInput = new QAudioInput(format, this);


Well, if it interesting for somebody, that's algorithm to convert. If you have the better idea, please, reply!

 #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 );
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜