日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

音视频之使用sonic.cpp实现音频倍速播放功能

發布時間:2023/11/30 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 音视频之使用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;//1.5倍速 sonicSetSpeed(tempoStream_, speed); sonicSetPitch(tempoStream_, 1.0); sonicSetRate(tempoStream_, 1.0);uint8_t** src_data; int src_linesize = 0; // 88200/2/2 // 給src_data 分配空間 創建輸入緩沖區 av_samples_alloc_array_and_samples(&src_data, // 輸出緩沖區地址&src_linesize, // 緩沖區大小2, // 通道數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); //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实现音频倍速播放功能的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。