알쓸전컴(알아두면 쓸모있는 전자 컴퓨터)

[Qt Multimedia]Audio 구현 세부 정보 본문

QT/Qt Multimedia 공부하기

[Qt Multimedia]Audio 구현 세부 정보

백곳 2017. 9. 13. 20:14

Playing Compressed Audio


압축된 형태 여기서는 인코딩된 데이터를 재생할수 있는 API 가 제공 된다고 합니다. 


미디어 또는 오디오의 파일을 재상하는것은 쉽지 않다고 합니다. 그이유는 각각의 인코딩하는 법과 디코딩하는것을 알고리즘을 구현하는데


맨땅에 해딩으로는 어려운 면이 있습니다. 


QMediaPlayer C++ class 또는 the Audio and MediaPlayer QML types. 을사용하면 이러한 인코딩된 데이터를 사용할수 있다고 합니다.  


QMediaPlayer class 와 관련된 QML 은 비디오를 재생 할수 있습니다. 


지원되는 압축된 오디오 형식은 운영 체제 환경에 따라 달라지며 사용자가 설치할 수 있는 미디어 플러그 인에 따라 달라집니다.


로컬 파일을 실행하는 코드 예제

player = new QMediaPlayer;
// ...
player->setMedia(QUrl::fromLocalFile("/Users/me/Music/coolsong.mp3"));
player->setVolume(50);
player->play();

네트워크의 파일을 실행하는 코드 예제


player = new QMediaPlayer;

playlist = new QMediaPlaylist(player);
playlist->addMedia(QUrl("http://example.com/myfile1.mp3"));
playlist->addMedia(QUrl("http://example.com/myfile2.mp3"));
// ...
playlist->setCurrentIndex(1);
player->play();


위의 코드만을 실행은 안되지만 일단 API의 핵심 부분만 보는것입니다. 


파일로 녹음

QAudioRecorder class 로 사운드 카드로 부터 입력(마이크)를 받아 압축(인코딩) 시켜 저장할수 있습니다. 

audioRecorder = new QAudioRecorder;

QAudioEncoderSettings audioSettings;
audioSettings.setCodec("audio/amr");
audioSettings.setQuality(QMultimedia::HighQuality);

audioRecorder->setEncodingSettings(audioSettings);

audioRecorder->setOutputLocation(QUrl::fromLocalFile("test.amr"));
audioRecorder->record();


빠른 사운드 효과 


디바이스에서 직접 raw 데이터로 가져와 사운드 효과를 줄수 있다고 합니다. 

QSoundEffect class 을 이용해서 WAV format file 을 사운드 효과를 준다고 하네요 

QSoundEffect and SoundEffect 는 같은 본질이 API 클래스 에요 

음향 효과가 재생되는 소리뿐만 아니라 음향 효과도 조절할 수 있다.

Qt4.x 에서는  QSound 을 사용했지만 qt5에서는 QSoundEffect을 사용하기를 권고 합니다. 


재생 또는 녹화 중에 오디오 데이터 모니터링

 QAudioProbe 클래스는 오디오 데이터 모니터링을 지원하는데 


이런것을 프로그램하는데 도움을 주는 API 인것 같네요 



QMediaPlayer, QCamera and QAudioRecorder. 의 클래스 에서 사용하는 오디오 데이터들을 사용할수 있다고 합니다. 


audioRecorder = new QAudioRecorder;

QAudioEncoderSettings audioSettings;
audioSettings.setCodec("audio/amr");
audioSettings.setQuality(QMultimedia::HighQuality);

audioRecorder->setEncodingSettings(audioSettings);

audioRecorder->setOutputLocation(QUrl::fromLocalFile("test.amr"));

audioProbe = new QAudioProbe(this);
if (audioProbe->setSource(audioRecorder)) {
    // Probing succeeded, audioProbe->isValid() should be true.
    connect(audioProbe, SIGNAL(audioBufferProbed(QAudioBuffer)),
            this, SLOT(calculateLevel(QAudioBuffer)));
}

audioRecorder->record();
// Now audio buffers being recorded should be signaled
// by the probe, so we can do things like calculating the
// audio power level, or performing a frequency transform

Low Level Audio Playback and Recording


QAudioOutput class 와  QAudioInput class 는 low level 의 오디오 데이터를 다루는데 사용할수 있습니다. 


Push and Pull


 QIODevice class 를 통해  push and pull 로 사용할수 있는데 이 의미는 


The low level audio classes can operate in two modes - push and pull. In pull mode, the audio device is started by giving it a QIODevice. For an output device, the QAudioOutput class will pull data from the QIODevice (using QIODevice::read()) when more audio data is required. Conversely, for pull mode with QAudioInput, when audio data is available then the data will be written directly to the QIODevice.


원어가 더 이해가 편할듯 하네요 


QIODevice 를 통해 데이터를 주고 빼고 한다는 이야기를 적어 놓은것 같습니다. 


Decoding Compressed Audio to Memory


일단 메모리에서 압축을 풀수 있다고 하는기능은 보조 메모리(HDD,SSD) 장치 보다 더빨리 압축을 풀수 있다는 이야기 입니다. 


QAudioDecoder supports decoding local files or data streams from QIODevice instances.


오디오 디코더의 로컬파일을 QIODevice class 의 스트림을 를 통해서 보내 준다고 합니다. 


마침


여기서는 오디오 API 에서 어느정도의 기능까지 제공하는 지만 알아도 성공으로 보입니다. 


추후 더욱더 세밀한 사용법은 예제를 통해 익히고 새로 프로젝트를 실행 하면서 익혀야 될것 같습니다. 



Comments