国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

音視頻八股文(11)-- ffmpeg 音頻重采樣

這篇具有很好參考價值的文章主要介紹了音視頻八股文(11)-- ffmpeg 音頻重采樣。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1重采樣

1.1 什么是重采樣

所謂的重采樣,就是改變?頻的采樣率、sample format、聲道數(shù)等參數(shù),使之按照我們期望的參數(shù)輸出。

1.2 為什么要重采樣

為什么要重采樣?當然是原有的?頻參數(shù)不滿?我們的需求,?如在FFmpeg解碼?頻的時候,不同的?源有不同的格式,采樣率等,在解碼后的數(shù)據(jù)中的這些參數(shù)也會不?致(最新FFmpeg 解碼?頻后,?頻格
式為AV_SAMPLE_FMT_FLTP,這個參數(shù)應該是?致的),如果我們接下來需要使?解碼后的?頻數(shù)據(jù)做其他操作,?這些參數(shù)的不?致導致會有很多額外?作,此時直接對其進?重采樣,獲取我們制定的?頻參數(shù),這樣就會?便很多。

再?如在將?頻進?SDL播放時候,因為當前的SDL2.0不?持planar格式,也不?持浮點型的,?最新的FFMPEG 16年會將?頻解碼為AV_SAMPLE_FMT_FLTP格式,因此此時就需要我們對其重采樣,使之可以在SDL2.0上進?播放。

2 對應參數(shù)解析

2.1 采樣率

采樣設備每秒抽取樣本的次數(shù)

2.2采樣格式及量化精度(位寬)

每種?頻格式有不同的量化精度(位寬),位數(shù)越多,表示值就越精確,聲?表現(xiàn)?然就越精準。FFMpeg中?頻格式有以下?種,每種格式有其占?的字節(jié)數(shù)信息(libavutil/samplefmt.h):

enum AVSampleFormat {
    AV_SAMPLE_FMT_NONE = -1,
    AV_SAMPLE_FMT_U8, ///< unsigned 8 bits
    AV_SAMPLE_FMT_S16, ///< signed 16 bits
    AV_SAMPLE_FMT_S32, ///< signed 32 bits
    AV_SAMPLE_FMT_FLT, ///< float
    AV_SAMPLE_FMT_DBL, ///< double
    AV_SAMPLE_FMT_U8P, ///< unsigned 8 bits, planar
    AV_SAMPLE_FMT_S16P, ///< signed 16 bits, planar
    AV_SAMPLE_FMT_S32P, ///< signed 32 bits, planar
    AV_SAMPLE_FMT_FLTP, ///< float, planar
    AV_SAMPLE_FMT_DBLP, ///< double, planar
    AV_SAMPLE_FMT_S64, ///< signed 64 bits
    AV_SAMPLE_FMT_S64P, ///< signed 64 bits, planar
    AV_SAMPLE_FMT_NB ///< Number of sample formats. DO NOT USE if linking dynamically
};

2.3 分?(plane)和打包(packed)

以雙聲道為例,帶P(plane)的數(shù)據(jù)格式在存儲時,其左聲道和右聲道的數(shù)據(jù)是分開存儲的,左聲道的數(shù)據(jù)存儲在data[0],右聲道的數(shù)據(jù)存儲在data[1],每個聲道的所占?的字節(jié)數(shù)為linesize[0]和linesize[1];

不帶P(packed)的?頻數(shù)據(jù)在存儲時,是按照LRLRLR...的格式交替存儲在data[0]中,linesize[0]表示總的數(shù)據(jù)量。

2.4 聲道分布(channel_layout)

聲道分布在FFmpeg\libavutil\channel_layout.h中有定義,?般來說?的?較多的是AV_CH_LAYOUT_STEREO(雙聲道)和AV_CH_LAYOUT_SURROUND(三聲道),這兩者的定義如下:

#define AV_CH_LAYOUT_STEREO (AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT)
#define AV_CH_LAYOUT_SURROUND (AV_CH_LAYOUT_STEREO | AV_CH_FRONT_CENTER)

2.5 ?頻幀的數(shù)據(jù)量計算

?幀?頻的數(shù)據(jù)量(字節(jié))=channel數(shù) * nb_samples樣本數(shù) * 每個樣本占?的字節(jié)數(shù)

如果該?頻幀是FLTP格式的PCM數(shù)據(jù),包含1024個樣本,雙聲道,那么該?頻幀包含的?頻數(shù)據(jù)量是210244=8192字節(jié)。

