音视频聊天开发: 2 视频编解码并显示
来源:互联网 发布:邮箱域名怎么写 编辑:程序博客网 时间:2024/05/16 00:42
前面说到了视频采集和显示,显示使用的是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;
};
看过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请从官网直接下载,然后把.dll放在bin 目录下,.lib放在 lib目录下就可以了。
完整源码工程在:https://github.com/sxcong/rttim
附件里只是本文的内容的源码,不带dll,lib等文件。
Client_2.7z
或者使用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;
};
========================
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请从官网直接下载,然后把.dll放在bin 目录下,.lib放在 lib目录下就可以了。
完整源码工程在:https://github.com/sxcong/rttim
附件里只是本文的内容的源码,不带dll,lib等文件。
Client_2.7z
0 0
- 音视频聊天开发: 2 视频编解码并显示
- 音视频编解码开发经验2
- 音视频编解码
- 音视频编解码开发经验1
- 音视频编解码学习2
- 音视频编解码基础知识
- 音视频编解码基础知识
- 音视频编解码基础知识
- LINUX 音视频编解码
- 音视频编解码详解
- 音视频编解码基础知识
- 音视频编解码知识
- 音视频编解码过程
- 音视频编解码概述
- 各种音视频编解码
- h264视频编解码
- 视频编解码博客
- 视频编解码概述
- Test.py文件解析
- 指针和引用
- 批量修改数据提交
- 记录:AndroidContentProvider的使用
- LeetCode:Single Number I & II & III
- 音视频聊天开发: 2 视频编解码并显示
- 如何使用JDBC实现数据访问对象层(DAO)
- 解决vs2005使用调试功能就报错的问题
- php中的命名空间namespace
- sguap 所接触到的名称
- js闭包
- html全屏
- 十六进制数据与字符串的相互转换
- jQuery+ThinkPHP+Ajax实现即时消息提醒功能