pjmedia是pjsip的视频部分,官网明确提示,要想使用pjmedia离不开directshow/sdl/ffmpeg这三个库。

软件版本的限制:

ffmpeg不能高于1.25。(建议下载1.01左右的版本)

pjsip下载版本要高于2.0.

directshow/sdl/ffmpeg在pjmedia的作用:

directshow:流媒体开发包,负责音视频的捕捉等。

ffmpeg:主要用于视频的编解码。

SDL:用于视频的播放。

下面贴出一博主建议先熟悉的例子:

pjmedia_test 视频的捕捉和播放
pjmedia 的视频捕捉和传输vid_streamutil.c
simpleua.c 简单的sip 和视频的协作
pjsip_ua.c 完整的sip 和视频的协作

上面的例子源码可以在pjmedia_test工程和sample中找到。

下面简单的实现一下视频的捕捉和播放。

首先简单了解一些函数:

pjmedia_vid_dev_get_info   获取端口信息

pjmedia_vid_dev_default_param  初始化视频设备用特定设备的参数值

http://www.pjsip.org/pjmedia/docs/html/group__video__device__reference.htm#gafe6d82fb429b088fac5811d01921928a

enum pjmedia_dir

关于Media direction.

Enumerator
PJMEDIA_DIR_NONE 

None

PJMEDIA_DIR_ENCODING 

Encoding (outgoing to network) stream, also known as capture

PJMEDIA_DIR_CAPTURE 

Same as encoding direction.

PJMEDIA_DIR_DECODING 

Decoding (incoming from network) stream, also known as playback.

PJMEDIA_DIR_PLAYBACK 

Same as decoding.

PJMEDIA_DIR_RENDER 

Same as decoding.

PJMEDIA_DIR_ENCODING_DECODING 

Incoming and outgoing stream, same as PJMEDIA_DIR_CAPTURE_PLAYBACK

PJMEDIA_DIR_CAPTURE_PLAYBACK 

Same as ENCODING_DECODING

PJMEDIA_DIR_CAPTURE_RENDER 

Same as ENCODING_DECODING

关于pjmedia_vid_dev_info结构体各个成员说明:

pjmedia_vid_dev_index pjmedia_vid_dev_info::id

The device ID

char pjmedia_vid_dev_info::name[64]

The device name

char pjmedia_vid_dev_info::driver[32]

The underlying driver name

pjmedia_dir pjmedia_vid_dev_info::dir

The supported direction of the video device, i.e. whether it supports capture only, render only, or both.

pj_bool_t pjmedia_vid_dev_info::has_callback

Specify whether the device supports callback. Devices that implement "active interface" will actively call the callbacks to give or ask for video frames. If the device doesn't support callback, application must actively request or give video frames from/to the device by using pjmedia_vid_dev_stream_get_frame()/pjmedia_vid_dev_stream_put_frame().

unsigned pjmedia_vid_dev_info::caps

Device capabilities, as bitmask combination of pjmedia_vid_dev_cap

unsigned pjmedia_vid_dev_info::fmt_cnt

Number of video formats supported by this device

pjmedia_format pjmedia_vid_dev_info::fmt[PJMEDIA_VID_DEV_INFO_FMT_CNT]

Array of supported video formats. Some fields in each supported video format may be set to zero or of "unknown" value, to indicate that the value is unknown or should be ignored. When these value are not set to zero, it indicates that the exact format combination is being used.

 //video captrue and show
