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

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

這篇具有很好參考價(jià)值的文章主要介紹了qt+ffmpeg 實(shí)現(xiàn)音視頻播放(二)之音頻播放。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、音頻播放流程

1、打開音頻文件

通過? avformat_open_input()?打開媒體文件并分配和初始化? AVFormatContext??結(jié)構(gòu)體。

函數(shù)原型如下:
int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options);

參數(shù)說明:
- `ps`:指向 `AVFormatContext` 結(jié)構(gòu)體指針的指針,用于存儲(chǔ)打開的媒體文件的信息。
- `url`:要打開的媒體文件的 URL 或文件路徑。
- `fmt`:指定輸入格式,通??梢栽O(shè)置為 `NULL`,由 FFmpeg 根據(jù)文件內(nèi)容自動(dòng)檢測(cè)。
- `options`:附加選項(xiàng),可以傳入一些額外的選項(xiàng)參數(shù)。

2、查找輸入流信息

調(diào)用 ?avformat_find_stream_info() ?函數(shù)將會(huì)讀取媒體文件中的幀,解析它們的頭部,
并填充 AVFormatContext 中的流信息,通過訪問 AVFormatContext 的 streams 字段來獲取每個(gè)流的詳細(xì)信息。

函數(shù)原型如下:
int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);

參數(shù)說明:
- `ic`:指向已打開媒體文件的 `AVFormatContext` 結(jié)構(gòu)體的指針。
- `options`:指向包含附加選項(xiàng)的 `AVDictionary` 指針。

3、查找流索引

使用 av_find_best_stream() 從媒體文件中找到最佳的流索引

函數(shù)原型如下:
int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type, int wanted_stream, int related_stream, AVCodec **decoder_ret, int flags);

參數(shù)說明:
- `ic`:指向已打開媒體文件的 `AVFormatContext` 結(jié)構(gòu)體的指針。
- `type`:要查找的流類型,可以是 `AVMEDIA_TYPE_VIDEO`、`AVMEDIA_TYPE_AUDIO` 等。
- `wanted_stream`:期望的流索引,如果為負(fù)值,則表示沒有特定的偏好。
- `related_stream`:相關(guān)流索引,用于查找與之相關(guān)的最佳流。
- `decoder_ret`:用于返回找到的解碼器。
- `flags`:附加標(biāo)志,可以用來指定額外的查找選項(xiàng)。

4、查找解碼器

使用 avcodec_find_decoder() 查找符合指定解碼器名稱的解碼器。

函數(shù)原型如下:
AVCodec *avcodec_find_decoder(enum AVCodecID id);

參數(shù)說明:
- `id`:要查找的解碼器的 ID。

5、初始化解碼上下文

調(diào)用? avcodec_alloc_context3()??函數(shù)會(huì)為特定的編解碼器分配一個(gè)? AVCodecContext??結(jié)構(gòu)體,并對(duì)其進(jìn)行初始化。 AVCodecContext??結(jié)構(gòu)體包含了編解碼器的相關(guān)參數(shù)和狀態(tài)信息,比如編解碼器類型、解碼參數(shù)、幀率等。

函數(shù)原型如下:
AVCodecContext *avcodec_alloc_context3(const AVCodec *codec);
參數(shù)說明:
- `codec`:指定要使用的編解碼器,可以通過 `avcodec_find_decoder()` 或其他方式獲取。

6、獲取解碼參數(shù)

調(diào)用 `avcodec_parameters_to_context()` 函數(shù)可以方便地將 `AVCodecParameters` 結(jié)構(gòu)體中的參數(shù)(如編解碼器類型、幀率、分辨率等)復(fù)制到 `AVCodecContext` 結(jié)構(gòu)體中,從而準(zhǔn)備進(jìn)行編解碼操作。

函數(shù)原型如下:
int avcodec_parameters_to_context(AVCodecContext *codec, const AVCodecParameters *par);

參數(shù)說明:
- `codec`:要填充參數(shù)的 `AVCodecContext` 結(jié)構(gòu)體指針。
- `par`:包含編解碼器參數(shù)的 `AVCodecParameters` 結(jié)構(gòu)體指針。

7、打開解碼器

調(diào)用 `avcodec_open2()` 函數(shù)可以打開并初始化指定的編解碼器上下文,使其準(zhǔn)備好進(jìn)行編解碼操作。

