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源码

第一步:

在libavcodec目录下新建mkdecoder.c,并加入一下代码:
[cpp] view plain copy
 
  1. /*  
  2. *实现一个自己的decoder,编码工作其实就是把pkt的数据拷贝到frame 
  3. *作者:缪国凯(MK)  
  4. *[email protected]  
  5. *2015-6-5  
  6. */   
  7. #include "avcodec.h"  
  8.   
  9. static av_cold int mk_init_decoder(AVCodecContext *avctx)  
  10. {  
  11.     printf("init mk decoder\n");  
  12.     return 0;  
  13. }  
  14.   
  15. static int mk_decode(AVCodecContext *avctx, void *data, int *got_frame,  
  16.     AVPacket *avpkt)  
  17. {  
  18.     AVFrame   *frame   = (AVFrame*)data;  
  19.     AVPicture *picture = (AVPicture*)data;  
  20.     const uint8_t *buf             = avpkt->data;  
  21.     int buf_size                   = avpkt->size;  
  22.   
  23.     int size = avpicture_get_size(avctx->pix_fmt, avctx->width,  
  24.         avctx->height);  
  25.   
  26.     frame->pict_type        = AV_PICTURE_TYPE_I;  
  27.     frame->key_frame        = 1;  
  28.       
  29.     frame->buf[0] = av_buffer_alloc(size);  
  30.       
  31.     memcpy(frame->buf[0]->data, buf, buf_size);  
  32.   
  33.     int res = 0;  
  34.     if ((res = avpicture_fill(picture, frame->buf[0]->data, avctx->pix_fmt,  
  35.         avctx->width, avctx->height)) < 0)   
  36.     {  
  37.             av_buffer_unref(&frame->buf[0]);  
  38.             return res;  
  39.     }  
  40.   
  41.     *got_frame = 1;  
  42.     return 0;  
  43. }  
  44.   
  45. static av_cold int mk_close_decoder(AVCodecContext *avctx)  
  46. {  
  47.     printf("init mk decoder\n");  
  48.     return 0;  
  49. }  
  50.   
  51. AVCodec ff_mkvideo_decoder = {  
  52.     .name           = "mkvideo",  
  53.     .long_name      = "mk video",  
  54.     .type           = AVMEDIA_TYPE_VIDEO,  
  55.     .id             = AV_CODEC_ID_MKVIDEO,  
  56.     .capabilities   = CODEC_CAP_PARAM_CHANGE,     
  57.     .init           = mk_init_decoder,    
  58.     .decode         = mk_decode,  
  59.     .close          = mk_close_decoder,  
  60. };  

第二步:

在avcodec.h里的 enum AVCodecID 最后加入:
[cpp] view plain copy
 
  1. AV_CODEC_ID_MKVIDEO,  

第三步:

在allcodec.c的void avcodec_register_all(void)函数中加入
[cpp] view plain copy
 
  1. REGISTER_DECODER(MKVIDEO,          mkvideo);    

第四步:

在libavcodec的makefile里加入:
[cpp] view plain copy
 
  1. OBJS-$(CONFIG_MKVIDEO_DECODER)              += mkdecoder.o  

第五步:

在ffmpeg根目录config.h里加入:
[cpp] view plain copy
 
  1. #define CONFIG_MKVIDEO_DECODER 1   

第六步:

在codec_desc.c的static const AVCodecDescriptor codec_descriptors[] 中加入:
[cpp] view plain copy
 
  1. {  
  2.         .id        = AV_CODEC_ID_MKVIDEO,  
  3.         .type      = AVMEDIA_TYPE_VIDEO,  
  4.         .name      = "mkvideo",  
  5.         .long_name = NULL_IF_CONFIG_SMALL("mk video"),  
  6.         .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,  
  7. },  

第七步:

把以前实现的mkdemuxer的codeid改为
[cpp] view plain copy
 
  1. AV_CODEC_ID_MKVIDEO  

第八步:

重新编译ffmpeg。

测试:

运行命令:ffmpeg -decoders:在显示中找到自己的decoder:
[cpp] view plain copy
 
  1. VF...D mimic                Mimic  
  2. V....D mjpeg                MJPEG (Motion JPEG)  
  3. V....D mjpegb               Apple MJPEG-B  
  4. V..... mkvideo              mk video  
运行命令:
[cpp] view plain copy
 
  1. ffmpeg -s 1280x720 -i test.mk -y test.avi  
生成test.avi,并在转码过程中打出在代码中添加的标记:
[cpp] view plain copy
 
  1. init mk decoder  
播放test.avi,能正确播放,ok,成功!

以上是关于ffmpeg decode, encode, transcode, mux, demux, stream, filter的区别的主要内容,如果未能解决你的问题,请参考以下文章

Linux-安装FFmpeg

FFMPEG入门篇

FFMPEG入门篇

c++ ffmpeg如何获取RTP包中的Seq和timestamp

ffmpeg里有x264么

使用ffmpeg实现转码样例(代码实现)