#include<pjmedia.h>
#include<pjmedia_audiodev.h>
#include<pjmedia_videodev.h>
#include<pjmedia-codec.h>
#include<pjlib.h>
pj_pool_factory *mem;
static find_device(pjmedia_dir dir,pj_bool_t has_callback)
{
unsigned i,count=pjmedia_vid_dev_count();
// printf("count=%d\n",count);
for(i=;i<count;i++)
{
pjmedia_vid_dev_info cdi;
if(pjmedia_vid_dev_get_info(i,&cdi)!=PJ_SUCCESS)
continue;
if((cdi.dir & dir)!=&& cdi.has_callback==has_callback)
return i;
}
return -;
}
static int capture_render_lookback(pj_bool_t active,int cap_dev_id,int rend_dev_id,const pjmedia_format *fmt)
{
pj_pool_t *pool;
pjmedia_vid_port *capture=NULL,*renderer=NULL;
pjmedia_vid_dev_info cdi,rdi;
pjmedia_vid_port_param param;
pjmedia_video_format_detail *vfd;
pj_status_t status;
int rc=,i; pool=pj_pool_create(mem,"vidportloop",,,NULL);
/*
status=pjmedia_vid_dev_get_info(rend_dev_id,&cdi);
if(status!=PJ_SUCCESS)
{
printf("cdi failed\n");
}
status=pjmedia_vid_dev_get_info(rend_dev_id,&rdi);
if(status!=PJ_SUCCESS)
{
printf("rend failed\n");
}
*/
pjmedia_vid_port_param_default(&param);
//create capture
status=pjmedia_vid_dev_default_param(pool,cap_dev_id,&param.vidparam);
if(status!=PJ_SUCCESS)
{
printf("param failed\n");
}
param.vidparam.dir=PJMEDIA_DIR_CAPTURE;
param.vidparam.fmt=*fmt;
param.active=PJ_TRUE; vfd=pjmedia_format_get_video_format_detail(&param.vidparam.fmt,PJ_TRUE);
if(vfd==PJ_SUCCESS)
{
printf("get vfd failed\n");
} status=pjmedia_vid_port_create(pool,&param,&capture);
if(status!=PJ_SUCCESS)
{
printf("vid create failed\n");
}
//create render
status=pjmedia_vid_dev_default_param(pool,rend_dev_id,&param.vidparam);
if(status!=PJ_SUCCESS)
{
printf("render param failed\n");
}
param.active=PJ_FALSE;
param.vidparam.dir=PJMEDIA_DIR_RENDER;
param.vidparam.rend_id=rend_dev_id;
param.vidparam.fmt=*fmt;
param.vidparam.disp_size=vfd->size; status=pjmedia_vid_port_create(pool,&param,&renderer);
if(status!=PJ_SUCCESS)
{
printf("render vid port create failed\n");
} // set event handler //connect capture to renderer
status=pjmedia_vid_port_connect(capture,pjmedia_vid_port_get_passive_port(renderer),PJ_FALSE);
if(status!=PJ_SUCCESS)
{
printf("connect failed\n");
} status=pjmedia_vid_port_start(renderer);
if(status!=PJ_SUCCESS)
{
printf("renderer start failed\n");
} status=pjmedia_vid_port_start(capture);
if(status!=PJ_SUCCESS)
{
printf("capture start failed\n");
} return rc;
}
int main()
{
int i,j,k,l;
int count;
int cap_id,rend_id;
pj_status_t status;
pj_caching_pool caching_pool;
pj_pool_t *pool; pjmedia_format fmt;
pjmedia_format_id test_fmts[]={
PJMEDIA_FORMAT_RGBA,
PJMEDIA_FORMAT_I420,
// PJMEDIA_FORMAT_H261
}; pj_init();//pjlib init
pj_caching_pool_init(&caching_pool,&pj_pool_factory_default_policy,);//init
pool=pj_pool_create(&caching_pool.factory,"test",,,NULL);
mem=&caching_pool.factory; pjmedia_video_format_mgr_create(pool, , , NULL);
pjmedia_converter_mgr_create(pool, NULL);
pjmedia_event_mgr_create(pool, , NULL);
pjmedia_vid_codec_mgr_create(pool, NULL); status=pjmedia_vid_dev_subsys_init(mem); //get the video device's id
cap_id=find_device(PJMEDIA_DIR_CAPTURE,);
rend_id=find_device(PJMEDIA_DIR_RENDER,); //printf("c=%d,r=%d\n"); pjmedia_format_init_video(&fmt,test_fmts[],,,,);
capture_render_lookback(,cap_id,rend_id,&fmt); getchar(); }

最新文章

  1. mysql ,服务器耗时测试
  2. appCan uexLocation 定位功能
  3. Request 、Response 与Server的使用
  4. 使用 SVG 实现一个漂亮的页面预加载效果
  5. C语言基础学习
  6. httpsClient抓取证书
  7. asp.net运行原理(一)总体概要
  8. Sdut 2164 Binomial Coeffcients (组合数学) (山东省ACM第二届省赛 D 题)
  9. Spring+SpringMVC+MyBatis深入学习及搭建(七)——MyBatis延迟加载
  10. Windows下memcached的安装配置
  11. SQL优化 MySQL版 - 避免索引失效原则(二)
  12. 重写 final关键字 多态调用子类特有的属性及行为(向上向下转型)
  13. 微信小程序--录音
  14. t-sql对被除数为0&amp;除数小于被除数结果为0&amp;除法保留2位小数的处理
  15. ijkplayer之.so文件编译过程
  16. spring之跨模块引用配置文件
  17. js滚动分页原理
  18. C# 使用Xamarin开发Android应用程序
  19. [转]Elasticsearch Java API总汇
  20. ASP.NET 构建高性能网站 第1篇

热门文章

  1. NFS笔记(二)NFS服务器配置实例
  2. Python基础学习之标识符
  3. MySQL的基础(优化)1
  4. 显示C++ vector中的数据
  5. STM32开发-MDK新建工程及配置
  6. 背包问题模板,POJ(1014)
  7. 计算最大矩形面积,POJ(2082)
  8. Java中JSON字符串与java对象的互换实例详解
  9. Maven项目导出可执行jar
  10. HDU.2561 第二小整数(water)