函數(shù)原型如下:
int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);
參數(shù)說明:
- `avctx`:要打開和初始化的編解碼器上下文。
- `codec`:要使用的編解碼器,可以通過 `avcodec_find_decoder()` 或其他方式獲取。
- `options`:可選的字典參數(shù),用于設(shè)置編解碼器的選項(xiàng)。

打開解碼器時(shí)可以使用多線程參數(shù)優(yōu)化解碼速度。

AVDictionary* opts = NULL;
//使用多線程解碼
if (!av_dict_get(opts, "threads", NULL, 0))
?? ?av_dict_set(&opts, "threads", "auto", 0);

8、創(chuàng)建音頻重采樣上下文

調(diào)用 `swr_alloc_set_opts()` 函數(shù)可以創(chuàng)建一個(gè)音頻重采樣上下文,并設(shè)置其參數(shù)。這個(gè)函數(shù)可以方便地指定輸入和輸出音頻的通道布局、采樣格式和采樣率等參數(shù)。
?

函數(shù)原型如下:
struct SwrContext *swr_alloc_set_opts(struct SwrContext *s,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? int64_t out_ch_layout, enum AVSampleFormat out_sample_fmt, int out_sample_rate,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? int64_t in_ch_layout, enum AVSampleFormat in_sample_fmt, int in_sample_rate,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? int log_offset, void *log_ctx);
參數(shù)說明:
- `s`:要?jiǎng)?chuàng)建或設(shè)置參數(shù)的音頻重采樣上下文。如果傳入非空指針,則會(huì)設(shè)置現(xiàn)有上下文的參數(shù);如果傳入空指針,則會(huì)創(chuàng)建一個(gè)新的上下文。
- `out_ch_layout`:輸出音頻的通道布局(channel layout)。
- `out_sample_fmt`:輸出音頻的采樣格式(sample format)。
- `out_sample_rate`:輸出音頻的采樣率(sample rate)。
- `in_ch_layout`:輸入音頻的通道布局。
- `in_sample_fmt`:輸入音頻的采樣格式。
- `in_sample_rate`:輸入音頻的采樣率。
- `log_offset`:日志輸出偏移量。
- `log_ctx`:日志上下文。

9、初始化音頻重采樣上下文

調(diào)用 `swr_init()` 函數(shù)可以初始化音頻重采樣上下文,使其準(zhǔn)備好進(jìn)行音頻重采樣操作。


函數(shù)原型如下:
int swr_init(struct SwrContext *s);
參數(shù)說明:
- `s`: 要初始化的音頻重采樣上下文。

10、分配并初始化一個(gè)臨時(shí)的幀和包

調(diào)用 `av_packet_alloc()` 函數(shù)可以分配一個(gè) AVPacket 結(jié)構(gòu)體,并返回指向該結(jié)構(gòu)體的指針。AVPacket 結(jié)構(gòu)體用于存儲(chǔ)音視頻數(shù)據(jù),包括數(shù)據(jù)緩沖區(qū)、大小、時(shí)間戳等信息。

調(diào)用 `av_frame_alloc()` 函數(shù)可以分配一個(gè) AVFrame 結(jié)構(gòu)體,并返回指向該結(jié)構(gòu)體的指針。AVFrame 結(jié)構(gòu)體用于存儲(chǔ)音視頻幀的數(shù)據(jù),包括像素?cái)?shù)據(jù)、采樣數(shù)據(jù)、時(shí)間戳等信息。
?

函數(shù)原型如下:

AVPacket *av_packet_alloc(void);
AVFrame *av_frame_alloc(void);

11、讀取音視頻源文件

調(diào)用 `av_read_frame()` 函數(shù)可以從輸入文件或流中讀取一幀音視頻數(shù)據(jù),并將其存儲(chǔ)在 AVPacket 結(jié)構(gòu)體中。

函數(shù)原型如下:
int av_read_frame(AVFormatContext *s, AVPacket *pkt);
參數(shù)說明:
- `s`:輸入文件或流的 AVFormatContext 上下文。
- `pkt`:存儲(chǔ)讀取到的音視頻幀數(shù)據(jù)的 AVPacket 結(jié)構(gòu)體。

12、發(fā)送音頻數(shù)據(jù)到解碼器

