把自定义的demuxer加入ffmpeg源码
.简介:把上一篇文章中的demuxer加入ffmpeg源码中去,使可以用命令行方式调用自定义的demuxer
第一步:
在libavformat目录下新建mkdemuxer.c和mkdemuxer.h,代码如下:
mkdemuxer.c:
- /*
- *实现一个自己的demuxer并加入到demuxer链中去
- *作者:缪国凯(MK)
- *821486004@qq.com
- *2015-6-3
- */
- #include "mkdemuxer.h"
- typedef struct MKVideoDemuxerContext {
- const AVClass *pclass; /**< Class for private options. */
- int width, height; /**< Integers describing video size, set by a private option. */
- char *pixel_format; /**< Set by a private option. */
- AVRational framerate; /**< AVRational describing framerate, set by a private option. */
- } MKVideoDemuxerContext;
- int mkvideo_read_header(AVFormatContext *ctx)
- {
- MKVideoDemuxerContext *s = ctx->priv_data;
- enum AVPixelFormat pix_fmt;
- AVStream *st;
- st = avformat_new_stream(ctx, NULL);
- if (!st)
- return AVERROR(ENOMEM);
- st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
- st->codec->codec_id = ctx->iformat->raw_codec_id;
- //这里就简单的直接赋值为420p
- pix_fmt = AV_PIX_FMT_YUV420P;
- st->time_base.num = s->framerate.den;
- st->time_base.den = s->framerate.num;
- st->pts_wrap_bits = 64;
- st->codec->width = s->width;
- st->codec->height = s->height;
- st->codec->pix_fmt = pix_fmt;
- AVRational tmpRa;
- tmpRa.den = 1;
- tmpRa.num = 8;
- st->codec->bit_rate = av_rescale_q(avpicture_get_size(st->codec->pix_fmt, s->width, s->height),
- tmpRa, st->time_base);
- return 0;
- }
- int mkvideo_read_packet(AVFormatContext *s, AVPacket *pkt)
- {
- int packet_size, ret, width, height;
- AVStream *st = s->streams[0];
- width = st->codec->width;
- height = st->codec->height;
- packet_size = avpicture_get_size(st->codec->pix_fmt, width, height);
- if (packet_size < 0)
- return -1;
- ret = av_get_packet(s->pb, pkt, packet_size);
- pkt->pts = pkt->dts = pkt->pos / packet_size;
- pkt->stream_index = 0;
- if (ret < 0)
- return ret;
- return 0;
- }
- #define OFFSET(x) offsetof(MKVideoDemuxerContext, x)
- #define DEC AV_OPT_FLAG_DECODING_PARAM
- static const AVOption mk_options[] =
- {
- { "video_size", "set frame size", OFFSET(width), AV_OPT_TYPE_IMAGE_SIZE, {.str = NULL}, 0, 0, DEC },
- { "pixel_format", "set pixel format", OFFSET(pixel_format), AV_OPT_TYPE_STRING, {.str = "yuv420p"}, 0, 0, DEC },
- { "framerate", "set frame rate", OFFSET(framerate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, 0, DEC },
- { NULL },
- };
- static const AVClass mk_demuxer_class = {
- .class_name = "mk video demuxer",
- .item_name = av_default_item_name,
- .option = mk_options,
- .version = LIBAVUTIL_VERSION_INT,
- };
- AVInputFormat ff_mk_demuxer = {
- .name = "mk",
- .long_name = NULL_IF_CONFIG_SMALL("MK Video Container"),
- .flags = AVFMT_GENERIC_INDEX,
- .extensions = "mk",
- .priv_class = &mk_demuxer_class,
- .raw_codec_id = AV_CODEC_ID_RAWVIDEO,
- .priv_data_size = sizeof(MKVideoDemuxerContext),
- .read_header = mkvideo_read_header,
- .read_packet = mkvideo_read_packet,
- };
mkdemuxer.h:
- /*
- *实现一个自己的demuxer并加入到demuxer链中去
- *作者:缪国凯(MK)
- *821486004@qq.com
- *2015-6-3
- */
- #ifndef AVFORMAT_MKDEMUXER_H
- #define AVFORMAT_MKDEMUXER_H
- #include "libavutil/opt.h"
- #include "avformat.h"
- int mkvideo_read_header(AVFormatContext *ctx);
- int mkvideo_read_packet(AVFormatContext *s, AVPacket *pkt);
- #endif //AVFORMAT_MKDEMUXER_H
第二步:
在libavformat下的allformats.c的av_register_all里加入:
- REGISTER_DEMUXER (MK, mk);//add ByMK for mk demuxer
第三步:
在libavformat目录下的makefile文件的# muxers/demuxers后加入:
- OBJS-$(CONFIG_MK_DEMUXER) += mkdemuxer.o
第四步:
在ffmpeg根目录的config.h里加入:
- #define CONFIG_MK_DEMUXER 1
第五步:
- CONFIG_MK_DEMUXER=yes
OK,按照正常的编译去编译ffmpeg,然后运行ffmpeg.exe输入ffmpeg -formats 看到有mk这个muxer了,如下:
- DE mk mk (MK Video Container)
- E mkvtimestamp_v2 extract pts as timecode v2 format, as defined by mkvtoolnix
- DE mlp raw MLP
- D mlv Magic Lantern Video (MLV)
- D mm American Laser Games MM
- DE mmf Yamaha SMAF
- 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
把自定义的demuxer加入ffmpeg源码的更多相关文章
- 把自定义的decoder加入ffmpeg源码
第一步: 在libavcodec目录下新建mkdecoder.c,并加入一下代码: /* *实现一个自己的decoder,编码工作其实就是把pkt的数据拷贝到frame *作者:缪国凯(MK) *82 ...
- ffmpeg源码编译安装(Compile ffmpeg with source) Part 1 : 通用部分
本页内容包含了在Unix/Linux中用源码包编译的通用的结构 可能不仅仅适用于ffmpeg 为啥使用源码包编译 编译源码可以扩展功能, 实现相对于自己平台的最优化, 还可以自定义的修改 概述 大部分 ...
- 最新版ffmpeg源码分析
最新版ffmpeg源码分析一:框架 (ffmpeg v0.9) 框架 最新版的ffmpeg中发现了一个新的东西:avconv,而且ffmpeg.c与avconv.c一个模样,一研究才发现是libav下 ...
- 修改FFMpeg源码—捕获丢包
概述 最近我们项目有一个需求就是解决客户端播放RTSP视频流花屏的问题,一般来说丢包就会引起花屏,导致客户端花屏的因素又有很多,比如说: 相机到服务器丢包 服务器到客户端丢包 等等... 其中服务器到 ...
- FFmpeg源码结构图 - 解码
===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFm ...
- FFmpeg源码简单分析:libswscale的sws_scale()
===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFm ...
- FFmpeg源码结构图 - 编码
===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFm ...
- FFmpeg源码简单分析:结构体成员管理系统-AVOption
===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFm ...
- ffmpeg源码编译环境搭建
ffmpeg是视频开发最常用到的开源软件,FFmpeg功能强大,用途广泛,提供几乎所有你能够想到的与视频开发相关的操作,许多商业软件都以ffmpeg为基础进行开发定制. FFmpeg: FFmpeg ...
随机推荐
- Mysql主从复制,实现数据同步
大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢 ...
- Linux进程间通信(五) - 信号灯(史上最全)及其经典应用案例
信号灯概述 什么是信号灯 信号灯用来实现同步,用于多线程,多进程之间同步共享资源(临界资源). PV原语:信号灯使用PV原语 P原语操作的动作是: u sem减1. u sem减1后仍大于或等于零 ...
- python tensorflow 安装
我是先下载tensorflow-1.5.0rc1-cp36-cp36m-win32.whl,再执行命令行安装的 下载地址:https://pypi.python.org/pypi/tensorflow ...
- ubuntu16.04下hive安装与配置
Hive是什么? 由Facebook开源用于解决海量 结构化日志的数据统计: Hive是基于Hadoop的一个 数据仓库工具,可以将结构化的数据文件映射 成一张表,并提供类SQL查询功能: 构建在Ha ...
- 20179209《Linux内核原理与分析》第十二周作
缓冲区溢出漏洞实验 缓冲区溢出简介 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据缓冲器 ...
- 我的Android进阶之旅------>Android 标签的用法
布局资源文件的根节点可以使用容器控件(如LinearLayout.FrameLayout等),也可以使用非容器控件(如:EditText.TextView等).对于非容器控件,只能在非容器控件标签中放 ...
- activiti基础--3-----------------------------流程实例
一.流程实例用到的表: select * from act_ru_execution #正在执行的任务表 select * from act_hi_procinst #流程实例的历史表 select ...
- 【Prometheus】第三篇:配置alertmamager
监控系统中非常重要的一环,就是告警,系统得在故障发生的第一时间将事件发送出来,通知干系人,prometheus提供了alertmanager来实现这个功能. 第一步:prometheus.yml配置文 ...
- java获取调用此方法的上面的方法名、类
StackTraceElement[] stacks = (new Throwable()).getStackTrace(); for (StackTraceElement stack : stack ...
- [原创]java WEB学习笔记01:javaWeb之tomcat的安装和配置
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...