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

【FFMPEG應(yīng)用篇】基于FFmpeg的轉(zhuǎn)碼應(yīng)用(FLV MP4)

這篇具有很好參考價(jià)值的文章主要介紹了【FFMPEG應(yīng)用篇】基于FFmpeg的轉(zhuǎn)碼應(yīng)用(FLV MP4)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

?方法聲明

extern "C"   //ffmpeg使用c語言實(shí)現(xiàn)的,引入用c寫的代碼就要用extern
{
#include <libavcodec/avcodec.h>   //注冊
#include <libavdevice/avdevice.h>  //設(shè)備
#include <libavformat/avformat.h>
#include <libavutil/error.h>
#include <libswscale/swscale.h>
#include <libswresample/swresample.h>
}
#include<iostream>

class fcoverh264
{
public:
    fcoverh264(int number);

    //打開H264視頻文件
    void openFile(std::string file);
    //根據(jù)我們需要的封裝格式進(jìn)行處理
    void outPut(std::string fileout);
private:
    AVFormatContext* forContext, * formatout;//保存數(shù)據(jù)的結(jié)構(gòu)體 forContext存輸入進(jìn)來的視頻信息;formatout存儲最終輸出的視頻信息
    AVPacket* pkt;//pkt
    int videoType;
};

?定義實(shí)現(xiàn)?

#include "fcoverh264.h"


extern "C"   //ffmpeg使用c語言實(shí)現(xiàn)的,引入用c寫的代碼就要用extern
{
#include <libavcodec/avcodec.h>   //注冊
#include <libavdevice/avdevice.h>  //設(shè)備
#include <libavformat/avformat.h>
#include <libavutil/error.h>
#include <libswscale/swscale.h>
#include <libswresample/swresample.h>
}
fcoverh264::fcoverh264(int number):videoType(number)
{
    /*
     * 轉(zhuǎn)碼的流程:
     * 1.注冊組件
     * 2.打開視頻流 打開視頻文件
     * 3.查找有沒有流數(shù)據(jù)
     * 4.查找視頻碼流數(shù)據(jù)
     *
     * 6.根據(jù)要的封裝格式 來猜測格式對應(yīng)編輯器
     * 7.打開對應(yīng)文件
     * 8.新建流
     * 9.寫入頭部信息
     * 10.讀取一幀一幀的碼流數(shù)據(jù)
     * 11.轉(zhuǎn)碼---->時(shí)間基的轉(zhuǎn)化
     * 所以在解碼的時(shí)候:顯示順序和解碼的順序是一樣的;
       處理其他視頻的時(shí)候:就需要關(guān)注 顯示順序和解碼的順序是否一致了
       編碼有B幀? 解碼:IPB
     * 12.寫入對應(yīng)的一幀數(shù)據(jù)到文件中
     */

     //注冊組件
    av_register_all();
    forContext = avformat_alloc_context();

}

void fcoverh264::openFile(std::string file)
{
    //打開輸入視頻
    int res = avformat_open_input(&forContext, file.c_str(), nullptr, nullptr);
    //判斷是否打開成功
    if (res < 0)
    {
        std::cout << "打開失敗"<<std::endl;
        return;
    }

    //打開視頻文件成功,獲取文件信息
    res = avformat_find_stream_info(forContext, nullptr);//查看有沒有相關(guān)視頻流信息
    if (res < 0)//判斷是否有流媒體
    {
        std::cout << "沒有流媒體信息" << std::endl;
        return;
    }

    //一個(gè)視頻流有多股碼流,存在forContentext中streams數(shù)組中
    /*int videoType = -1;*/
    for (int i = 0; i < forContext->nb_streams; i++) //i小于流的個(gè)數(shù)
    {
        if (forContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)//視頻流
        {
            videoType = i;//標(biāo)識類型
            break;
        }
    }
    if (videoType == -1)
    {
        std::cout << "沒有視頻流相關(guān)信息" << std::endl;
        return;
    }
    std::cout << "輸入的準(zhǔn)備已經(jīng)完成"<<std::endl;
}

