生活随笔
收集整理的這篇文章主要介紹了
音视频之使用sonic.cpp实现音频倍速播放功能
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
sonic.cpp 是一個音頻處理庫,可以實現倍速播放。
如果單純通過修改pcm的采樣率來實現音頻倍速播放的話,就會出現聲音變調的情況。
以下是通過采集windows 虛擬聲卡獲取到的音頻數據,
我的聲卡采樣率是44100次/秒,audio_buffer_size 設置為100,這樣每次采樣的樣本數是4410次,相當于采集100ms的pcm數據。
AVFormatContext
* avFormatCxt
= NULL;
AVDictionary
* options
= NULL;
char* devicename
= const_cast<char*>("audio=Line 1 (Virtual Audio Cable)");
string devicename_utf8_str
= GbkToUtf8(devicename
);
char* devicename_utf8
= const_cast<char*>(devicename_utf8_str
.c_str());
avdevice_register_all();
AVInputFormat
* inFormat
= av_find_input_format("dshow");
av_dict_set(&options
, "audio_buffer_size", "100", 0);
int ret
= avformat_open_input(&avFormatCxt
, devicename_utf8
, inFormat
, &options
);
AVPacket av_packet
;
FILE
* out_file_ptr2
= fopen(".\\speed15x.pcm", "wb+");
sonicStream tempoStream_
;
tempoStream_
= sonicCreateStream(44100, 2);
float speed
= 1.5;
sonicSetSpeed(tempoStream_
, speed
);
sonicSetPitch(tempoStream_
, 1.0);
sonicSetRate(tempoStream_
, 1.0);uint8_t** src_data
;
int src_linesize
= 0;
av_samples_alloc_array_and_samples(&src_data
, &src_linesize
, 2, 4410, AV_SAMPLE_FMT_S16
, 0);while (av_read_frame(avFormatCxt
, &av_packet
) == 0) {memcpy((void *)src_data
[0], (void *)av_packet
.data
, av_packet
.size
);ret
= sonicWriteShortToStream(tempoStream_
, (short*)src_data
[0], 4410); int numSamples
= 4410 / speed
;int new_buffer_size
= 0;if (ret
) {new_buffer_size
= sonicReadShortFromStream(tempoStream_
, (short*)src_data
[0], numSamples
); }fwrite(src_data
[0], new_buffer_size
* 2 * 2, 1, out_file_ptr2
);av_packet_unref(&av_packet
);
}
fclose(out_file_ptr2
);
sonicDestroyStream(tempoStream_
);
if (src_data
) {av_freep(&src_data
[0]);
}
av_freep(&src_data
);
avformat_close_input(&avFormatCxt
);
總結
以上是生活随笔為你收集整理的音视频之使用sonic.cpp实现音频倍速播放功能的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。