Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4027156
  • 博文数量: 366
  • 博客积分: 9916
  • 博客等级: 中将
  • 技术积分: 7195
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-29 23:27
个人简介

简单!

文章分类

全部博文(366)

文章存档

2013年(51)

2012年(269)

2011年(46)

分类: LINUX

2013-01-08 23:12:45

ffmpeg基本库的介绍:
  1. libavcodec:codec其实是Coder/Decoder的缩写,也就是编码解码器;
  2. libavdevice:对输出输入设备的支持;
  3. libavformat:对音频视频格式的解析
  4. libavutil:集项工具;
  5. libpostproc:后期效果处理;
  6. libswscale:视频场景比例缩放、色彩映射转换;


获取视频时间源码:

  1. #include "libavcodec/avcodec.h"
  2. #include "libavformat/avformat.h"
  3. #include "libavutil/avstring.h"
  4.  
  5. void print_error(const char *filename, int err)
  6. {
  7.     char errbuf[128];
  8.     const char *errbuf_ptr = errbuf;
  9.   
  10.     if (av_strerror(err, errbuf, sizeof(errbuf)) < 0)
  11.         errbuf_ptr = strerror(AVUNERROR(err));
  12.     av_log(NULL, AV_LOG_ERROR, "%s: %s\n", filename, errbuf_ptr);
  13. }

  14. void print_duration(int seconds)
  15. {
  16.     av_log(NULL,0,"duration [hh]:[mm]:[ss] %02d:%02d:%02d\n", seconds/60/60,seconds/60%60,seconds%60);
  17. }

  18. int main(int argc, char *argv[])
  19. {
  20.     int ret = 0, err = 0;
  21.     char filename[1024];
  22.     AVFormatContext *ic = NULL;
  23.     AVInputFormat *iformat = NULL;
  24.     AVDictionary *format_opts = NULL;
  25.     AVDictionaryEntry *t;
  26.  
  27.     if(argc < 2) {
  28.         printf("usage:%s filename\n", argv[0]);
  29.         return -1;
  30.     }

  31.     av_strlcpy(filename, argv[1], strlen(argv[1]));
  32.  
  33.     av_register_all();
  34.  
  35.     err = avformat_open_input(&ic, filename, iformat, &format_opts);
  36.     if (err < 0) {
  37.         print_error(filename, err);
  38.         ret = -1;
  39.         goto fail;
  40.     }

  41.     print_duration(ic->duration/1000/1000);

  42.   fail:
  43.     if (ic) {
  44.         avformat_close_input(&ic);
  45.     }

  46.     return ret;
  47. }

1.准备文件名

      首先使用avutil库提供的字符串复制函数av_strlcpy将输入的参数复制到filename这个字符串中。当需要找av_strlcpy在哪个头文件中声明的时候,使用以下命令:

  1. $ grep "av_strlcpy" * -i -n -r -s --include "*.h"
  2. libavutil/avstring.h:84:size_t av_strlcpy(char *dst, const char *src, size_t size);
2.初始化编解码器

      调用avcodec_register_all()完成编解码器等的注册。


3.打开文件
       过去使用av_open_input_file()函数打开视频文件,在新版的avformat中,使用下面的函数进行视频文件的打开。
  1. int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)
        AVFormatContext这个结构体描述了一个媒体文件或媒体流的构成和基本信息,这个结构由avformat_open_input在内部创建并以缺省值初始化部分成员,创建函数为avformat_alloc_context()。如果调用者希望自己创建该结构,则需要显式为该结构的一些成员置缺省值——如果没有缺省值的话,会导致之后的动作产生异常。
       注:该接口的最后两个参数不能为NULL,否则会出现段错误。

4.出错处理
       大型程序需要很多出错处理,一是避免错误蔓延,二是可以提供debug信息。如果打开视频文件头信息过程出现错误,打印错误信息并将返回值置为-1,默认认为0是成功返回。最后跳转到fail进行内存释放。

5.获取播放时长

       写了个简单函数来打印视频文件的播放时长。


6.退出前处理

       由于调用了avformat_alloc_context()申请内存,退出前需要调用avformat_close_input()释放内存。


阅读(8301) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~