AV_SAMPLE_FMT_DBL : 210248 = 16384

2.6 ?頻播放時間計算

以采樣率44100Hz來計算,每秒44100個sample,?正常?幀為1024個sample,可知每幀播放時間/1024=1000ms/44100,得到每幀播放時間=1024*1000/44100=23.2ms (更精確的是23.21995464852608)。

?幀播放時間(毫秒) = nb_samples樣本數(shù) *1000/采樣率 =

(1)1024*1000/44100=23.21995464852608ms ->約等于 23.2ms,精度損失了0.011995464852608ms,如果累計10萬幀,誤差>1199毫秒,如果有視頻?起的就會有?視頻同步的問題。 如果按著23.2去計算pts(0 23.2 46.4 )就會有累積誤差。

(2)1024*1000/48000=21.33333333333333ms

3 FFmpeg重采樣API

分配?頻重采樣的上下?

struct SwrContext *swr_alloc(void);

當設置好相關的參數(shù)后,使?此函數(shù)來初始化SwrContext結構體

int swr_init(struct SwrContext *s);

分配SwrContext并設置/重置常?的參數(shù)。

struct SwrContext* swr_alloc_set_opts(struct SwrContext* s, // ?頻重采樣上下?
    int64_t out_ch_layout, // 輸出的layout, 如:5.1聲道
    enum AVSampleFormat out_sample_fmt, // 輸出的采樣格式。Float, S16,?般選?是s16 絕?部分聲卡?持
    int out_sample_rate, //輸出采樣率
    int64_t in_ch_layout, // 輸?的layout
    enum AVSampleFormat in_sample_fmt, // 輸?的采樣格式
    int in_sample_rate, // 輸?的采樣率
    int log_offset, // ?志相關,不?管先,直接為0
    void* log_ctx // ?志相關,不?管先,直接為NULL
);

將輸?的?頻按照定義的參數(shù)進?轉換并輸出

int swr_convert(struct SwrContext* s, // ?頻重采樣的上下?
    uint8_t** out, // 輸出的指針。傳遞的輸出的數(shù)組
    int out_count, //輸出的樣本數(shù)量,不是字節(jié)數(shù)。單通道的樣本數(shù)量。
    const uint8_t** in, //輸?的數(shù)組,AVFrame解碼出來的DATA
    int in_count // 輸?的單通道的樣本數(shù)量。
);

in和in_count可以設置為0,以最后刷新最后?個樣本。

釋放掉SwrContext結構體并將此結構體置為NULL;

void swr_free(struct SwrContext **s);

?頻重采樣,采樣格式轉換和混合庫。與lswr的交互是通過SwrContext完成的,SwrContext被分配給swr_alloc()或
swr_alloc_set_opts()。 它是不透明的,所以所有參數(shù)必須使?AVOptions API設置。為了使?lswr,你需要做的第?件事就是分配SwrContext。 這可以使?swr_alloc()或 swr_alloc_set_opts()來完成。 如果您使?前者,則必須通過AVOptions API設置選項。 后?個函數(shù)提供了相同的功能,但它允許您在同?語句中設置?些常?選項。

例如,以下代碼將設置從平?浮動樣本格式到交織的帶符號16位整數(shù)的轉換,從48kHz到44.1kHz的下采
樣,以及從5.1聲道到?體聲的下混合(使?默認混合矩陣)。 這是使?swr_alloc()函數(shù)。

SwrContext * swr = swr_alloc();
av_opt_set_channel_layout(swr, "in_channel_layout", AV_CH_LAYOUT_5POINT1, 0);
av_opt_set_channel_layout(swr, "out_channel_layout", AV_CH_LAYOUT_STEREO, 0);
av_opt_set_int(swr, "in_sample_rate", 48000, 0);
av_opt_set_int(swr, "out_sample_rate", 44100, 0);
av_opt_set_sample_fmt(swr, "in_sample_fmt", AV_SAMPLE_FMT_FLTP, 0);
av_opt_set_sample_fmt(swr, "out_sample_fmt", AV_SAMPLE_FMT_S16, 0);

同樣的?作也可以使?swr_alloc_set_opts():