調(diào)用 `avcodec_send_packet()` 函數(shù)可以將 AVPacket 數(shù)據(jù)包發(fā)送給解碼器進(jìn)行解碼。在發(fā)送完所有數(shù)據(jù)包后,需要調(diào)用 `avcodec_send_packet()` 傳遞一個(gè)空的 AVPacket 指針,以便告知解碼器已經(jīng)發(fā)送完所有數(shù)據(jù)。

函數(shù)原型如下:
int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt);
參數(shù)說明:
- `avctx`:指向 AVCodecContext 結(jié)構(gòu)體的指針,表示解碼器上下文。
- `avpkt`:指向要發(fā)送給解碼器的 AVPacket 數(shù)據(jù)包的指針。

13、從解碼器接收解碼后的音頻數(shù)據(jù)

調(diào)用 `avcodec_receive_frame()` 函數(shù)可以從解碼器中接收解碼后的音視頻幀數(shù)據(jù),并將其存儲(chǔ)在 AVFrame 結(jié)構(gòu)體中。


函數(shù)原型如下:
int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame);
參數(shù)說明:
- `avctx`:指向 AVCodecContext 結(jié)構(gòu)體的指針,表示解碼器上下文。
- `frame`:用于存儲(chǔ)接收到的解碼后的 AVFrame 幀數(shù)據(jù)的結(jié)構(gòu)體。
?

14、進(jìn)行音頻重采樣

調(diào)用 `swr_convert()` 函數(shù)可以將輸入緩沖區(qū)中的音頻數(shù)據(jù)進(jìn)行重采樣,并將結(jié)果存儲(chǔ)到輸出緩沖區(qū)中。

函數(shù)原型如下:
int swr_convert(struct SwrContext *s, uint8_t **out, int out_count, const uint8_t **in, int in_count);
參數(shù)說明:
- `s`:指向 SwrContext 結(jié)構(gòu)體的指針,表示音頻重采樣上下文。
- `out`:指向輸出音頻數(shù)據(jù)緩沖區(qū)的指針數(shù)組。
- `out_count`:輸出緩沖區(qū)中的樣本數(shù)。
- `in`:指向輸入音頻數(shù)據(jù)緩沖區(qū)的指針數(shù)組。
- `in_count`:輸入緩沖區(qū)中的樣本數(shù)。

15、播放音頻

將重采樣后的數(shù)據(jù)寫入聲卡中進(jìn)行播放。

簡(jiǎn)潔流程如下:

qt ffmpeg播放,ffmpeg,音視頻,Qt,qt,ffmpeg,音視頻

其他重要API:
void av_dump_format(const AVFormatContext *ic, int index,
? ? ? ? ? ? ? ? ? ? const char *url, int is_output);

?//可以將輸入/輸出文件的格式信息以人類可讀的形式打印出來,包括流的詳細(xì)信息、編解碼器信息等。這對(duì)于調(diào)試和了解輸入/輸出文件的結(jié)構(gòu)和信息非常有幫助。
參數(shù)說明:
- `ic`:指向 AVFormatContext 結(jié)構(gòu)體的指針,表示要進(jìn)行格式信息輸出的輸入/輸出文件的 AVFormatContext。
- `index`:如果為非負(fù)值,表示要輸出的流的索引;如果為負(fù)值,表示輸出所有流信息。
- `url`:文件的 URL 或名稱,在打印信息時(shí)會(huì)用到。
- `is_output`:如果為非零值,表示輸出的是輸出文件的格式信息;如果為 0,表示輸出的是輸入文件的格式信息。

int av_samples_get_buffer_size(int *linesize, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align);

//計(jì)算出存儲(chǔ)指定數(shù)量音頻樣本所需的緩沖區(qū)大小。這個(gè)函數(shù)通常用于動(dòng)態(tài)分配音頻樣本數(shù)據(jù)緩沖區(qū)的場(chǎng)景。
參數(shù)說明:
- `linesize`:指向存儲(chǔ)每個(gè)通道數(shù)據(jù)大小的數(shù)組的指針。
- `nb_channels`:音頻通道數(shù)。
- `nb_samples`:每個(gè)通道中的音頻樣本數(shù)。
- `sample_fmt`:音頻樣本格式,使用 AVSampleFormat 枚舉類型。
- `align`:對(duì)齊方式,通常為 0。

