Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.189.189.102] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте, пробую записать речевые фрагменты через микрофон с параметрами: PCM, 11025, с разрешением 16 бит на Visual C++. Но файлы сохраняются только с разрешением 8 бит(
BOOL CRecorderDlg::OnInitDialog() { CDialogEx::OnInitDialog(); ... m_MciEx.SetPara ( WAVE_FORMAT_PCM, 1, 11025, 22050, 2, 16); <---задание параметров return TRUE; } void CRecorderDlg::OnRecStart() { UpdateData (true); m_IsStored=true; m_IsSaved=false; GetDlgItem(IDC_REC_START)->EnableWindow (false); GetDlgItem(IDC_SAVE_EXIT)->EnableWindow (true); GetDlgItem(IDC_BN_STOP)->EnableWindow (true); m_MciEx.Rec (); } void CRecorderDlg::OnBnStop() { m_MciEx.Stop (); GetDlgItem(IDC_BN_STOP)->EnableWindow (false); } void CRecorderDlg::OnDestroy() { if((!m_IsSaved)&&m_IsStored) if(MessageBox("Files not be saved! Press OK to do your save or cancel to accept default saving.", NULL,MB_ICONEXCLAMATION|MB_OKCANCEL)==1) OnSaveExit(); else if(m_MciEx.Save("temp.wav")) MessageBox("File saved to LocalFolder\\temp.wav"); m_MciEx.Close(); EndDialog(true); CDialogEx::OnDestroy(); } void CRecorderDlg::OnSaveExit() { char files[]="Wave Forms (*.wav)|*.wav|"; CFileDialog FileDlg(false,NULL,NULL,OFN_HIDEREADONLY,files); if(FileDlg.DoModal()==IDOK){ m_FilePath=FileDlg.GetFileTitle()+".wav"; <--сохранение if ( m_MciEx.Save (m_FilePath)){ MessageBox ("File successfully saved!"); m_IsSaved=true; } GetDlgItem(IDC_SAVE_EXIT)->EnableWindow (false); } OnDestroy(); } Что же не так? Подскажите, пожалуйста. Большое спасибо. |
Сообщ.
#2
,
|
|
|
А что такое m_MciEx?
Мож, последний параметр должен быть = 32 (2 канала то 16 бит)? |
Сообщ.
#3
,
|
|
|
Но у меня всего один канал(
Вот код MciEx.cpp // MciEx.cpp: implementation of the CMciEx class. // #include "stdafx.h" #include "MciEx.h" #include <mmsystem.h> #pragma comment ( lib, "winmm.lib" ) #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif CMciEx::CMciEx() : m_wDeviceID ( NULL ) { memset ( m_szErrorStr, 0, sizeof(m_szErrorStr) ); } CMciEx::~CMciEx() { Close (); } MCIERROR CMciEx::MciExSendCommand( MCIDEVICEID IDDevice, UINT uMsg, DWORD fdwCommand, DWORD dwParam ) { MCIERROR mciError = ::mciSendCommand ( IDDevice, uMsg, fdwCommand, dwParam ); if ( mciError != 0 ) { memset ( m_szErrorStr, 0, sizeof(m_szErrorStr) ); mciGetErrorString ( mciError, m_szErrorStr, sizeof(m_szErrorStr) ); #ifdef _DEBUG AfxMessageBox ( m_szErrorStr ); #endif } return mciError; } BOOL CMciEx::Open(LPCTSTR lpszWaveFileName/*=NULL*/) { MCI_OPEN_PARMS OpenParms = {0}; OpenParms.lpstrDeviceType = (LPCSTR)(lpszWaveFileName?NULL:MCI_DEVTYPE_WAVEFORM_AUDIO); OpenParms.lpstrElementName = (LPCSTR)(lpszWaveFileName?lpszWaveFileName:""); // file name m_wDeviceID = NULL; if ( MciExSendCommand ( NULL, MCI_OPEN, ( lpszWaveFileName?0:(MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID) ) | MCI_WAIT | MCI_OPEN_ELEMENT, (DWORD)(LPVOID) &OpenParms ) != 0 ) return FALSE; m_wDeviceID = OpenParms.wDeviceID; return TRUE; } void CMciEx::Close() { if ( m_wDeviceID != NULL ) { MciExSendCommand ( m_wDeviceID, MCI_CLOSE, NULL, NULL ); } m_wDeviceID = NULL; } BOOL CMciEx::Play(DWORD dwFrom, DWORD dwTo) { Stop (); MCI_PLAY_PARMS PlayParms = {0}; PlayParms.dwFrom = dwFrom; PlayParms.dwTo = dwTo; if ( MciExSendCommand ( m_wDeviceID, MCI_PLAY, MCI_FROM, (DWORD)(LPVOID)&PlayParms ) != 0 ) return FALSE; return TRUE; } BOOL CMciEx::Stop() { if ( m_wDeviceID == NULL ) { AfxMessageBox("Device not found."); return FALSE; } return ( MciExSendCommand ( m_wDeviceID, MCI_STOP, NULL, NULL ) == 0 ); } BOOL CMciEx::Pause() { if ( m_wDeviceID == NULL ) return FALSE; return ( MciExSendCommand ( m_wDeviceID, MCI_PAUSE, NULL, NULL ) == 0 ); } BOOL CMciEx::Resume() { if ( m_wDeviceID == NULL ) return FALSE; return ( MciExSendCommand ( m_wDeviceID, MCI_RESUME, NULL, NULL ) == 0 ); } BOOL CMciEx::Save(CString Filename) { Stop (); MCI_SAVE_PARMS SaveParms = {0}; SaveParms.lpfilename = (LPCSTR) Filename; return ( MciExSendCommand ( m_wDeviceID, MCI_SAVE, MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID) &SaveParms) == 0 ); } LPSTR CMciEx::GetErrorStr() { return m_szErrorStr; } BOOL CMciEx::Rec () { Close (); if ( !Open () ) return FALSE; //SetPara ( WAVE_FORMAT_PCM, nChannels, 11025, 11025*nChannels, nChannels, 8 ); MCI_RECORD_PARMS RecordParms = {0}; return ( MciExSendCommand ( m_wDeviceID, MCI_RECORD, NULL, (DWORD)(LPVOID) &RecordParms) == 0 ); } BOOL CMciEx::DeviceIDValid() { return ( m_wDeviceID != NULL ); } BOOL CMciEx::SetPara ( WORD wFormatTag, // format type WORD nChannels, // channels DWORD nSamplesPerSec, // samples per second DWORD nAvgBytesPerSec, // bytes per sample WORD nBlockAlign, // block align WORD wBitsPerSample // bits per sample ) { if ( m_wDeviceID == NULL ) return FALSE; MCI_WAVE_SET_PARMS SetParms = {0}; SetParms.wFormatTag = wFormatTag; SetParms.nChannels = nChannels; SetParms.nSamplesPerSec = nSamplesPerSec; SetParms.nAvgBytesPerSec = nAvgBytesPerSec; SetParms.nBlockAlign = nBlockAlign; SetParms.wBitsPerSample = wBitsPerSample; return ( MciExSendCommand ( m_wDeviceID, MCI_SET, MCI_WAIT | MCI_WAVE_SET_FORMATTAG | MCI_WAVE_SET_CHANNELS | MCI_WAVE_SET_SAMPLESPERSEC | MCI_WAVE_SET_AVGBYTESPERSEC | MCI_WAVE_SET_BLOCKALIGN | MCI_WAVE_SET_BITSPERSAMPLE, (DWORD)(LPVOID) &SetParms ) == 0 ); } |
Сообщ.
#4
,
|
|
|
А как можно сделать разрешение 16 бит для моно сигнала? Помогите, пожалуйста.
|
Сообщ.
#5
,
|
|
|
Цитата All parameters in the MCI_WAVE_SET_PARMS struct that apply to recording wave audio should be set at the same time. If some recording parameters are set at one time and the balance of the recording parameters are set at a later time, recording will proceed at a default setting of 8-bits per sample, mono, and 11-kHz sampling. http://support.microsoft.com/kb/152180 Вольный перевод: При установке формата все параметры должны передаваться сразу, одним вызовом MCI_SET. Если параметры устанавливаются несколькими вызовами MCI_SET, запись будет выполнена в формате "по умолчанию" 8 бит 11025 Гц моно. Проверяйте вашу программу, возможно, причина в этом. //SetPara ( WAVE_FORMAT_PCM, nChannels, 11025, 11025*nChannels, nChannels, 8 ); Эту строку вы закомментировали? |
Сообщ.
#6
,
|
|
|
Prince, спасибо огромное!
Причина была именно в этой строке. Я ввела нужные параметры и все заработало SetPara(WAVE_FORMAT_PCM, 1, 11025, 22050, 2, 16); Еще раз спасибо |
Сообщ.
#7
,
|
|
|
Причина была и осталась в чём-то другом.
Заработало потому, что теперь SetPara вызывается непосредственно перед началом записи, в классе CMciEx, так что ваша программа лишена возможности "испортить" формат записи. Причина где-то в вашей программе, имхо. Но если вас такой результат устраивает, то так тому и быть. |