DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  4737 随笔 :: 2 文章 :: 542 评论 :: 1615万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

第一步:

在libavcodec目录下新建mkdecoder.c,并加入一下代码:
[cpp] view plain copy
 
  1. /*  
  2. *实现一个自己的decoder,编码工作其实就是把pkt的数据拷贝到frame 
  3. *作者:缪国凯(MK)  
  4. *821486004@qq.com  
  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,成功!
posted on   DoubleLi  阅读(461)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2013-08-09 VC使用#定义方便控制版本号的宏
2012-08-09 CSDN上关于ToolTip的知识
点击右上角即可分享
微信分享提示