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(); }

PJMEID学习之视频的捕捉与播放的更多相关文章

  1. iOS视频边下载边播放

    随着视频行业的发展,很多用户对于观看体验也有了更高的要求,以前的习惯是下载好了在观看,而现在是希望1分钟都不要等,ZUI好一边看着一边下载,等把这个视频看完也下载完了,也就是我们常说的“视频边下载边播 ...

  2. video视频在本地可以播放,在服务器上不可以播放

    今天遇到一个比较坑的问题,视频在本地可以播放,然后放到服务器上面就播放不了,原因是因为服务器上面不支持mp4的播放,下面看解决办法.1.首先进入IIS(Internet Information Ser ...

  3. video视频内容填充整个播放空间方法

    关于video视频内容填充整个播放空间方法一般上传的视频都没法占满video,看起来很不美观,解决办法很简单video{ object-fit:fill;}

  4. 大数据-storm学习资料视频

    storm学习资料视频 https://pan.baidu.com/s/18iQPoVFNHF1NCRBhXsMcWQ

  5. 用MCI处置WAV视频时,怎样才能让视频在当前窗口播放

    用MCI处理WAV视频时,怎样才能让视频在当前窗口播放MCI播放视频默认是新开一个窗口播放,播放完毕返回原来的窗口,想着原来窗口播放如何做? mciSendCommand或mciSendString怎 ...

  6. html5添加视频为背景自动播放

    客户想做个打开官网自动播放一段视频,楼主使用了video标签,即下面的代码:: 于是我在video标签上添加了属性 autoplay=“autoplay” loop=“loop” 然而通过地址栏进去的 ...

  7. 最全的机器学习&深度学习入门视频课程集

    资源介绍 链接:http://pan.baidu.com/s/1kV6nWJP 密码:ryfd     链接:http://pan.baidu.com/s/1dEZWlP3 密码:y82m 更多资源 ...

  8. video.js 视频自动全屏播放

    1.头部引用脚本 <link href="css/video-js.min.css" rel="stylesheet"> <link href ...

  9. 实战深度学习OpenCV(二):读取并播放本地或者摄像头的视频

    一.读取并播放的代码如下: #include "pch.h" #include <iostream> #include <opencv2/core/core.hp ...

随机推荐

  1. VirtualBox虚拟机 host/guest 拷贝粘贴,共享剪贴板,安装guest additions

    Oracle VirtualBox 虚拟机,为了在主机.从机间拷贝文件,共享剪贴板,需要进行设置,以及安装guest additions软件 测试环境 host: windows 7 professi ...

  2. 257. Binary Tree Paths (dfs recurive & stack)

    Given a binary tree, return all root-to-leaf paths. Note: A leaf is a node with no children. Example ...

  3. IOS GCD(线程的 串行、并发 基本使用)

    什么是GCD 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自 ...

  4. httpclient开启代理,获取java中请求的url

    背景:在httpclent做post或者get请求时,请求返回的数据总是和预想的不一致,但是有不知道怎么排查问题,经同事说httpclient可以设置代理,就可以获取请求前数据的一些问题,帮助我排查问 ...

  5. 课程设计__继承与派生,重载<<

    ///继承与派生 #include <iostream> using namespace std; class Point { public: Point (,):x(a),y(b) {} ...

  6. python 3+djanjo 2.0.7简单学习(四)--Django视图

    1.概念 Django 中的视图的概念是「一类具有相同功能和模板的网页的集合」.比如,在一个博客应用中,你可能会创建如下几个视图: 博客首页——展示最近的几项内容. 内容“详情”页——详细展示某项内容 ...

  7. activity 工作流学习(一)

    一.了解工作流 1.工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档.信息或任务的过程自动进行,从而实 ...

  8. C++STL之vector向量容器

    vector向量容器   vector向量容器不但能向数组一样对元素进行随机访问, 还能在尾部插入元素 vector具有内存自动管理的功能, 对于元素的插入和删除, 可动态调整所占的内存空间 vect ...

  9. 2018.7.19 . php复习

    PHP程序设计 1.请写出HTML标记meta的完整英文单词:metadata 2.相当于http文件头作用(向浏览器传回正确和精确地显示网页内容的消息)的meta标记的属性是http-equiv 3 ...

  10. maven环境、本地仓储配置(下载安装)idea配置maven

    在第一步:下载maven 官网地址:http://maven.apache.org/download.cgi 下载后进行解压 解压成功 第二步:环境配置 我的电脑右键->属性->高级系统设 ...