日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

摘要

這篇文章介紹怎么實(shí)現(xiàn)視頻解碼,具體步驟為讀取Sample.mkv視頻文件,從中提取視頻流,然后解碼為YUV圖像數(shù)據(jù),把YUV數(shù)據(jù)存儲(chǔ)為PGM灰度圖像,或者存儲(chǔ)為YUV420p RAW格式視頻。

初始化FFmepg和FormatContext

使用FFmpeg API第一個(gè)操作就是執(zhí)行初始化函數(shù):av_register_all注冊(cè)所有相關(guān)組件,然后使用avformat_open_input打開指定的媒體文件,并使用avformat_find_stream_info獲取媒體流相關(guān)信息,把這些格式信息映射到AVFormatContext *mFormatCtx這個(gè)結(jié)構(gòu)中。

使用函數(shù)av_dump_format可以從控制臺(tái)輸出媒體文件相關(guān)信息。

bool VideoDecoding::init(const char * file)
{
    av_register_all();

    if ((avformat_open_input(&mFormatCtx, file, 0, 0)) < 0) {
        printf("Failed to open input filen");
    }

    if ((avformat_find_stream_info(mFormatCtx, 0)) < 0) {
        printf("Failed to retrieve input stream informationn");
    }

    av_dump_format(mFormatCtx, 0, file, 0);

    return false;
}

查詢媒體流序號(hào)

多媒體文件一般都有一個(gè)視頻流和多個(gè)音頻流或者字幕流,每個(gè)媒體流都有序號(hào)Index。新版本的API使用av_find_best_stream函數(shù)查詢相應(yīng)的媒體流,第一個(gè)參數(shù)為初始化后的媒體格式Context,第二個(gè)參數(shù)即為媒體類型:

- AVMEDIA_TYPE_VIDEO:視頻流

- AVMEDIA_TYPE_AUDIO:音頻流

- AVMEDIA_TYPE_SUBTITLE:字幕流

后面幾個(gè)參數(shù)是指定流特性的,如果從多個(gè)音頻流中選擇一個(gè)的話可以進(jìn)行相關(guān)設(shè)置。此時(shí)只有一個(gè)視頻流,所以參數(shù)設(shè)為-1即可返回默認(rèn)的媒體流Index,得到這個(gè)Index后,接下來(lái)可以根據(jù)這個(gè)Index讀取所需要的流。

bool VideoDecoding::findStreamIndex()
{
    // Find video stream in the file
    mVideoStreamIndex = av_find_best_stream(mFormatCtx, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0);
    if (mVideoStreamIndex < 0) {
        printf("Could not find stream in input filen");
        return true;
    }

    return false;
}

配置編解碼器CodecContext

首先使用avcodec_find_decoder函數(shù)根據(jù)流Index查找相應(yīng)的解碼器。

然后使用avcodec_alloc_context3函數(shù)根據(jù)解碼器申請(qǐng)一個(gè)CodecContext。

接著根據(jù)流數(shù)據(jù)填充CodecContext各項(xiàng)信息。

最后完成CodecContext初始化操作。

// Initialize the AVCodecContext to use the given AVCodec.
bool VideoDecoding::initCodecContext()
{
    // Find a decoder with a matching codec ID
    AVCodec *dec = avcodec_find_decoder(mFormatCtx->streams[mVideoStreamIndex]->codecpar->codec_id);
    if (!dec) {
        printf("Failed to find codec!n");
        return true;
    }

    // Allocate a codec context for the decoder
    if (!(mCodecCtx = avcodec_alloc_context3(dec))) {
        printf("Failed to allocate the codec contextn");
        return true;
    }

    // Fill the codec context based on the supplied codec parameters.
    if (avcodec_parameters_to_context(mCodecCtx, mFormatCtx->streams[mVideoStreamIndex]->codecpar) < 0) {
        printf("Failed to copy codec parameters to decoder context!n");
        return true;
    }

    // Initialize the AVCodecContext to use the given Codec
    if (avcodec_open2(mCodecCtx, dec, NULL) < 0) {
        printf("Failed to open codecn");
        return true;
    }

    return false;
}

分享到:
標(biāo)簽:解碼 視頻
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定