ffmpeg decode, encode, transcode, mux, demux, stream, filter的区别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ffmpeg decode, encode, transcode, mux, demux, stream, filter的区别相关的知识,希望对你有一定的参考价值。
我知道decode解码encode编码transcode转码,其他的是什么
ffmpeg--多媒体视频处理工具
简单的说,ffmpeg有视频采集功能、视频格式转换、视频抓图、给视频加水印
值得注意的是,ffmpeg只是提供了编码解码的接口。
decode--译码,解码工具
如:H264 decode
encode--解码
值得一提的是:encode+decode=codec(编码方式)
demux是“解析格式”,比如MKV,MOV是格式(专业的叫法是容器)
格式内有stream,每个stream可能是影像,声音,或字幕,影像声音字幕
总的来说:demux是“解析格式”,比如MKV,MOV是格式,容器内有很多stream,每个stream可能是影像,声音,或字幕,影像声音字幕又各自有不同的编码方式,如H264,AAC,SRT。decode对应于编码方式,如H264 decode.
参考技术A 1)windows平台static library/shared library, 编译工具:mingw-gcc或者在linux平台下交叉编译(推荐)2)linux平台static library/shared library, 编译工具:gcc
模块:
libavcodec - 编码解码器
libavdevice - 输入输出设备的支持
libavfilter - 视音频滤镜支持
libavformat - 视音频等格式的解析
libavutil - 工具库
libpostproc - 后期效果处理
libswscale - 图像颜色、尺寸转换追问
放你妈的狗屁
libavutil
libavcodec
libavformat
libavdevice
libavfilter
libswresample
放你妈的狗屁
libavutil
libavcodec
libavformat
libavdevice
libavfilter
libswresample
把自定义的decoder加入ffmpeg源码
第一步:
- /*
- *实现一个自己的decoder,编码工作其实就是把pkt的数据拷贝到frame
- *作者:缪国凯(MK)
- *[email protected]
- *2015-6-5
- */
- #include "avcodec.h"
- static av_cold int mk_init_decoder(AVCodecContext *avctx)
- {
- printf("init mk decoder\n");
- return 0;
- }
- static int mk_decode(AVCodecContext *avctx, void *data, int *got_frame,
- AVPacket *avpkt)
- {
- AVFrame *frame = (AVFrame*)data;
- AVPicture *picture = (AVPicture*)data;
- const uint8_t *buf = avpkt->data;
- int buf_size = avpkt->size;
- int size = avpicture_get_size(avctx->pix_fmt, avctx->width,
- avctx->height);
- frame->pict_type = AV_PICTURE_TYPE_I;
- frame->key_frame = 1;
- frame->buf[0] = av_buffer_alloc(size);
- memcpy(frame->buf[0]->data, buf, buf_size);
- int res = 0;
- if ((res = avpicture_fill(picture, frame->buf[0]->data, avctx->pix_fmt,
- avctx->width, avctx->height)) < 0)
- {
- av_buffer_unref(&frame->buf[0]);
- return res;
- }
- *got_frame = 1;
- return 0;
- }
- static av_cold int mk_close_decoder(AVCodecContext *avctx)
- {
- printf("init mk decoder\n");
- return 0;
- }
- AVCodec ff_mkvideo_decoder = {
- .name = "mkvideo",
- .long_name = "mk video",
- .type = AVMEDIA_TYPE_VIDEO,
- .id = AV_CODEC_ID_MKVIDEO,
- .capabilities = CODEC_CAP_PARAM_CHANGE,
- .init = mk_init_decoder,
- .decode = mk_decode,
- .close = mk_close_decoder,
- };
第二步:
- AV_CODEC_ID_MKVIDEO,
第三步:
- REGISTER_DECODER(MKVIDEO, mkvideo);
第四步:
- OBJS-$(CONFIG_MKVIDEO_DECODER) += mkdecoder.o
第五步:
- #define CONFIG_MKVIDEO_DECODER 1
第六步:
- {
- .id = AV_CODEC_ID_MKVIDEO,
- .type = AVMEDIA_TYPE_VIDEO,
- .name = "mkvideo",
- .long_name = NULL_IF_CONFIG_SMALL("mk video"),
- .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
- },
第七步:
- AV_CODEC_ID_MKVIDEO
第八步:
测试:
- VF...D mimic Mimic
- V....D mjpeg MJPEG (Motion JPEG)
- V....D mjpegb Apple MJPEG-B
- V..... mkvideo mk video
- ffmpeg -s 1280x720 -i test.mk -y test.avi
- init mk decoder
以上是关于ffmpeg decode, encode, transcode, mux, demux, stream, filter的区别的主要内容,如果未能解决你的问题,请参考以下文章