.简介:把上一篇文章中的muxer加入ffmpeg源码中去,使可以用命令行方式调用自定义的muxer
第一步:
在libavformat目录下新建mkmuxer.c和mkmuxer.h,代码如下:
mkmuxer.c:
/*
*实现一个自己的muxer(只为了熟悉框架,这个muxer其实是yuv,muxer)
*作者:缪国凯(MK)
*821486004@qq.com
*2015-6-2
*/
#include "mkmuxer.h"
int mk_write_header(AVFormatContext *fmt)
{
//这些地方就可以加入自己的格式定义
return 0;
}
int mk_write_packet(AVFormatContext *fmt, AVPacket *pkt)
{
avio_write(fmt->pb, pkt->data, pkt->size);//简单的用file协议写文件
return 0;
}
int mk_write_trailer(AVFormatContext *fmt)
{
//这些地方就可以加入自己的格式定义
return 0;
}
//#if CONFIG_MK_MUXER
AVOutputFormat ff_mk_muxer =
{
.name = "mk",
.long_name = NULL_IF_CONFIG_SMALL("mk (MK Video Container)"),
.mime_type = "mkvideo/x-msvideo",
.extensions = "mk",
.audio_codec = AV_CODEC_ID_NONE,
.video_codec = AV_CODEC_ID_RAWVIDEO,//这里先用ffmpeg自带的yuv编码器,以后改成自己的
.subtitle_codec = AV_CODEC_ID_NONE,
.flags = AVFMT_NOTIMESTAMPS,
.priv_data_size = 0,
.write_header = mk_write_header,
.write_packet = mk_write_packet,
.write_trailer = mk_write_trailer,
};
//#endif
mkmuxer.h:
/*
*实现一个自己的muxer(只为了熟悉框架,这个muxer其实是yuv,muxer)
*作者:缪国凯(MK)
*821486004@qq.com
*2015-6-2
*/
#ifndef AVFORMAT_MKMUXER_H
#define AVFORMAT_MKMUXER_H
#include "avformat.h"
int mk_write_header(AVFormatContext *fmt);
int mk_write_packet(AVFormatContext *fmt, AVPacket *pkt);
int mk_write_trailer(AVFormatContext *fmt);
#endif /* AVFORMAT_RAWENC_H */
第二步:
在libavformat下的allformats.c的av_register_all里加入:REGISTER_MUXER (MK, mk);//add ByMK for mk muxer
第三步:
在libavformat目录下的makefile文件的# muxers/demuxers后加入:OBJS-$(CONFIG_MK_MUXER) += mkmuxer.o
第四步:
在ffmpeg根目录的config.h里加入:
#define CONFIG_MK_MUXER 1
DE m4v raw MPEG-4 video
E matroska Matroska
D matroska,webm Matroska / WebM
E md5 MD5 testing
D mgsts Metal Gear Solid: The Twin Snakes
DE microdvd MicroDVD subtitle format
DE mjpeg raw MJPEG video
E mk mk (MK Video Container)</span>
E mkvtimestamp_v2 extract pts as timecode v2 format, as defined by mkvtoolnix
再试一下命令:ffmpeg -i test.avi -y test.mk。
拿结果改为yuv后缀,用播放器试试。
成功!OK,大功告成。
原理在上一篇的博文中已经讲到了,下一步,实现自己的demuxer。