2015-09-10 14 views
5

Vì mục đích của tôi, tôi muốn ghi lại âm thanh ở định dạng thô (chỉ mẫu), 8kHz, 16 bit (ít cuối) và 1 kênh. Sau đó, tôi muốn chuyển những mẫu đó đến cửa sổ và chơi nó với QAudioOutput. Vì vậy, tôi có hai chương trình riêng biệt: một cho ghi âm giọng nói với QAudioInput, và một cho một tập tin được chứa một số mẫu, sau đó tôi chơi nó với QAudioOutput. Dưới đây là mã nguồn của tôi để tạo QAudioInput và QAudioOutput.Ghi lại bằng linux với QAudioInput và phát trong cửa sổ

//Initialize audio 
void AudioBuffer::initializeAudio() 
{ 
    m_format.setFrequency(8000); //set frequency to 8000 
    m_format.setChannels(1); //set channels to mono 
    m_format.setSampleSize(16); //set sample sze to 16 bit 
    m_format.setSampleType(QAudioFormat::UnSignedInt); //Sample type as usigned integer sample 
    m_format.setByteOrder(QAudioFormat::LittleEndian); //Byte order 
    m_format.setCodec("audio/pcm"); //set codec as simple audio/pcm 

    QAudioDeviceInfo infoIn(QAudioDeviceInfo::defaultInputDevice()); 
    if (!infoIn.isFormatSupported(m_format)) 
    { 
     //Default format not supported - trying to use nearest 
     m_format = infoIn.nearestFormat(m_format); 
    } 

    QAudioDeviceInfo infoOut(QAudioDeviceInfo::defaultOutputDevice()); 

    if (!infoOut.isFormatSupported(m_format)) 
    { 
    //Default format not supported - trying to use nearest 
    m_format = infoOut.nearestFormat(m_format); 
    } 
    createAudioInput(); 
    createAudioOutput(); 
} 

void AudioBuffer::createAudioOutput() 
{ 
    m_audioOutput = new QAudioOutput(m_Outputdevice, m_format, this); 
} 

void AudioBuffer::createAudioInput() 
{ 
    if (m_input != 0) { 
    disconnect(m_input, 0, this, 0); 
    m_input = 0; 
    } 

    m_audioInput = new QAudioInput(m_Inputdevice, m_format, this); 

} 

Các chương trình này hoạt động tốt trong cửa sổ và Linux riêng biệt. Tuy nhiên, nó có rất nhiều tiếng ồn khi tôi ghi lại một giọng nói trong Linux và chơi nó trong cửa sổ.

Tôi tìm ra các mẫu đã chụp trong cửa sổ và Linux khác nhau. Hình ảnh đầu tiên liên quan đến âm thanh bị bắt trong Linux và thứ hai cho cửa sổ.

chụp âm thanh trong Linux: captured sound in Linux

chụp âm thanh trong Windows: captured sound in Windows

hơn Một chút về chi tiết là sự im lặng trong Windows và Linux là khác nhau. Tôi đã thử nhiều thứ bao gồm trao đổi byte, mặc dù tôi đặt chút ít về cuối trong cả hai nền tảng.

Bây giờ, tôi nghi ngờ về cấu hình alsa. Có bất kỳ cài đặt bị nhỡ nào không?

Bạn có nghĩ rằng sẽ tốt hơn nếu tôi ghi âm giọng nói trực tiếp mà không cần sử dụng QAudioInput?

+0

bạn có thể kiểm tra xem 'isFormatSupported' có đúng trong cả hai trường hợp không? – UmNyobe

+0

Cả đầu vào và đầu ra đều đúng! – Ari

+0

Xóa cả hai dòng để tính toán mã 'nearFormat' và đặt' abort() 'ở đó thay vào đó, sau đó ghi lại tệp mới trên linux, di chuyển tệp qua cửa sổ và thử lại ở đó. Đảm bảo bạn sử dụng các bản dựng mới trên cả hai, với thay đổi được áp dụng và bạn đang phát tệp mới được chuyển được chuyển từ máy linux. –

Trả lời

3

Giọng nói là UnSignedInt, nhưng giá trị mẫu có cả giá trị âm và dương! Có vẻ như bạn gặp khó khăn khi chụp. Thay đổi QAudioFormat::UnSignedInt thành QAudioFormat::SignedInt.

Các vấn đề liên quan