音视频聊天开发: 2 视频编解码并显示-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 1235577
  • 博文数量: 76
  • 博客积分: 1959
  • 博客等级: 上尉
  • 技术积分: 2689
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-19 12:07
个人简介

樽中酒不空

文章分类

全部博文(76)

文章存档

2020年(4)

2019年(1)

2017年(2)

2016年(2)

2015年(7)

2014年(11)

2013年(13)

2012年(18)

2011年(2)

2010年(16)

相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: c/c

2014-10-08 14:49:54

       前面说到了视频采集和显示,显示使用的是gdi,小画面没问题,如果画面放大变失真比较严重。如果要显示的好的话,可以用dshow内置的预览功能。
或者使用d3d,opengl显示。这是以后的工作,当前还是继续实现主要功能。
       本文主要以实现视频的编码和解码为主。
        参考ffmpeg源码中所带的例子,见:doc\examples\decoding_encoding.c。原文是c的,这里简单封装成class。继续前面的原则:以最简单的方法先实现功能,暂不考虑完美完善优雅之类的形容词。
       文中只简单讲一下接口和注意事项,其他详见附件源码。

      编码接口:

typedef void (*vencodecb)(byte* pdata, uint nlen, void* lpparam);
class cvideoenc  
{
public:
cvideoenc();
virtual ~cvideoenc();


int enc_init(uint nwidth,uint nheight,uint nframe,uint nbitrate,vencodecb fcb, void* param);
void enc_uninit();
int encode_frame(byte* input,int nlen);

private:
bool m_binit;
avframe *encode_picture;
avframe *tmp_picture;

uint video_width;
uint video_height;
uint frame_rate;
uint bit_rate;

uint video_outbuf_size ;
uint8_t *video_outbuf;
vencodecb m_fvencodecb;

avcodec *codec;
    avcodeccontext *c;
struct swscontext *img_convert_ctx;
void* m_pparam;
};

=====================================

typedef void (*vdecodecb)(byte* pdata, uint nlen, void* lpparam);


class cvideodec  
{
public:
cvideodec();
virtual ~cvideodec();
int  dec_init(uint nwidth,uint nheight,uint nframe,uint nbitrate,vdecodecb cb, void* param);
void dec_uninit();
int decode_frame(byte* input,int nlen);
private:
avcodec *decode_codec;
avcodeccontext *decode_c;
avframe *decode_picture;
struct swscontext *img_convert_ctx;
uint video_width;
uint video_height;
uint frame_rate;
uint bit_rate;
bool m_binit;
vdecodecb m_fvdecodecb;
void* m_pparam;
};
========================

看过decoding_encoding.c代码的一眼就看出来,这两个class不过是把原来的一个函数内容包装了一下,把变量都放在 class中,没有其他的技术含量。
不过有一个地方要注意,在编码的时候,一定要加个选项:
av_opt_set(c->priv_data, "tune", "zerolatency", 0);
否则,摄像头静止的时候,会有拖尾现象。
正常来讲还有其他选项要加,不过从目前的效果来看还可以接受,就暂时这样了。

另外,编码之后,直接保存成264文件进行播放,有些播放器有可能是倒置的,抓图显示可能也倒置。不过再用ffmpeg解码就正常了。如果想保存成文件或保存成图也是正的,就简单地掉个头好了。简单的矩阵运算,留做思考题,顺便复习一下线性代数。

附件里带了ffmpeg的dll和lib,所以比较大。
看到uint8_t之类的不用奇怪,这是linux下正常的数据类型,相应的头文件都在include目录下。
cu对文件有限制,下面只有源码,ffmpeg的dll和lib请从凯发k8官网下载客户端中心官网直接下载,然后把.dll放在bin 目录下,.lib放在 lib目录下就可以了。

完整源码工程在:
附件里只是本文的内容的源码,不带dll,lib等文件。
阅读(5916) | 评论(3) | 转发(2) |
给主人留下些什么吧!~~

2015-01-06 17:51:24

感谢博主,博主什么时候接着更新啊!我想问一下博主音频的相关内容能介绍一下吗

|

sxcong2014-11-24 21:44:25

:博主 继续啊, 好久没更新了

年底都比较忙啊,估计要春节前后才有空

|

2014-11-16 00:34:25

博主 继续啊, 好久没更新了

|
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图