//根據(jù)我們需要的封裝格式進(jìn)行處理
void fcoverh264::outPut(std::string fileout)
{
    //猜測編碼器
    AVOutputFormat* avformat = av_guess_format(nullptr, fileout.c_str(), nullptr);
    if (avformat == nullptr)
    {
        std::cout << "沒有編碼器!"<<std::endl;
        return;
    }
    std::cout << "AVOutputFormat"<<std::endl;

    //保存輸出視頻信息的結(jié)構(gòu)體
    formatout = avformat_alloc_context();
    //設(shè)置輸出格式
    formatout->oformat = avformat;

    //打開視頻流 文件流
    //參數(shù)1:輸入輸出的上下文對象
    //參數(shù)2:文件流路徑
    //參數(shù)3:文件打開格式 寫的方式
    int res = avio_open(&formatout->pb, fileout.c_str(), AVIO_FLAG_WRITE);
    if (res < 0)
    {
        std::cout << "open file error"<<std::endl;
        return;
    }
    std::cout << "avio_open"<<std::endl;
    //新建視頻流
    //參數(shù)1:視頻信息結(jié)構(gòu)體
    //參數(shù)2:新建流 的 返回新建流 的地址
    AVStream* newStream = avformat_new_stream(formatout, nullptr);
    if (newStream == nullptr)
    {
        std::cout << "打開視頻流失敗"<<std::endl;
        return;
    }
    std::cout << "newStream"<<std::endl;
    //編碼器對應(yīng)參數(shù)設(shè)置  拷貝參數(shù)設(shè)置   newStream:輸入進(jìn)入流的參數(shù)設(shè)置
    res = avcodec_parameters_copy(newStream->codecpar, forContext->streams[videoType]->codecpar);
    std::cout << "res=" << res<<std::endl;
    if (res < 0)
    {
        std::cout << "拷貝失?。?<< std::endl;
        return;
    }
    std::cout << "res=" << res<<std::endl;
    //設(shè)置新的流里面 codec_tag 設(shè)置為0
    newStream->codecpar->codec_tag = 0;

    //頭部信息寫入----寫入成功與否
    res = avformat_write_header(formatout, nullptr);//formatout封裝格式的結(jié)構(gòu)體
    //判斷寫入成功與否
    if (res < 0)
    {
        std::cout << "寫入頭部信息失?。? <<std::endl;
        return;
    }
    std::cout << "res=" << res << std::endl;

    //開始讀取碼流數(shù)據(jù)
    pkt = (AVPacket*)malloc(sizeof(AVPacket));
    //算出這張圖有多大
    int size = newStream->codecpar->width * newStream->codecpar->height;
    av_new_packet(pkt, size);

    int frameCount = 0;

    //一幀一幀的讀取
    while (av_read_frame(forContext, pkt) == 0)
    {
        //判斷這一幀這是不是視頻流
        if (pkt->stream_index == videoType)
        {
            frameCount++;
            //如果是視頻流----判斷有沒有設(shè)置過 時(shí)間基
            if (pkt->pts == AV_NOPTS_VALUE)
            {
                //時(shí)間基  time_base AVRational屬性
                AVRational timebase = forContext->streams[videoType]->time_base;
                //計(jì)算幀之間的長度(duration)   double強(qiáng)制轉(zhuǎn)換
                int64_t duration = (double)AV_TIME_BASE / av_q2d(forContext->streams[videoType]->r_frame_rate);
                //計(jì)算顯示時(shí)間基(pts):公式:(當(dāng)前幀數(shù)*兩幀之間的長度))/(輸入時(shí)間基*AV_TIME_BASE)
                pkt->pts = (double)(frameCount * duration) / (av_q2d(timebase) * AV_TIME_BASE);
                //解碼時(shí)間基(dts)
                pkt->dts = pkt->pts;
                //目標(biāo)兩幀之間的長度
                pkt->duration = duration / (double)(av_q2d(timebase) * AV_TIME_BASE);
            }
            else if (pkt->pts < pkt->dts)//顯示 時(shí)間基 小于 解碼時(shí)間基 不要這樣子的
            {
                continue;
            }
            //上述步驟為  時(shí)間基設(shè)置



            //解碼 時(shí)間基 真正的轉(zhuǎn)換 如下:

            //顯示時(shí)間基的轉(zhuǎn)換
            pkt->pts = av_rescale_q_rnd(pkt->pts, forContext->streams[videoType]->time_base,
                newStream->time_base, (AVRounding)(AV_ROUND_INF | AV_ROUND_PASS_MINMAX));
            //解碼時(shí)間基的轉(zhuǎn)換
            pkt->dts = av_rescale_q_rnd(pkt->dts, forContext->streams[videoType]->time_base,
                newStream->time_base, (AVRounding)(AV_ROUND_INF | AV_ROUND_PASS_MINMAX));
            //數(shù)據(jù)時(shí)長設(shè)置
            pkt->duration = av_rescale_q(pkt->duration, forContext->streams[videoType]->time_base,
                newStream->time_base);
            //數(shù)據(jù)位置的設(shè)置 數(shù)據(jù)在流信息中的設(shè)置
            pkt->pos = -1;
            //數(shù)據(jù)包的標(biāo)記:結(jié)合AV_PKT_FLAG_KEY使用  最小為1表示這一幀是一個(gè)關(guān)鍵幀
            pkt->flags |= AV_PKT_FLAG_KEY;
            //標(biāo)記:當(dāng)前寫入的這一幀是視頻流
            pkt->stream_index = 0;

            //轉(zhuǎn)碼后的數(shù)據(jù)包 寫入 目標(biāo)視頻信息 結(jié)構(gòu)體 中
            av_interleaved_write_frame(formatout, pkt);
        }
        //清空處理:重新設(shè)置包
        av_packet_unref(pkt);
    }

    //寫入尾巴幀
    av_write_trailer(formatout);

    //用完之后進(jìn)行 關(guān)閉 處理 :關(guān)閉猜測完的流
    avio_close(formatout->pb);//對應(yīng)avio_open()
    std::cout << "avio_close"<<std::endl;

    //釋放malloc的空間 釋放保存信息的結(jié)構(gòu)體
    av_free(formatout);
    std::cout << "av_free"<<std::endl;

    //關(guān)閉輸入流
    avformat_close_input(&forContext);//對應(yīng)avformat_open_inpu
    std::cout << "avformat_close_input"<<std::endl;

    //釋放forContext結(jié)構(gòu)體空間
    av_free(forContext);
    std::cout << "av_free"<<std::endl;
}

