【音视频】FFmpeg打开视频 | 保存图片

1、初始化FFmpeg

av_register_all(); //初始化FFMPEG  调用了这个才能正常使用编码器和解码器

  但是这个函数如今已经没什么用了,它的就是把你定义和系统初始化的编码器和解码器连接起来而已,然后就没有了。

  现在解码器和编码器的初始化都是通过定义全局变量来初始化的。与原来相比,唯一的改变就是使用数组替换链表完成解码器和编码器的初始化。

## 参考文章:https://www.jianshu.com/p/ebb219ec1c0f

 

 2、分配一个AVFormatContext,FFMPEG所有的操作都要通过这个AVFormatContext数据结构来进行

AVFormatContext *pFormatCtx = avformat_alloc_context();

  AVFormatContext是一个贯穿始终的数据结构,很多函数都要用到它作为参数。

  此结构包含了一个视频流的格式内容:AVInputFormat(or AVOutputFormat同一时间AVFormatContext内只能存在其中一个),和AVStream、AVPacket这几个重要的数据结构以及一些其他的相关信息,比如title,author,copyright等。还有一些可能在编解码中会用到的信息,诸如:duration, file_size, bit_rate等。

 

3、打开视频文件:

char *file_path = "./movie/ifwithoutu.mp4";
avformat_open_input(&pFormatCtx, file_path, NULL, NULL);

  

 

4、视频打开之后,查找文件中的视频流

    あなたがビデオストリームのタイプが見つかるまで、映像に含ま///循環流情報を探す     
    ///が自分の記録を置く変数ビデオストリームに保存され
    、我々は関係なく、彼の最初のビデオストリーム、オーディオストリームでのみ取り扱う。ここ/// 
    = I(用0; I <pFormatCtx-> nb_streams; Iは++)
    { 
        IF(pFormatCtx-> STREAMS [I] - > codec-> == codec_type AVMEDIA_TYPE_VIDEO)
        { 
            ビデオストリーム= I; 
        } 
    } 
 
    ///ビデオストリームのビデオは何の説明がなく-1が見つかった場合流れ
    のIF(ビデオストリームが== -1)
    { 
        のprintfは( "ビデオストリームを見つけられませんでした。"); 
        を返す-1; 
    }    

  

図5に示すように、ビデオストリーム、オープンデコードするデコーダ

    ///查找解码器     
    pCodecCtx = pFormatCtx->は、[ビデオストリーム】ストリーム- >コーデック。
    pCodec = avcodec_find_decoder(pCodecCtx-> codec_id)。
 
    (pCodec == NULL)場合
    { 
        のprintf( "コーデックが見つかりません。")。
        -1を返します。
    } 
 
    ///打开解码器
    (avcodec_open2(pCodecCtx、pCodec、NULL)が<0)であれば
    { 
        のprintf( "オープンコーデックができませんでした。")。
        -1を返します。
    }

  FFmpegのは、デコーダのどのような実際の使用を知らなくても、私たちが検索ビデオストリーム情報に基づいてデコーダに取得することができます

 

6、ビデオを読み込みます

     pCodecCtx- Y_SIZE =整数> * pCodecCtx-幅>高さ; 
    AVPacketパケット* =(AVPacket *)はmalloc(はsizeof(AVPacket)); //パケット割り当て
    av_new_packet(パケット、Y_SIZEを); //データパケットを割り当てる
 
    (av_read_frame場合(pFormatCtx、パケット)<0)
    { 
        BREAK; //ここで上読むことビデオ
    }

  av_read_frameビデオが読み込まれ、コンフィギュレーション・AVPacketに保存されています

 

図7は、ビデオ符号化データは圧縮され、それは復号化される必要があります

   (パケット交換> stream_indexの==ビデオストリーム)であれば
    {         
        RET = avcodec_decode_video2(pCodecCtx、PFRAME、&got_picture、パケット)。
 
        (RET <0)であれば
        { 
            のprintf( "デコードエラー")。
            -1を返します。
        } 
    }    

  

8、復号後の復号により得られた画像データをYUV420フォーマットである、文書画像として保存し、RGBフォーマットを変換する必要があります

    IF(got_picture)
    {         
        sws_scale(img_convert_ctx、
                   (uint8_t CONST * CONST *)pFrame->データ、
                   pFrame-> LINESIZE、
                   0、
                   pCodecCtx->高さ、
                   pFrameRGB->データ、
                   pFrameRGB-> LINESIZE 
)。 }

  

図9に示すように、RGB画像が書き込まれます

SaveFrame(pFrameRGB、
                 pCodecCtx->幅、
                 pCodecCtx->高さ、
                 インデックス++ 
);

  

 

エラー:

(1):AV_PIX_FMT_RGB24を変更

 

おすすめ

転載: www.cnblogs.com/xiexinbei0318/p/11426290.html
おすすめ