zoukankan      html  css  js  c++  java
  • ffmpeg新旧API对比

    从FFmpeg 3.0 开始 , 使用了很多新接口, 在一些基本用法上,编译会看见很多的warning,类似 “ warning: ‘AVStream::codec’ is deprecated (declared at /usr/local/ffmpeg/include/libavformat/avformat.h:880) [-Wdeprecated-declarations] out_stream->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;”

    1. avcodec_decode_video2() 原本的解码函数被拆解为两个函数avcodec_send_packet()和avcodec_receive_frame() 具体用法如下:

    old:

    avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, pPacket);

    new:

    avcodec_send_packet(pCodecCtx, pPacket); avcodec_receive_frame(pCodecCtx, pFrame);


    2. avcodec_encode_video2() 对应的编码函数也被拆分为两个函数avcodec_send_frame()和avcodec_receive_packet() 具体用法如下:

    old:

    avcodec_encode_video2(pCodecCtx, pPacket, pFrame, &got_picture);

    new:

    avcodec_send_frame(pCodecCtx, pFrame); avcodec_receive_packet(pCodecCtx, pPacket);


    3. avpicture_get_size() 现在改为使用av_image_get_size() 具体用法如下:

    old:

    avpicture_get_size(AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height);

    new: //最后一个参数align这里是置1的,具体看情况是否需要置1

    av_image_get_buffer_size(AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height, 1);

    4. avpicture_fill() 现在改为使用av_image_fill_arrays 具体用法如下:

    old:

    avpicture_fill((AVPicture *)pFrame, buffer, AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height);

    new: //最后一个参数align这里是置1的,具体看情况是否需要置1

    av_image_fill_arrays(pFrame->data, pFrame->linesize, buffer, AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height,1);

    5. 关于codec问题有的可以直接改为codecpar,但有的时候这样这样是不对的,所以我也还在探索,这里记录一个对pCodecCtx和pCodec赋值方式的改变

    old:

    pCodecCtx = pFormatCtx->streams[video_index]->codec; pCodec = avcodec_find_decoder(pFormatCtx->streams[video_index]->codec->codec_id);

    new:

    pCodecCtx = avcodec_alloc_context3(NULL); avcodec_parameters_to_context(pCodecCtx,pFormatCtx->streams[video_index]->codecpar); pCodec = avcodec_find_decoder(pCodecCtx->codec_id);


    6. PIX_FMT_YUV420P -> AV_PIX_FMT_YUV420P

    7. 'AVStream::codec': 被声明为已否决:

    old:

    if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO){

    new:

    if(pFormatCtx->streams[i]->codecpar->codec_type==AVMEDIA_TYPE_VIDEO){

    8. 'AVStream::codec': 被声明为已否决:

    old:

    pCodecCtx = pFormatCtx->streams[videoindex]->codec;

    new:

    pCodecCtx = avcodec_alloc_context3(NULL); avcodec_parameters_to_context(pCodecCtx, pFormatCtx->streams[videoindex]->codecpar);

    9. 'avpicture_get_size': 被声明为已否决:

    old:

    avpicture_get_size(AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height)

    new:

    #include "libavutil/imgutils.h"

    av_image_get_buffer_size(AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height, 1)

    10. 'avpicture_fill': 被声明为已否决:

    old:

    avpicture_fill((AVPicture *)pFrameYUV, out_buffer, AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height);

    new:

    av_image_fill_arrays(pFrameYUV->data, pFrameYUV->linesize, out_buffer, AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height, 1);

    11. 'avcodec_decode_video2': 被声明为已否决:

    old:

    ret = avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, packet); //got_picture_ptr Zero if no frame could be decompressed

    new:

    ret = avcodec_send_packet(pCodecCtx, packet);

    got_picture = avcodec_receive_frame(pCodecCtx, pFrame); //got_picture = 0 success, a frame was returned //注意:got_picture含义相反

    或者:

    int ret = avcodec_send_packet(aCodecCtx, &pkt);

    if (ret != 0)

    {

    prinitf("%s/n","error");

    return;

    } while( avcodec_receive_frame(aCodecCtx, &frame) == 0)

    {

    //读取到一帧音频或者视频 //处理解码后音视频 frame

    }
    12. 'av_free_packet': 被声明为已否决:

    old:

    av_free_packet(packet);

    new:

    av_packet_unref(packet);
    13. avcodec_decode_audio4:被声明为已否决:

    old:

    result = avcodec_decode_audio4(dec_ctx, out_frame, &got_output, &enc_pkt);
    new:

    int ret = avcodec_send_packet(dec_ctx, &enc_pkt);

    if (ret != 0)

    {

    prinitf("%s/n","error");

    } while( avcodec_receive_frame(dec_ctx, &out_frame) == 0)

    {

    //读取到一帧音频或者视频

    //处理解码后音视频 frame

    }

  • 相关阅读:
    Unique Binary Search Trees——LeetCode
    Binary Tree Inorder Traversal ——LeetCode
    Maximum Product Subarray——LeetCode
    Remove Linked List Elements——LeetCode
    Maximum Subarray——LeetCode
    Validate Binary Search Tree——LeetCode
    Swap Nodes in Pairs——LeetCode
    Find Minimum in Rotated Sorted Array——LeetCode
    Linked List Cycle——LeetCode
    VR AR MR
  • 原文地址:https://www.cnblogs.com/dragon2012/p/13066923.html
Copyright © 2011-2022 走看看