?調(diào)用實(shí)例文章來源地址http://www.zghlxwxcb.cn/news/detail-781860.html

#include <iostream>
#include "fcoverh264.h"


int main() {

    fcoverh264* cover = new fcoverh264{-1};       //轉(zhuǎn)碼
    cover->openFile("test01.h264");
    cover->outPut("code_frame.flv");

    return 0;
}

到了這里,關(guān)于【FFMPEG應(yīng)用篇】基于FFmpeg的轉(zhuǎn)碼應(yīng)用(FLV MP4)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 20230403在WIN10下通過ffmpeg調(diào)用NVIDIA的硬件加速wmv視頻轉(zhuǎn)碼為MP4格式

    20230403在WIN10下通過ffmpeg調(diào)用NVIDIA的硬件加速wmv視頻轉(zhuǎn)碼為MP4格式

    20230403在WIN10下通過ffmpeg調(diào)用NVIDIA的硬件加速wmv視頻轉(zhuǎn)碼為MP4格式 2023/4/3 15:50 最近向?qū)W習(xí)日語,找到日語發(fā)音的視頻中,大多數(shù)是MP4格式,少量是WMV格式,PR2023貌似不能識別WMV格式。 于是:萬能的ffmpeg上場了! ? 手動(dòng)指定編解碼器 通過 ffmpeg -codecs | findstr \\\"vc1\\\" 查看 vc1 的編解

    2023年04月22日
    瀏覽(22)
  • DXGI高幀率屏幕錄像軟件源碼解析(聲音捕獲,抓屏,ffmpeg錄像,MP4錄像,flv錄像,麥克風(fēng)采集)(第4篇編碼,錄像部分)

    DXGI高幀率屏幕錄像軟件源碼解析(聲音捕獲,抓屏,ffmpeg錄像,MP4錄像,flv錄像,麥克風(fēng)采集)(第4篇編碼,錄像部分)

    本文DEMO源碼下載: https://download.csdn.net/download/xjb2006/85109025 dxgi桌面屏幕錄像(windows屏幕錄像,硬件編碼,聲音捕獲,音視頻同步) 由于篇幅有限,分為4篇發(fā)表: 1、SDK接口一覽: 2、聲音采集部分: 3、屏幕捕獲部分: 4、編碼,錄像部分: 距離上篇文章已經(jīng)過了快1年了,才

    2023年04月17日
    瀏覽(20)
  • 基于FFmpeg的封裝格式MP4(TS)

    基于FFmpeg的封裝格式MP4(TS)

    每一幀音頻或視頻都有一個(gè)持續(xù)時(shí)間:duration: 采樣頻率是指將模擬聲音波形進(jìn)行數(shù)字化時(shí),每秒鐘抽取聲波幅度樣本的次數(shù)。 。正常人聽覺的頻率范圍大約在20Hz~20kHz之間,根據(jù)奈奎斯特采樣理論,為了保證聲音不失真,采樣頻率應(yīng)該在40kHz左右。常用的音頻采樣頻率有8k

    2024年02月03日
    瀏覽(24)
  • FFmpeg4入門13:h264編碼為mp4

    上一篇將yuv源視頻文件編碼為 *.h264 的由libx264實(shí)現(xiàn)壓縮的文件,將源文件從55M編碼為620KB,但是h264文件只有視頻數(shù)據(jù),而且使用范圍不太廣。那么就需要進(jìn)一步的封裝,在此選用最常用的mp4格式為例。 隨便選一個(gè)mp4格式文件,用FFmpeg4入門4:解析視頻并輸出視頻信息或者ffp

    2023年04月10日
    瀏覽(24)
  • 視頻轉(zhuǎn)碼:掌握mp4視頻格式轉(zhuǎn)FLV視頻的技巧,視頻批量剪輯方法

    視頻轉(zhuǎn)碼:掌握mp4視頻格式轉(zhuǎn)FLV視頻的技巧,視頻批量剪輯方法

    在多媒體時(shí)代,視頻格式的轉(zhuǎn)換成為一種常見的需求。把MP4格式轉(zhuǎn)換為FLV格式,F(xiàn)LV格式的視頻文件通常具有較小的文件大小,同時(shí)保持了較好的視頻質(zhì)量。批量剪輯視頻的方法能大大提高工作效率。下面來看云炫AI智剪如何進(jìn)行MP4到FLV的轉(zhuǎn)碼,如何批量剪輯視頻的方法。 轉(zhuǎn)碼

    2024年01月19日
    瀏覽(32)
  • FFmpeg從入門到入魔(3):提取MP4中的H.264和AAC

    FFmpeg從入門到入魔(3):提取MP4中的H.264和AAC

    ? ? 最近在開發(fā)中遇到了一個(gè)問題,即無法提取到MP4中H264流的關(guān)鍵幀進(jìn)行處理,且保存到本地的AAC音頻也無法正常播放。經(jīng)過調(diào)試分析發(fā)現(xiàn),這是由于解封裝MP4得到的H264和AAC是ES流,它們?nèi)笔Ы獯a時(shí)必要的 起始碼 / SPS / PPS 和 adts頭 。 1. MP4格式解析 1.1 MP4簡介 ?MP4封裝格式是

    2023年04月16日
    瀏覽(19)
  • FFMPEG mp4封裝實(shí)現(xiàn)

    FFMPEG mp4封裝實(shí)現(xiàn)

    FFMPEG mp4錄像 author:lyn date:2022.09.28 version: ffmpeg4.1.3 1.mp4數(shù)據(jù)結(jié)構(gòu) 2.ffmpeg mp4封裝實(shí)現(xiàn) 3.mp4函數(shù)調(diào)用關(guān)系 4.參考資料 1.mp4數(shù)據(jù)結(jié)構(gòu) 1.1mp4簡介 MP4或稱MPEG-4第14部分(英語:MPEG-4 Part 14)是一種標(biāo)準(zhǔn)的數(shù)字多媒體容器格式。MPEG-4第14部分的擴(kuò)展名為 .mp4 ,以存儲數(shù)字音頻及數(shù)字視頻

    2023年04月08日
    瀏覽(23)
  • ffmpeg操作MP4視頻封面

    ffmpeg操作MP4視頻封面

    提取視頻封面 視頻流中提取幀圖 3.重新設(shè)置視頻封面 更多參考: https://blog.csdn.net/m0_37624402/article/details/125123818

    2024年02月04日
    瀏覽(21)
  • 20231005使用ffmpeg旋轉(zhuǎn)MP4視頻

    20231005使用ffmpeg旋轉(zhuǎn)MP4視頻

    20231005使用ffmpeg旋轉(zhuǎn)MP4視頻 2023/10/5 12:21 百度搜搜:ffmpeg 旋轉(zhuǎn)90度 https://zhuanlan.zhihu.com/p/637790915 【FFmpeg實(shí)戰(zhàn)】FFMPEG常用命令行 https://blog.csdn.net/weixin_37515325/article/details/127817057 FFMPEG常用命令行 5.視頻旋轉(zhuǎn) 順時(shí)針旋轉(zhuǎn)90度:ffmpeg -i test.mp4 -vf \\\"transpose=1\\\" out.mp4//順時(shí)針旋轉(zhuǎn)90° 逆時(shí)針

    2024年02月07日
    瀏覽(21)
  • ffmpeg批量轉(zhuǎn)換mpg為mp4

    1、新建一個(gè)txt文件,并復(fù)制如下代碼進(jìn)入,然后保存。 2、把文件后綴修改為bat 。 3、把后綴為bat的文件放到要批量處理的視頻文件夾里面。 4、在確保安裝了ffmpeg的情況下,雙擊bat文件執(zhí)行即可。 5、參數(shù)說明: -i? ? ? ? ? 輸入文件,這里指的就是視頻文件。 -y? ? ? ?

    2024年02月13日
    瀏覽(22)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包