2011-11-21 55 views
0

當我嘗試從實時流中捕獲音頻時,我遭受了一些波濤洶涌的音頻。 可以解釋問題的另一個基本問題是創建的Wav文件比捕獲時間長兩倍。使用ffmpeg時Ch sound的聲音

當我使用ffplay播放avs輸入文件時,音頻是完美的,所以avs可以,問題出在無論是在捕獲還是在Wav寫入。

要捕獲:

av_read_frame(pFormatCtx, &packet) 

if(packet.stream_index == mAudioStream) 
{ 
    int buff_size = sizeof(mAudioBuffer); 
    std::cout << "Buff_size " << buff_size << std::endl; 
    len = avcodec_decode_audio3(pAudioCodecCtx,(int16_t*)mAudioBuffer, &buff_size,&packet); 
    if(len < 0){ 
     qDebug("Extractor - Audio isEnd = -1;"); 
     mAudioBufferSize = 0; 
     isEnd = ERROR_; 
     return isEnd; 
    } 

    // Set packet result type 
    mFrameType = AUDIO_PKT; 
    mAudioBufferSize = buff_size; 
    //store audio synchronization informations: 
    if(packet.pts != AV_NOPTS_VALUE) { 
     mAudioPts_ = av_q2d(pFormatCtx->streams[mAudioStream]->time_base); 
     mAudioPts_ *= packet.pts; 
    } 
} 

     // store a copy of current audio frame in _frame 
     _frame.audioFrame = new decoded_frame_t::audio_frame_t(); 
     _frame.audioFrame->sampleRate = mediaInfos.audioSampleRate; 
     _frame.audioFrame->sampleSize = mediaInfos.audioSampleSize; 
     _frame.audioFrame->nbChannels = mediaInfos.audioNbChannels; 
     _frame.audioFrame->nbSamples = mAudioBufferSize/((mediaInfos.audioSampleSize/8) * mediaInfos.audioNbChannels); 
     _frame.audioFrame->buf.resize(mAudioBufferSize); 
     memcpy(&_frame.audioFrame->buf[0],mAudioBuffer,mAudioBufferSize); 

然後我存儲在一個WAV文件使用libsndfile:

SNDFILE*   fd; 
SF_INFO    sfInf; 

sfInf.frames = 0; 
sfInf.channels = p_capt->ui_nbChannels; 
sfInf.samplerate = p_capt->ui_sampleRate; 
sfInf.format = SF_FORMAT_WAV | SF_FORMAT_PCM_U8; 
sfInf.sections = 0; 
sfInf.seekable = 0; 

if (sf_format_check(&sfInf) == FALSE) 
    std::cout << "Format parameter are uncorrect ! Exit saving !" << std::endl; 
else 
{ 
    fd = sf_open(fileName.toStdString().c_str(), SFM_WRITE, &sfInf); 
    if (fd == NULL) 
    { 
     std::cout << "Unable to open the file " << fileName.toStdString() << std::endl; 
     return GRAB_ST_NOK; 
    } 

    //little trick because v_buf is a uint8_t vector 
    sf_count_t l = sf_write_short(fd, (const short *)(&(p_capt->v_buf[0])), p_capt->v_buf.size()/2); 

    if (l != p_capt->v_buf.size()/2) 
    { 
     std::cout << "sf_write didn't write the right amoung of bits " << l << " != " << p_capt->v_buf.size()/2 << std::endl; 
     ret = GRAB_ST_NOK; 
    } 
    else 
    { 
     sf_write_sync(fd); 
     sf_close(fd); 
     ret = GRAB_ST_OK; 
    } 
} 

我希望這是可以理解的。等待言論。

Kurt

+0

我注意到,如果我試圖加快wav閱讀2的聲音是高調,所以它似乎是一個空白幀添加問題。 – Kurt

回答

0

好的問題解決了。

有兩個主要問題:

  • 調整大小不要添加N元素,不只是準備進一步推等載體...
  • avcodec_decode_audio3的BUFF_SIZE以字節爲單位返回的長度,但複製在int16_t數組中,所以它可能會令人不安。