AVFormatContext *avformat_alloc_context(void);

//用于分配內(nèi)存并返回一個(gè)初始化后的 AVFormatContext 結(jié)構(gòu)體指針。

AVFormatContext 結(jié)構(gòu)體里面有一個(gè)重要的參數(shù)?interrupt_callback.callback ,用來設(shè)置回調(diào)函數(shù)。當(dāng)調(diào)用av_read_frame或avformat_find_stream_info會(huì)阻塞執(zhí)行很長時(shí)間的時(shí)候,只要設(shè)置該回調(diào)函數(shù)返回 1 ,那么就會(huì)不再阻塞,立即返回。

二、代碼例程

音頻播放:點(diǎn)擊跳轉(zhuǎn)

視頻播放:點(diǎn)擊跳轉(zhuǎn)

覺得有幫助的話,打賞一下唄。。

qt ffmpeg播放,ffmpeg,音視頻,Qt,qt,ffmpeg,音視頻? ? ? ? ? ?qt ffmpeg播放,ffmpeg,音視頻,Qt,qt,ffmpeg,音視頻文章來源地址http://www.zghlxwxcb.cn/news/detail-855313.html

到了這里,關(guān)于qt+ffmpeg 實(shí)現(xiàn)音視頻播放(二)之音頻播放的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 項(xiàng)目實(shí)戰(zhàn)——Qt實(shí)現(xiàn)FFmpeg音視頻轉(zhuǎn)碼器

    項(xiàng)目實(shí)戰(zhàn)——Qt實(shí)現(xiàn)FFmpeg音視頻轉(zhuǎn)碼器

    本文記錄使用 Qt 實(shí)現(xiàn) FFmepg 音視頻轉(zhuǎn)碼器項(xiàng)目的開發(fā)過程。 1、首先創(chuàng)建一個(gè) Qt 項(xiàng)目,選擇 MSVC2017 32bit 作為其編譯器 2、將 FFmpeg 相關(guān)庫及源文件拷貝到當(dāng)前目錄下 3、注釋 prepare_app_arguments 函數(shù)(這里方便后面我們運(yùn)行時(shí)可以指定相應(yīng)的轉(zhuǎn)碼參數(shù)) 4、將所需的一些 dll 動(dòng)態(tài)庫

    2024年01月23日
    瀏覽(27)
  • 使用Qt進(jìn)行音視頻播放

    使用Qt進(jìn)行音視頻播放

    ??Qt對(duì)音視頻的播放和控制,相機(jī)拍照,收音機(jī)等多媒體應(yīng)用提供了強(qiáng)大的支持。Qt5使用了全新的Qt Multimedia模塊來實(shí)現(xiàn)多媒體應(yīng)用,而原來Qt4中用于實(shí)現(xiàn)多媒體功能的Phonon模塊已經(jīng)被移除。 ??新的Qt Multimedia模塊提供了豐富的接口,使讀者可以輕松地使用平臺(tái)的多媒體功

    2024年02月03日
    瀏覽(21)
  • Qt音視頻開發(fā)38-ffmpeg視頻暫停錄制的設(shè)計(jì)

    Qt音視頻開發(fā)38-ffmpeg視頻暫停錄制的設(shè)計(jì)

    基本上各種播放器提供的錄制視頻接口,都是只有開始錄制和結(jié)束錄制兩個(gè),當(dāng)然一般用的最多的也是這兩個(gè)接口,但是實(shí)際使用過程中,還有一種可能需要中途暫停錄制,暫停以后再次繼續(xù)錄制,將中間部分視頻不需要錄制,跳過這部分不需要的視頻,而且錄制的視頻文件

    2023年04月20日
    瀏覽(25)
  • Qt之基于QMediaPlayer的音視頻播放器(支持常見音視頻格式)

    Qt之基于QMediaPlayer的音視頻播放器(支持常見音視頻格式)

    Qt自帶了一個(gè)Media Player的例子,如下圖所示: 但是運(yùn)行這個(gè)例子機(jī)會(huì)發(fā)現(xiàn),連最基本的MP4格式視頻都播放不了。因?yàn)镼MediaPlayer是個(gè)殼(也可以叫框架),依賴本地解碼器,視頻這塊默認(rèn)基本上就播放個(gè)MP4,甚至連MP4都不能播放,如果要支持其他格式需要下載k-lite或者LAVFilter

    2024年02月02日
    瀏覽(31)
  • Qt音視頻開發(fā)40-ffmpeg采集桌面并錄制

    之前用ffmpeg打通了各種視頻文件和視頻流以及本地?cái)z像頭設(shè)備的采集,近期有個(gè)客戶需求要求將整個(gè)桌面屏幕采集下來,并可以錄制保存成MP4文件,以前也遇到過類似的需求,由于沒有搞過,也沒有精力去摸索和測(cè)試,所以也就一直耽擱著,近期剛好這個(gè)需求又來了,定下心

    2023年04月25日
    瀏覽(21)
  • Qt 多媒體音頻模擬按鈕發(fā)音(音視頻啟動(dòng))

    Qt 多媒體音頻模擬按鈕發(fā)音(音視頻啟動(dòng))

    ## 項(xiàng)目演示 平臺(tái) :windows或者ubuntu? 要求 :平臺(tái)需要支持音頻播放功能 文件格式 :.wav 可以使用剪映生成,音頻部分,我這里是簡(jiǎn)短的音樂 # Qt 多媒體簡(jiǎn)介 Qt QSound是Qt框架中的一個(gè)類,用于播放音頻文件。它可以在Qt應(yīng)用程序中實(shí)現(xiàn)簡(jiǎn)單的音頻播放功能,包括播放、暫停和停

    2024年02月03日
    瀏覽(23)
  • 音視頻開發(fā)系列(10):基于qt的音頻推流

    音視頻開發(fā)系列(10):基于qt的音頻推流

    今天分享一下利用qt錄制音頻,然后再利用ffmpeg推流到nginx服務(wù)器,最后再利用vlc進(jìn)行拉流的demo。 首先介紹一下如何利用qt來進(jìn)行音頻的錄制,qt的音頻錄制主要利用qt的QAudioFormat先進(jìn)行音頻信息的配置。主要需要配置以下的信息: 然后使用QAudioDeviceInfo來獲取是否支持改設(shè)置

    2024年02月02日
    瀏覽(25)
  • Qt/C++音視頻開發(fā)50-不同ffmpeg版本之間的差異處理

    ffmpeg的版本眾多,從2010年開始計(jì)算的項(xiàng)目的話,基本上還在使用的有ffmpeg2/3/4/5/6,最近幾年版本彪的比較厲害,直接4/5/6,大版本之間接口有一些變化,特別是一些廢棄接口被徹底刪除了,而網(wǎng)絡(luò)上的各種文章幾乎都是ffmpeg3左右為主的,所以本人在寫這個(gè)全功能播放組件的時(shí)

    2024年02月14日
    瀏覽(27)
  • Qt音視頻開發(fā)41-文件推流(支持網(wǎng)頁和播放器播放并切換進(jìn)度)

    Qt音視頻開發(fā)41-文件推流(支持網(wǎng)頁和播放器播放并切換進(jìn)度)

    本功能最初也是有一些人提過類似的需求,就是能不能將本地的音視頻文件,通過純Qt程序推流出去,然后用戶可以直接在網(wǎng)頁上播放,也可以用各種播放器播放,然后還可以任意切換播放進(jìn)度,其實(shí)說白了就是個(gè)文件服務(wù)器,用戶通過網(wǎng)絡(luò)地址訪問以后,告訴對(duì)方當(dāng)前是媒

    2024年02月01日
    瀏覽(42)
  • 音視頻開發(fā):ffplay使用ffmpeg濾鏡實(shí)現(xiàn)倍速播放

    曾經(jīng)為實(shí)現(xiàn)倍速播放使用過ffmpeg,對(duì)音頻使用atempo濾鏡即可實(shí)現(xiàn)變速不變調(diào)。但是當(dāng)時(shí)效果并不是特別好,和soundtouch相比處理后的音質(zhì)有明顯的區(qū)別。最近用新版本的ffmpeg濾鏡重新實(shí)現(xiàn)了倍速播放,發(fā)現(xiàn)效果變好,已經(jīng)達(dá)到可接受的程度,所以在此分享具體實(shí)現(xiàn)。 ffmpeg倍速

    2024年02月03日
    瀏覽(72)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包