SwrContext * swr = swr_alloc_set_opts(NULL, // we're allocating a new context
    AV_CH_LAYOUT_STEREO, // out_ch_layout
    AV_SAMPLE_FMT_S16, // out_sample_fmt
    44100, // out_sample_rate
    AV_CH_LAYOUT_5POINT1, // in_ch_layout
    AV_SAMPLE_FMT_FLTP, // in_sample_fmt
    48000, // in_sample_rate
    0, // log_offset
    NULL); // log_ctx

?旦設置了所有值,它必須?swr_init()初始化。 如果需要更改轉換參數(shù),可以使?AVOptions來更改參數(shù),如上?第?個例?所述; 或者使?swr_alloc_set_opts(),但是第?個參數(shù)是分配的上下?。 您必須再次調?swr_init()。?旦設置了所有值,它必須?swr_init()初始化。 如果需要更改轉換參數(shù),可以使?AVOptions來更改參數(shù),如上?第?個例?所述; 或者使?swr_alloc_set_opts(),但是第?個參數(shù)是分配的上下?。 您必須再次調?swr_init()。
轉換本身通過重復調?swr_convert()來完成。 請注意,如果提供的輸出空間不?或采樣率轉換完成后,樣本可能會在swr中緩沖,這需要“未來”樣本。 可以隨時通過使?swr_convert()(in_count可以設置為0)來檢索不需要將來輸?的樣本。 在轉換結束時,可以通過調?具有NULL in和in incount的swr_convert()來刷新重采樣緩沖區(qū)。

4 go代碼

見 moonfdd/ffmpeg-go

音視頻八股文(11)-- ffmpeg 音頻重采樣文章來源地址http://www.zghlxwxcb.cn/news/detail-439398.html

