zoukankan      html  css  js  c++  java
  • 把自定义的demuxer加入ffmpeg源码

    .简介:把上一篇文章中的demuxer加入ffmpeg源码中去,使可以用命令行方式调用自定义的demuxer

    第一步:

    在libavformat目录下新建mkdemuxer.c和mkdemuxer.h,代码如下:

    mkdemuxer.c:

    [cpp] view plain copy
     
    1. /*  
    2. *实现一个自己的demuxer并加入到demuxer链中去 
    3. *作者:缪国凯(MK)  
    4. *821486004@qq.com  
    5. *2015-6-3  
    6. */   
    7.   
    8. #include "mkdemuxer.h"  
    9.   
    10. typedef struct MKVideoDemuxerContext {  
    11.     const AVClass *pclass;     /**< Class for private options. */  
    12.     int width, height;        /**< Integers describing video size, set by a private option. */  
    13.     char *pixel_format;       /**< Set by a private option. */  
    14.     AVRational framerate;     /**< AVRational describing framerate, set by a private option. */  
    15. } MKVideoDemuxerContext;  
    16.   
    17. int mkvideo_read_header(AVFormatContext *ctx)  
    18. {  
    19.     MKVideoDemuxerContext *s = ctx->priv_data;  
    20.     enum AVPixelFormat pix_fmt;  
    21.     AVStream *st;  
    22.   
    23.     st = avformat_new_stream(ctx, NULL);  
    24.     if (!st)  
    25.         return AVERROR(ENOMEM);  
    26.   
    27.     st->codec->codec_type = AVMEDIA_TYPE_VIDEO;  
    28.   
    29.     st->codec->codec_id = ctx->iformat->raw_codec_id;  
    30.   
    31.     //这里就简单的直接赋值为420p  
    32.     pix_fmt = AV_PIX_FMT_YUV420P;  
    33.   
    34.     st->time_base.num = s->framerate.den;  
    35.     st->time_base.den = s->framerate.num;  
    36.     st->pts_wrap_bits = 64;  
    37.       
    38.   
    39.     st->codec->width  = s->width;  
    40.     st->codec->height = s->height;  
    41.     st->codec->pix_fmt = pix_fmt;  
    42.   
    43.     AVRational tmpRa;  
    44.     tmpRa.den = 1;  
    45.     tmpRa.num = 8;  
    46.     st->codec->bit_rate = av_rescale_q(avpicture_get_size(st->codec->pix_fmt, s->width, s->height),  
    47.         tmpRa, st->time_base);  
    48.   
    49.     return 0;  
    50. }  
    51.   
    52. int mkvideo_read_packet(AVFormatContext *s, AVPacket *pkt)  
    53. {  
    54.     int packet_size, ret, width, height;  
    55.     AVStream *st = s->streams[0];  
    56.   
    57.     width = st->codec->width;  
    58.     height = st->codec->height;  
    59.   
    60.     packet_size = avpicture_get_size(st->codec->pix_fmt, width, height);  
    61.     if (packet_size < 0)  
    62.         return -1;  
    63.   
    64.     ret = av_get_packet(s->pb, pkt, packet_size);  
    65.     pkt->pts = pkt->dts = pkt->pos / packet_size;  
    66.   
    67.     pkt->stream_index = 0;  
    68.     if (ret < 0)  
    69.         return ret;  
    70.       
    71.     return 0;  
    72. }  
    73.   
    74. #define OFFSET(x) offsetof(MKVideoDemuxerContext, x)  
    75. #define DEC AV_OPT_FLAG_DECODING_PARAM  
    76.   
    77. static const AVOption mk_options[] =   
    78. {  
    79.     { "video_size", "set frame size", OFFSET(width), AV_OPT_TYPE_IMAGE_SIZE, {.str = NULL}, 0, 0, DEC },  
    80.     { "pixel_format", "set pixel format", OFFSET(pixel_format), AV_OPT_TYPE_STRING, {.str = "yuv420p"}, 0, 0, DEC },  
    81.     { "framerate", "set frame rate", OFFSET(framerate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, 0, DEC },  
    82.     { NULL },  
    83. };  
    84.   
    85. static const AVClass mk_demuxer_class = {  
    86.     .class_name = "mk video demuxer",  
    87.     .item_name  = av_default_item_name,  
    88.     .option     = mk_options,  
    89.     .version    = LIBAVUTIL_VERSION_INT,  
    90. };  
    91.   
    92. AVInputFormat ff_mk_demuxer = {  
    93.     .name           = "mk",  
    94.     .long_name      = NULL_IF_CONFIG_SMALL("MK Video Container"),  
    95.     .flags          = AVFMT_GENERIC_INDEX,  
    96.     .extensions     = "mk",   
    97.     .priv_class     = &mk_demuxer_class,      
    98.     .raw_codec_id   = AV_CODEC_ID_RAWVIDEO,  
    99.     .priv_data_size = sizeof(MKVideoDemuxerContext),  
    100.       
    101.     .read_header    = mkvideo_read_header,  
    102.     .read_packet    = mkvideo_read_packet,  
    103. };  

    mkdemuxer.h:

    [cpp] view plain copy
     
    1. /*  
    2. *实现一个自己的demuxer并加入到demuxer链中去 
    3. *作者:缪国凯(MK)  
    4. *821486004@qq.com  
    5. *2015-6-3  
    6. */   
    7.   
    8. #ifndef AVFORMAT_MKDEMUXER_H  
    9. #define AVFORMAT_MKDEMUXER_H  
    10.   
    11. #include "libavutil/opt.h"  
    12. #include "avformat.h"  
    13.   
    14. int mkvideo_read_header(AVFormatContext *ctx);  
    15. int mkvideo_read_packet(AVFormatContext *s, AVPacket *pkt);  
    16.   
    17. #endif //AVFORMAT_MKDEMUXER_H  

    第二步:

    在libavformat下的allformats.c的av_register_all里加入:

    [cpp] view plain copy
     
    1. REGISTER_DEMUXER   (MK,              mk);//add ByMK for mk demuxer    

    第三步:

    在libavformat目录下的makefile文件的# muxers/demuxers后加入:

    [cpp] view plain copy
     
    1. OBJS-$(CONFIG_MK_DEMUXER)                  += mkdemuxer.o   

    第四步:

    在ffmpeg根目录的config.h里加入:

    [cpp] view plain copy
     
    1. #define CONFIG_MK_DEMUXER 1    

    第五步:

    如果不想重新configure,则在ffmpeg根目录的config.mak文件中加入:
    [cpp] view plain copy
     
    1. CONFIG_MK_DEMUXER=yes  

    OK,按照正常的编译去编译ffmpeg,然后运行ffmpeg.exe输入ffmpeg -formats 看到有mk这个muxer了,如下:

    [cpp] view plain copy
     
    1. DE mk              mk (MK Video Container)  
    2.  E mkvtimestamp_v2 extract pts as timecode v2 format, as defined by mkvtoolnix  
    3. DE mlp             raw MLP  
    4. D  mlv             Magic Lantern Video (MLV)  
    5. D  mm              American Laser Games MM  
    6. DE mmf             Yamaha SMAF  
    7.  E mov             QuickTime / MOV  

    再试一下命令:ffmpeg -s 1280x720 -i test.mk -y test.avi。

    注意:当.mk格式作为输入的时候,必须加输入参数-s 分辨率,就和yuv作为输入一样(因为从本质上讲就是yuv...)。

    成功!OK,大功告成。

    原理在上一篇的博文中已经讲到了,下一步,实现自己的encoder。

    from:http://blog.csdn.net/dancing_night/article/details/46348515

  • 相关阅读:
    使用Leangoo玩转故事地图
    用Leangoo做敏捷需求管理
    LEANGOO成员
    LEANGOO卡片
    给WebAPI的REST接口添加测试页面(三)
    使用Win2D在UWP程序中2D绘图(二)
    Visual Studio 2015的“转到定义”和“查看定义”出错的Bug
    使用Win2D在UWP程序中2D绘图(一)
    Windows 10 UWP程序标题栏设置
    .NET 4.6的RyuJIT尾递归优化的Bug
  • 原文地址:https://www.cnblogs.com/lidabo/p/7324940.html
Copyright © 2011-2022 走看看