最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言使用ffmpeg和sdl實現(xiàn)多路音頻播放

 更新時間:2023年06月07日 08:39:24   作者:CodeOfCC  
這篇文章主要為大家詳細(xì)介紹了一種基于ffmpeg和sdl實現(xiàn)的音頻多路混合的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下

前言

音頻的播放通常是單例的,在進(jìn)程內(nèi)通常一個播放設(shè)備只能打開一次,且只支持一個寫入。寫播放器的時候,會遇到需要實現(xiàn)多開同時播放多個視頻,比如視頻剪輯工具的多軌道播放。這個時候就需要采用一定的方法,比如音頻混合。本文將提供一種基于ffmpeg和sdl實現(xiàn)的音頻多路混合的方法。

一、 如何實現(xiàn)

1、回調(diào)式打開設(shè)備

為實現(xiàn)多路共用一個播放設(shè)備,只能采用SDL的回調(diào)式打開音頻設(shè)備。

回調(diào)方法

static std::map<void*, std::function<void(void* userdata, Uint8* stream, int len)>> _audioCallbacks;//記錄每一路音頻的回調(diào)方法
//總的回調(diào)方法
static void _audio_callback_sum(void* userdata, uint8_t* stream, int len)
{
    memset(stream, 0, len);
    std::unique_lock< std::mutex >lck(_mtx);
    //調(diào)用每一路的回調(diào)方法
    for (auto i : _audioCallbacks)
    {
        i.second(userdata, stream, len);
    }
}

打開音頻

static SDL_AudioSpec _wanted_spec, _spec;
_wanted_spec.channels = 2;
_wanted_spec.freq = 44100;
_wanted_spec.format = AUDIO_F32SYS;
_wanted_spec.silence = 0;
_wanted_spec.samples = 1024;
_wanted_spec.callback = _audio_callback_sum;
 SDL_OpenAudio(&_wanted_spec, &_spec) == 0;

2、注冊多路回調(diào)

注冊一路音頻回調(diào)示例如下

_audioCallbacks[pFrame] = [&](void* userdata, Uint8* stream, int len) {
    //此處實現(xiàn)單獨一路的播放邏輯
};

3、寫入隊列

每一路音頻都創(chuàng)建一個音頻隊列,將解碼的音頻數(shù)據(jù)寫入隊列,下面是使用AVAudioFifo作為音頻隊列的例子。

if (av_audio_fifo_space(fifo) >= samples)
{
    av_audio_fifo_write(fifo, (void**)&data, (int)samples);
    break;
}

4、混合音頻

在音頻單獨的回調(diào)中即上面_audioCallbacks注冊的方法中,進(jìn)行數(shù)據(jù)混合,示例如下。

//讀取音頻隊列數(shù)據(jù) 
int read = av_audio_fifo_read(fifo, (void**)&data, _spec.samples);
//開始混合
SDL_MixAudioFormat(stream, data, _spec.format, newLen, SDL_MIX_MAXVOLUME);

二、完整代碼

1、頭文件

simple_audio_play.h

#pragma once
/// <summary>
/// 播放音頻
/// 此方法同步阻塞,播放完成后返回
/// 支持多路播放,可放在線程中播放,線程安全。
/// </summary>
/// <param name="input">輸入url</param>
/// <param name="exitFlag">中斷標(biāo)記</param>
/// <returns></returns>
int simple_audio_play(const char* input, int* exitFlag)

三、使用示例

1、播放音頻

int exitflag= false;    
simple_audio_play("D:\\test_music.wav", &exitflag);

2、多路播放音頻

#include"simple_audio_play.h"
void main() {
    int exitflag = false;
    auto t1 = new std::thread([&]() {
        while (!exitflag) {
            simple_audio_play("D:\\test_music.wav", &exitflag);
        }
        });
    auto t2 = new std::thread([&]() {
        while (!exitflag) {
            simple_audio_play("D:\\test.mp4", &exitflag);
        }
        });
    system("pause");
    exitflag = true;
    t1->join();
    t2->join();
}

總結(jié)

