把自定义的demuxer加入ffmpeg源码

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

第一步:

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

mkdemuxer.c:

[cpp] view plain copy

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

mkdemuxer.h:

[cpp] view plain copy

  1. /*
  2. *实现一个自己的demuxer并加入到demuxer链中去
  3. *作者:缪国凯(MK)
  4. *[email protected]
  5. *2015-6-3
  6. */
  7. #ifndef AVFORMAT_MKDEMUXER_H
  8. #define AVFORMAT_MKDEMUXER_H
  9. #include "libavutil/opt.h"
  10. #include "avformat.h"
  11. int mkvideo_read_header(AVFormatContext *ctx);
  12. int mkvideo_read_packet(AVFormatContext *s, AVPacket *pkt);
  13. #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

时间: 2024-10-07 18:01:25

把自定义的demuxer加入ffmpeg源码的相关文章

把自定义的decoder加入ffmpeg源码

第一步: 在libavcodec目录下新建mkdecoder.c,并加入一下代码: [cpp] view plain copy /* *实现一个自己的decoder,编码工作其实就是把pkt的数据拷贝到frame *作者:缪国凯(MK) *[email protected] *2015-6-5 */ #include "avcodec.h" static av_cold int mk_init_decoder(AVCodecContext *avctx) { printf("

又是正版!Win下ffmpeg源码调试分析二(Step into ffmpeg from Opencv for bugs in debug mode with MSVC)

最近工作忙一直没时间写,但是看看网络上这方面的资源确实少,很多都是linux的(我更爱unix,哈哈),而且很多是直接引入上一篇文章的编译结果来做的.对于使用opencv但是又老是被ffmpeg库坑害的朋友们,可能又爱又恨,毕竟用它处理和分析视频是第一选择,不仅是因为俩者配合使用方便,而且ffmpeg几乎囊括了我所知道的所有解编码器,但是正是因为这个导致了一些bug很难定位,所以有必要考虑一下如何快速定位你的ffmpeg bug. sorry,废话多了.首先给个思路: 1.使opencv 的hi

最新版ffmpeg源码分析

最新版ffmpeg源码分析一:框架 (ffmpeg v0.9) 框架 最新版的ffmpeg中发现了一个新的东西:avconv,而且ffmpeg.c与avconv.c一个模样,一研究才发现是libav下把ffmpeg改名为avconv了. 到底libav与ffmpeg现在是什么个关系?我也搞得希里糊涂的,先不管它了. ffmpeg的主要功能是音视频的转换和处理.其功能之强大已经到了匪夷所思的地步(有点替它吹了).它的主要特点是能做到把多个输入文件中的任意几个流重新组合到输出文件中,当然输出文件也可

FFmpeg源码简单分析:结构体成员管理系统-AVOption

===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFmpeg源码结构图 - 编码 [通用] FFmpeg 源码简单分析:av_register_all() FFmpeg 源码简单分析:avcodec_register_all() FFmpeg 源码简单分析:内存的分配和释放(av_malloc().av_free()等) FFmpeg 源码简单分析:常

FFmpeg源码结构图 - 解码

===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFmpeg源码结构图 - 编码 [通用] FFmpeg 源码简单分析:av_register_all() FFmpeg 源码简单分析:avcodec_register_all() FFmpeg 源码简单分析:内存的分配和释放(av_malloc().av_free()等) FFmpeg 源码简单分析:常

FFmpeg源码简单分析:libswscale的sws_scale()

===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFmpeg源码结构图 - 编码 [通用] FFmpeg 源码简单分析:av_register_all() FFmpeg 源码简单分析:avcodec_register_all() FFmpeg 源码简单分析:内存的分配和释放(av_malloc().av_free()等) FFmpeg 源码简单分析:常

自定义View系列教程04--Draw源码分析及其实践

通过之前的详细分析,我们知道:在measure中测量了View的大小,在layout阶段确定了View的位置. 完成这两步之后就进入到了我们相对熟悉的draw阶段,在该阶段真正地开始对视图进行绘制. 按照之前的惯例,我们来瞅瞅View中draw( )的源码 public void draw(Canvas canvas) { final int privateFlags = mPrivateFlags; final boolean dirtyOpaque = (privateFlags & PFL

自定义View系列教程03--onLayout源码详尽分析

PS:如果觉得文章太长,那就直接看视频吧 在经过measure阶段以后,系统确定了View的测量大小,接下来就进入到layout的过程. 在该过程中会确定视图的显示位置,即子View在其父控件中的位置. 嗯哼,我们直接扒开源码从View的layout( )开始入手. //l, t, r, b分别表示子View相对于父View的左.上.右.下的坐标 public void layout(int l, int t, int r, int b) { if ((mPrivateFlags3 & PFLA

【转】ANDROID自定义视图——onMeasure,MeasureSpec源码 流程 思路详解

原文地址:http://blog.csdn.net/a396901990/article/details/36475213 简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量——onMeasure():决定View的大小 2.布局——onLayout():决定View在ViewGroup中的位置 3.绘制——onDraw():如何绘制这个View. 而第3步的onDraw系统已经封装的很好了,基本不用我们来操心,只需要专注到1,2两个步骤就中好了. 而这篇文章就来谈谈第一步