到了這里,關于音視頻八股文(11)-- ffmpeg 音頻重采樣的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 音視頻八股文(7)-- 音頻aac adts三層結構

    音視頻八股文(7)-- 音頻aac adts三層結構

    AAC(Advanced Audio Coding)是一種現(xiàn)代的音頻編碼技術,用于數(shù)字音頻的傳輸和存儲領域。AAC是MPEG-2和MPEG-4標準中的一部分,可提供更高質量的音頻數(shù)據(jù),并且相比于MP3等舊有音頻格式,AAC需要更少的比特率。 AAC通過使用一些高級的音頻編碼算法來實現(xiàn)更好的聲音質量和更低的壓

    2024年02月06日
    瀏覽(21)
  • 音視頻八股文(10)-- mp4結構

    音視頻八股文(10)-- mp4結構

    mp4?件格式?被稱為MPEG-4 Part 14,出?MPEG-4標準第14部分 。它是?種多媒體格式容器,?泛?于包裝視頻和?頻數(shù)據(jù)流、海報、字幕和元數(shù)據(jù)等。(順便?提,?前流?的視頻編碼格式AVC/H264 定義在MPEG-4 Part 10)。 mp4?件由box組成,每個box分為Header和Data。其中Header部分包含了

    2024年02月02日
    瀏覽(34)
  • 什么叫面試八股文,一篇文章帶你入門音視頻(1),使用指南

    什么叫面試八股文,一篇文章帶你入門音視頻(1),使用指南

    版稅方式:按個收取 備注:WMA的全稱是Windows Media Audio,它是微軟公司推出的與MP3格式齊名的一種新的音頻格式。由于WMA在壓縮比和音質方面都超過了MP3,更是遠勝于RA(Real Audio),即使在較低的采樣頻率下也能產(chǎn)生較好的音質,再加上WMA有微軟的Windows Media Player做其強大的后盾

    2024年04月25日
    瀏覽(97)
  • 音視頻八股文(9)-- flv的h264六層結構和aac六層結構

    音視頻八股文(9)-- flv的h264六層結構和aac六層結構

    FLV(Flash Video)是Adobe公司推出的?種流媒體格式,由于其封裝后的?視頻?件體積?、封裝簡單等特點,?常適合于互聯(lián)?上使?。?前主流的視頻?站基本都?持FLV。采?FLV格式封裝的?件后綴為.flv。 FLV封裝格式是由?個?件頭(file header)和 ?件體(file Body)組成。其中,F(xiàn)LV

    2024年02月01日
    瀏覽(28)
  • 【FFmpeg】音視頻錄制 ① ( 查詢系統(tǒng)中 ffmpeg 可錄制的音視頻輸入設備 | 使用 ffmpeg 命令錄制音視頻數(shù)據(jù) | 錄制視頻數(shù)據(jù)命令 |錄制音頻數(shù)據(jù)| 同時錄制音頻和視頻數(shù)據(jù)命令 )

    【FFmpeg】音視頻錄制 ① ( 查詢系統(tǒng)中 ffmpeg 可錄制的音視頻輸入設備 | 使用 ffmpeg 命令錄制音視頻數(shù)據(jù) | 錄制視頻數(shù)據(jù)命令 |錄制音頻數(shù)據(jù)| 同時錄制音頻和視頻數(shù)據(jù)命令 )

    在 Windows 系統(tǒng)中 , 使用 ffmpeg 命令 錄制 音視頻 , 需要先獲取 系統(tǒng)的 音視頻設備 信息 , 錄制 音視頻 本質上是從 系統(tǒng)音視頻設備 中獲取數(shù)據(jù) ; 執(zhí)行 命令 , 可以獲取 系統(tǒng)中 ffmpeg 可用的 DirectShow 音視頻輸入設備 ; 命令參數(shù)解析 : -list_devices true : 列出所有 ffmpeg 的 指定類型的可

    2024年04月25日
    瀏覽(31)
  • qt+ffmpeg 實現(xiàn)音視頻播放(二)之音頻播放

    qt+ffmpeg 實現(xiàn)音視頻播放(二)之音頻播放

    通過? avformat_open_input ()?打開媒體文件并分配和初始化? AVFormatContext?? 結構體。 函數(shù)原型如下: int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options); 參數(shù)說明: - `ps`:指向 `AVFormatContext` 結構體指針的指針,用于存儲打開的媒體文件的信息。

    2024年04月22日
    瀏覽(38)
  • 音視頻剪輯|FFMPEG|windows10下的音視頻格式轉換,遮擋填充,GIF動圖制作,背景音頻抽取,替換

    音視頻剪輯|FFMPEG|windows10下的音視頻格式轉換,遮擋填充,GIF動圖制作,背景音頻抽取,替換

    最近對于音視頻和圖像的處理問題比較感興趣,但發(fā)現(xiàn)很多目前需要的功能要么需要付費但不會過于麻煩,要么比較麻煩,很可能某個功能實現(xiàn)需要安裝很多軟件 例如,視頻轉GIF動圖,該功能的實現(xiàn)要么使用Photoshop全家桶,要么找在線網(wǎng)站,或者是wps充會員,或者找其它方法

    2024年02月20日
    瀏覽(26)
  • 【FFmpeg】ffmpeg 命令行參數(shù) ⑧ ( 使用 ffmpeg 轉換封裝格式 | 音視頻編解碼器參數(shù)設置 | 視頻 幀率 / 碼率 / 分辨率 設置 | 音頻 碼率 / 采樣率 設置 )

    【FFmpeg】ffmpeg 命令行參數(shù) ⑧ ( 使用 ffmpeg 轉換封裝格式 | 音視頻編解碼器參數(shù)設置 | 視頻 幀率 / 碼率 / 分辨率 設置 | 音頻 碼率 / 采樣率 設置 )

    音視頻 文件 從 采樣 - 處理 - 得到原始數(shù)據(jù)幀隊列 - 音視頻編碼 - 音視頻包隊列 - 格式封裝 的過程如下 : 封裝格式 參考 【音視頻原理】音視頻 “ 采樣 - 編碼 - 封裝 過程 “ 和 “ 解封裝 - 解碼 - 播放 過程 “ 分析 ( 視頻采集處理流程 | 音頻采集處理流程 | 音視頻文件解封裝

    2024年04月17日
    瀏覽(101)
  • ffmpeg@音視頻工具@音視頻合并

    FFmpeg中文網(wǎng) (github.net.cn) FFmpeg 是一款強大的開源跨平臺音視頻處理工具集,它包含了一系列命令行工具以及用于音頻和視頻編碼解碼、格式轉換、抓取、流化等功能的庫。FFmpeg 支持多種視頻、音頻格式和編解碼器,能夠進行音視頻的壓縮、封裝、轉碼、分割、合并、過濾、抓

    2024年03月17日
    瀏覽(29)
  • 音視頻 FFmpeg音視頻處理流程

    音視頻 FFmpeg音視頻處理流程

    推薦一個零聲學院項目課,個人覺得老師講得不錯,分享給大家: 零聲白金學習卡(含基礎架構/高性能存儲/golang云原生/音視頻/Linux內核) https://xxetb.xet.tech/s/VsFMs

    2024年02月12日
    瀏覽(97)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包