以上就是今天要的內(nèi)容了,采用ffmpeg結(jié)合sdl實現(xiàn)音頻多路播放還是比較容易的,都有相關(guān)的接口去調(diào)用,只要設(shè)計實現(xiàn)整體的上層邏輯即可。但是一開始基本沒有頭緒,通過一番嘗試后找到關(guān)鍵方法SDL_MixAudioFormat后,實現(xiàn)起來還是很簡單的,這個是實踐才能得到的知識。

到此這篇關(guān)于C語言使用ffmpeg和sdl實現(xiàn)多路音頻播放的文章就介紹到這了,更多相關(guān)C語言多路音頻播放內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言全面細(xì)致精講關(guān)鍵字的使用

    C語言全面細(xì)致精講關(guān)鍵字的使用

    關(guān)鍵字是C語言非常重要的一部分,熟練的掌握和使用關(guān)鍵字有助于我們更加熟悉了解C語言,同時C語言的關(guān)鍵字也是面試筆試中??嫉膬?nèi)容。C語言的關(guān)鍵字共有32個,但并不是每個關(guān)鍵字都有坑,本篇文章將通過理論聯(lián)系實際的方式為大家講解C語言中易混易錯以及常考的一些關(guān)鍵字
    2022-05-05
  • 一篇文章帶你了解C++中的顯示轉(zhuǎn)換

    一篇文章帶你了解C++中的顯示轉(zhuǎn)換

    這篇文章主要介紹了C++11顯示類型轉(zhuǎn)換的優(yōu)點,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下,希望能給你帶來幫助
    2021-08-08
  • GetChar緩存機(jī)制深入剖析

    GetChar緩存機(jī)制深入剖析

    以下是對GetChar緩存機(jī)制進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下
    2013-09-09
  • C++實現(xiàn)LeetCode(125.驗證回文字符串)

    C++實現(xiàn)LeetCode(125.驗證回文字符串)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(驗證回文字符串).本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言排序方法(冒泡,選擇,插入,歸并,快速)

    C語言排序方法(冒泡,選擇,插入,歸并,快速)

    這篇文章給大家分享C語言所有經(jīng)典排序方法,文章給大家提供完整的實例代碼幫助大家快速學(xué)習(xí)掌握C語言排序方法,感興趣的朋友一起看看吧
    2021-08-08
  • C語言實現(xiàn)哈希搜索算法及原理詳解

    C語言實現(xiàn)哈希搜索算法及原理詳解

    本文主要介紹了C語言實現(xiàn)哈希搜索算法及原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • C++11 智能指針的具體使用

    C++11 智能指針的具體使用

    本文主要介紹了C++11 智能指針的具體使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C語言利用數(shù)組和文件實現(xiàn)登錄注冊功能

    C語言利用數(shù)組和文件實現(xiàn)登錄注冊功能

    這篇文章主要為大家詳細(xì)介紹了C語言利用數(shù)組和文件實現(xiàn)登錄注冊功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 基于atoi()與itoa()函數(shù)的內(nèi)部實現(xiàn)方法詳解

    基于atoi()與itoa()函數(shù)的內(nèi)部實現(xiàn)方法詳解

    本篇文章是對atoi()與itoa()函數(shù)的內(nèi)部實現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++隨機(jī)生成迷宮算法

    C++隨機(jī)生成迷宮算法

    這篇文章主要為大家詳細(xì)介紹了C++隨機(jī)生成迷宮算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03

最新評論

尖扎县| 博客| 开封市| 垫江县| 六盘水市| 乌拉特后旗| 朝阳市| 手游| 菏泽市| 藁城市| 鄂尔多斯市| 犍为县| 咸丰县| 东兰县| 乌审旗| 蒙城县| 遵化市| 商河县| 阿坝县| 大埔区| 太谷县| 诸暨市| 玛曲县| 清镇市| 隆尧县| 卓尼县| 万州区| 中山市| 名山县| 瑞金市| 灵武市| 南平市| 邻水| 镇赉县| 吉安县| 宁海县| 从江县| 景泰县| 朝阳区| 全椒县| 崇礼县|