作者: 俞伟
B lackB e r r y 视频 录制编程 概述
Bla c kBer r y 5 .0 平台以及之 前的版 本对多媒 体的支持 依赖于 JS R 135 ,也就是 标准 J2 M E 平台
的 M M A P I 。 Bla c kB er r y 手机上录制 视频也依 靠 M M A P I , 支持 3 g pp 视频格 式, 支持的视 频编 码包括 M P E G - 4 , H 263 , H 264 , 音频编码包括 AAC , P C M , A M R 。 具体的视 频音频 编 码支持 依黑 莓机型而定 。
Bla c kBer r y 视屏 录制编程 包括以下 几部分:
1 . 获取 / 选定手机对视频格式 / 编码的支持
2 . 录制 / 存储视频
3 . 回放已录制的视频
获 取 / 选定视频 格式 / 编码
通过系统提 供的 A P I 可 以获得 该 机型视频 支持的所有 视频 规格:
S t r in g enc o di n g sS t r in g = S ys t em. g etP r op er t y ( " video .en c o di ng s " );
enc o di ng s S t r in g 包含了全 部能够支 持的视频 规格,但 它是一个 S t r in g ,还 不能够直 接使用,
需要进一步 解析。 以 下代码解 析视频规 格,并返 回 规 格列表:
/**
* 获取 黑莓手 机所支持 的视屏规 格列表
*/
p ub l i c s t a t i c S t r in g[ ] g e t Vid eoE nc o di n g s ( )
{
// 获取黑莓 手机设备 支持的视 频格式 / 编码
S t r in g enc o di n g sS t r in g = S ys t em. g etP r op er t y ( " v id eo. enc o di ng s " );
// 如果没有 支持的视 频编码, 返回空
i f ( enc o di ng s S t r in g == n u l l )
{
r et u r n n u ll ;
}
// 解析出视 频规格
Ve c t o r en c o di ng s = n e w Vec t o r() ;
i n t s t ar t = 0 ;
i n t s pa c e = en c o di ng sS t r in g .i nd e xO f ( ' ' );
whil e ( s pa c e ! = - 1 )
{
enc o di n g s .a dd E lem ent ( en c o di ng sS t r in g .s u bs t r in g ( s t ar t , s pa c e) ) ;
s t ar t = s pa c e + 1 ;
s pa c e = enc o di n g sS t r in g .i nd exOf ( ' ' , s t ar t ) ;
}
en c o di ng s .a dd E lem en t ( enc o di ng s S t r in g .s ubs t r in g ( s t ar t , en c o di ng sS t r in g .l en gt h())) ;
S t r in g[ ] enc o di n g Arr ay = n e w S t r in g [ enc o di n g s . s iz e( ) ] ;
en c o di ng s .c o p yInto ( enc o di n g Arr ay) ;
r e t u r n en c o di ng Arr ay;
}
解析后的视 频规格 范 例如下所 示:
“ enc o di ng= vid eo/3 g pp &mo de =st an da r d ”
“ enc o di ng= vid eo/3 g pp &mo de =mm s”
“ enc o di ng= vid eo/3 g pp &w id t h=480 &hei g ht =360 &video _ c o dec = M P E G - 4 &au dio _c o de c =A M R ”
“ enc o di ng= vid eo/3 g pp &w id t h=176 &hei g ht =144 &video _ c o dec =H263 &au dio _c o d ec =A MR ”
“ enc o di ng= vid eo/3 g pp &w id t h=480 &hei g ht =360 &video _ c o dec =H263 &au dio _c o d ec =AA C ”
“ enc o di ng= vid eo/3 g pp &w id t h=480 &hei g ht =360 &video _ c o dec =H264 &au dio _c o d ec =AA C ”
l “ enc o di ng ” 字段 表示视频 格式
l “ mo de” 表示播放模式, 模式会自 动设置屏 幕尺寸 和编 码
l “w id t h” 表示屏幕宽度
l “ hei g h t ” 表示屏幕 高度
l “ video _c o de c ” 表示视 频编码
l “ au dio _c o de c ” 表示音频编 码
视频规格如 图所示:
录 制 、存储 视频
录制视频主 要用到 P la y er , Vid eoC o nt r o l , Re c o r dC o nt r o l , By t eAr r a yOu t pu t S t r eam 。 使用 P la y er 打开摄像头, Vid eoC o nt r o l 将捕捉的视频显示到屏幕上 , R ec o r dC o nt r o l 控制录制过程, Byt eAr r a yOu t pu t S t r eam 作为视频 录制的缓 存 。以下三 段代码范例 分别为配 置 / 启动摄 像头, 开始录制, 和保存 已 录制的视 频。
/**
* 构造一个 屏幕显 示和录制 摄像头录 制的视频
*/
p u bli c Vid eoR ec o r di ng S c r ee n( S t r in g en c o di ng , S t r in g f il e P at h)
{
t r y {
// 开始捕 捉视频
// enc o di n g 是上 一部分 提 到的视频 规格
_ pl ayer = j avax.m i c r o edi t io n.m edi a. M an ag er . c reat eP l a y er ( " c ap t ur e : //vid eo? " + en c o di ng ) ;
_ pl ayer .s t ar t () ;
_ video C o nt r o l = ( Vid eoC o nt r o l) _pl ayer .g e t C o nt r o l( " Vid eoC o nt r o l" );
_r e c o r dC o nt r o l = ( Re c o r dC o nt r o l) _pl ayer .ge t C o nt r o l( " Re c o r dC o nt r o l" );
// 将捕 捉的视频 显示在 F iel d 控件上
F iel d vid eoF iel d = ( F iel d)
_v id eoC o nt r o l .i ni t Dis pl ayM o de( Vid eoC o nt r o l. U SE _G U I_P RIM IT IVE ,
" net .r im .d ev i c e.ap i. ui .F iel d" ) ;
t r y {
}
// 视频尺寸 为全屏
_ video C o nt r o l .s et Dis pl ayS iz e( Dis pl ay .g et W id t h () , Dis pl ay.g et H ei g ht ( ) ) ;
c a t c h ( M edi aE x c ept io n m e )
{ }
ad d( videoF iel d) ;
// 视频 缓存,捕 捉到的视 频将写入 缓存
_ou t S t r eam = n e w By t eArr ayO ut pu t S t r ea m () ;
_v id eoF il e = f il eP at h ;
s t ar t Re c o r d() ;
}
c a t c h ( E xc ept io n e )
{
// Dis pos e o f t he pl a ye r if it w as c r ea t ed
i f ( _pl ayer ! = n u l l )
{
_pl ay er .c los e( ) ;
}
_pl ayer = n u ll ;
del et eA ll () ;
r emo ve A ll M enuI t ems () ;
Vid eoRe c o r di ng Demo . err o rD ia l o g ( e. t oS t r i ng ()) ;
}
}
以上 代码配 置并启动 摄像头 。
/**
* 开始 录制视 频
*/
p r iva t e vo i d s t ar t Re c o r d ()
{
t r y
{
i f ( ! _pendi ng C omm it )
{
// 重置缓存
_ou t S t r eam .r eset () ;
// 将缓存作 为录制缓 存
_r e c o r dC o nt r o l .s et Re c o r dS t r ea m ( _ou t S t r eam );
_p end in g C omm it = t r u e ;
_ c omm itt ed = f a l s e ;
}
// 开始 录制
_r ec o r dC o nt r o l .s t ar t Re c o r d() ;
_r ec o r di ng = t r u e ;
}
c a t c h ( E xc ept io n e )
{
Vid eoRe c o r di ng Demo . err o rD ia l o g ( e. t oS t r i ng ()) ;
}
}
以上 代码开 始录制视 频 。
/**
* 保存 录像
*/
p r iva t e vo i d c omm itRe c o r di ng ( )
{
t r y
{
// 这是最关 键的一步 ,保存录 制的视频
_r ec o r dC o nt r o l .c omm it() ;
// 重置 参数
_pendi ng C omm it = fa l s e ;
_c omm i tt ed = t r u e ;
_r ec o r di ng = fa l s e ;
// 获取 视频数据 流
b yt e [ ] d at a = _ou t S t r eam .t o Byt eArr ay() ;
// 以文 件的形式 保存视频
F il eC o nn ec t io n f c o nn = (F il eC o nn ec t io n) C o nn ec t o r .o p en ( _ videoF il e );
i f (f c o nn .exis t s ()) {
f c o nn .d elet e( ) ;
}
f c o nn .c r ea t e( ) ;
Ou t pu t S t r eam o s = f c o nn .o penO ut pu t S t r eam () ;
os .w r ite( da t a) ; os .f lus h() ; os .c los e( ) ; f c o nn .c los e( ) ;
Di alo g .a le rt ( " C omm i tt ed " );
}
c a t c h ( E xc ep t io n e )
{
VideoRe c o rd i n g Dem o .er r o rD ia l o g ( " Re c o r dC o nt r o l#c omm it( ) t hr ew " + e.t oS t r in g ()) ;
}
}
以上 代码保 存 / 存储视 频。
回 放已录制 的视频
前一步 录制的视 频以文件的 形式 保存在 手机目录中, 回放视频需要文 件 路径, 载 入文件, 使用 P la y er 在 F iel d 上 进行播放 。代码如 下:
/**
* 构造 视频回 放屏幕, 按指定路 径装载视 频文 件
*/
P u b li c Vid eoPla ybac kS c r ee n( S t r in g f il e)
{
b o ol e a n no t E m pt y ;
// 检测给定 路径是否 有媒体文 件
t r y
{
F il eC o nn ec t io n f c o nn = (F il eC o nn ec t io n) C o nn ec t o r . o p en (f il e) ;
no t E m pt y = f c o nn .exis t s ( ) && f c o nn .f il eSi z e( ) > 0 ;
f c o nn .c los e( ) ;
}
c a t c h ( IO E xc e pt io n e )
{
Di alo g .a le r t ( " E xc ep t io n w hi le ac c ess in g t h e video f il esi z e: /n/n" + e) ;
no t E m pt y = fa l s e ;
}
// 如有媒体 文件并有 内容,初 始化界面 进行播放
i f ( no t E m pt y )
{
t r y
{
}
// 创建 Vid eo P la ye r
_ video P la y er = j a vax.m ic r o edi t io n.m e di a. M an ag er . c rea t eP l a y er (f il e) ;
in itS c r ee n() ;
c a t c h ( E xc ept io n e )
{
}
}
e l s e
{
Di alo g . a le rt ( " E xc ept io n w hi le in i t ia li z in g t he pl ayb ac k video pl ayer /n/n " + e) ;
add( n e w L ab elF iel d( " T he v id eo f il e you ar e t r yin g t o pl a y is emp t y " ));
}
}
使用 给定的 路径创建 _v i deo P l a y er 。
p r i va t e v oi d in itS c r ee n( ) t h r o w s E x c ept io n{
_v id eoPla ye r .r eali z e( ) ;
// 注册媒体 播放时间 响应
_v id eoPla ye r .a dd P la ye r L is t ener( n e w P la y er L is t ener ( ) {
p u bli c v oi d pl ayerU pd at e( P la ye r pl ayer , S t r in g ev ent , Ob j e c t e ve nt Da t a) {
// 定义媒体 文件播放 完毕时的 响应
i f ( ev ent == P la ye r L is t ener . EN D_O F _ M E DI A ) { U iA pp li c at io n.g e t U iA pp li c a t i o n () .i nvo keL a t er( n e w R un na bl e() {
p u bli c v o i d r un ( ) { Di alo g .a l ert ( " F in is hed pl ayin g " ); c los e( ) ;
}
} ) ;
}
} ) ;
}
// 获取 Vid eoC o nt r o l 来获 得播放视 频的 F iel d
_v id eoC o nt r o l = ( Vid eoC o nt r o l) _v id eoPla y er .g e t C on t r ol ( " Vid eoC o nt r o l" );
F iel d vFi eld = (F iel d) _v id eoC o nt r o l .i ni t Dis pl ay M o de( Vid eoC o nt r o l.US E _G U I_P RIM IT IVE ,
" ne t .r im .d ev ic e.ap i. ui .F i eld " );
ad d( vFi eld ) ;
// 获取 Vo lum eC o nt r o l 来 指定声音 大小
Vo lum eC o nt r o l vo l = ( Vo lum eC o nt r o l) _v id eoPl ayer .get C on t r ol ( " Vo lum eC o nt r o l" );
vol .s e t L e ve l( 30 ) ;
}
初始化 屏幕 开始回放 视频 。 _v i deo P l a y er .r eali z e( ) 获取视频文件相 关信息 , 为播 放做好准 备。
之 后 _v i deo P l a y er 注 册 了 媒 体 播 放 事 件 侦 听 , 当 媒 体 文 件 播 放 完 毕 时 有 事 件 响 应 。 从
_v i deo P l a y er 中 获取 Vid eoC o nt r o l , Vi deo C o nt r o l 再返 回视屏播放 所占据 的 F ield ,添 加这个
F iel d 到屏幕上来 显示视屏 。 V ol um eC o nt r o l 可以 定义声 音大小, 也 可以从 _ v i deo P l a y er 中获 取。
完 整 代码
类 V i deo R e co r d i n g S c r e e n. j a v a
pa c kage c om .r im .s am pl es. devi c e.video r e c o r di ng demo ;
im p o r t ne t .r im .d ev ic e.ap i. ui .*;
im p o r t ne t .r im .d ev ic e.ap i. ui .c o nt ai ner .* ; im p o r t ne t .r im .d ev ic e.ap i. ui .c om po nent. *; im p o r t ne t .r im .d ev ic e.ap i.s ys t em. Dis pl ay ;
im p o r t j avax.m ic r o edi t io n. io .C o nn ec t o r ;
im p o r t j avax.m ic r o edi t io n. io .f il e.F il eC o nn ec t io n;
im p o r t j avax.m ic r o edi t io n.m edi a. *;
im p o r t j avax.m ic r o edi t io n.m edi a. c o n t r o l. *;
im p o r t j ava.io .By t eArr ayO ut pu t S t r eam ; im p o r t j ava.io .By t eArr ayIn pu t S t r eam ; im p o r t j ava.io .O ut pu t S t r eam ;
/**
* T hi s s c r ee n al lo w s t he us er t o r ec o r d vid eos t o a f il e o r t o a s t r eam and
* enab les t h e us er t o o pen t he Video P la yba c kS c r ee n t o pl ay t he r e c o r ded vid eo.
*/
p u bli c c l a s s Vid eoRe c o r di ng S c r e e n exte n d s M ai nS c r ee n
{
p r iva t e b o ol e a n _p endi ng C omm it ; p r iva t e b o ol e a n _ c omm it t ed ; p r iva t e b o ol e a n _r e c o r di ng ;
p r iva t e S t r in g _v id eoF il e ;
p r iva t e P la ye r _pl a ye r ;
p r iva t e Vid eoC o nt r o l _v id eoC o nt r o l ; p r iva t e Re c o r dC o nt r o l _r ec o r dC o nt r o l ; p r iva t e b o ol e a n _dis pl ay Vis ib le ;
p r iva t e Byt eArr ayO ut pu t S t r eam _ou t S t r eam ;
p ub l i c Vid eoRe c o r di ng S c r ee n( S t r in g enc o di n g , S t r in g f il eP at h)
{
i f ( enc o di ng == nu l l )
{
t h r o w n e w N ul lPoi n t er E xc ep t io n( " Vid eo e nc o di ng c an no t be nul l " );
}
i f (f il eP at h == n ull )
{
}
t r y
{
t h r o w n e w N ul lPoi n t er E xc ep t io n( " F il e pa t h c an no t be nu ll " );
// 开始捕 捉视频
// enc o di n g 是视 频规格
_pl a ye r = j avax.m ic r o edi t io n.m edi a. M an ag er . c reat eP l a y er ( " c ap t ur e: //vid eo? " + en c o di ng ) ;
_pl a ye r .s t ar t () ;
_ video C o nt r o l = ( Vid eoC o nt r o l) _pl ayer .g e t C o nt r o l( " Vid eoC o nt r o l" );
_r e c o r dC o nt r o l = ( Re c o r dC o nt r o l) _pl ayer .g et C o nt r o l( " Re c o r dC o nt r o l" );
// 将捕捉 的视频显 示在 F iel d 控 件上
F iel d videoF iel d = (F iel d) _v id eoC o nt r o l .i ni t Dis pl ayM o de( Vid eoC o nt r o l. U SE _G U I_ P RIM IT IVE ,
" net .r im .d ev i c e.ap i. ui .F iel d" ) ;
t r y {
}
// 视频尺寸 为全屏
_ video C o nt r o l .s et Dis pl ayS iz e( Dis pl ay .g et W id t h () , Dis pl ay. g et H ei ght ( ) ) ;
c a t c h ( M edi aE x c ept io n m e ){
// s et Dis pl ayS iz e is no t s up po r t ed
}
ad d( videoF iel d) ;
// 视频 缓存,捕 捉到的视 频将写入 缓存
_ou t S t r eam = n e w By t eArr ayO ut pu t S t r ea m () ;
_v id eoF il e = f il eP at h ;
s t ar t Re c o r d() ;
}
c a t c h ( E xc ept io n e )
{
// Dis pos e o f t he pl a ye r if it w as c r ea t ed
i f ( _pl ayer ! = n u l l )
{
_pl ay er .c los e( ) ;
}
_pl ayer = n u ll ;
del et eA ll () ;
r emo ve A ll M enuI t ems () ;
Vid eoRe c o r di ng Demo . err o rD ia l o g ( e. t oS t r i ng ()) ;
}
}
/**
* C omm its t h e c urr ent r e c o r di ng
*/
p r iva t e M enuI t em _ c omm it = n e w M enuI te m ( " C o m m it r ec o r di ng " , 0 , 0) {
p u bli c v oi d r un ( ) {
c omm it Re c o r di ng () ;
}
};
/**
* P la ys t he r e c o r di ng
*/
p r iva t e M enuI t em _pl ay Re c o r di ng = n e w M enuI t em ( "P la y r ec o r di ng " , 0 , 0) {
p u bli c v oi d r un ( ) {
// Cr eat e t he pl ayba c k s c r e en fr o m t he c h os en v id eo so ur c e
Vid eoPla yb ac kS c r ee n p la yba c kS c r ee n = n e w Vid eoPla yb ac kS c r ee n( _v id eoF il e );
// H id e t h e video f ee d s in c e w e c an no t di s pl ay v id eo fr o m t he c am er a
// and v id eo fr o m a f il e at t he s am e t im e.
_v id eoC o nt r o l .s et Vis ib le( f a l s e );
_dis pl ayVis ib le = fa l s e ;
U iA pp li c at io n.g e t U iA pp li c a t i on () .p us hS c r e en( pl ayba c kS c r e en) ;
}
};
/**
* Re s et s t h e r ec o r di ng
*/
p r iva t e M enuI t em _r ese t = n e w M enuI t em( " Re s e t r ec o r di ng " , 0 , 0) {
p u bli c v oi d r un ( ) {
t r y {
_r e c o r dC o nt r o l .r eset () ;
}
c a t c h ( E xc ept io n e ){
Vid eo Re c o r di ng Demo . err o rD i a lo g ( " R ec o r dC o nt r o l#r eset t hr ew " + e.t o S t r in g ()) ;
}
}
};
/**
* S ho w s t he video dis pl ay
*/
p r iva t e M enuI t em _sho w Dis pl ay = n e w M enuI t em( " S ho w dis pl ay" , 0 , 0) {
p u bli c v oi d r un ( ) {
_v id eoC o nt r o l .s et Vis ib le( t r u e );
_dis pl ayVis ib le = t r u e ;
}
};
p r iva t e M enuI t em _hi de Dis pl ay = n e w M enuI t e m( " H id e dis pl ay" , 0 , 0) {
/* *
* @ s e e j a va.l an g .Run na bl e# r un ( )
*/
p u bli c v oi d r un ( ) {
_v id eoC o nt r o l .s et Vis ib le( f a l s e );
_dis pl ayVis ib le = fa l s e ;
}
};
p r i va t e M enuI t em _star t R ec o r d = n e w M enuI t em( " S t ar t r ec o r di ng " , 0 , 0) {
p u bli c v oi d r un ( )
{
s t ar t Re c o r d() ;
}
};
p r i va t e M enuI t em _sto pRe c o r d = n e w M enuI t e m( " S t o p r ec o r di ng " , 0 , 0) {
p u bli c v oi d r un ( ) {
s t o pRe c o r d() ;
}
};
p ub l i c b o ol e a n o nC los e() {
// S t o p c ap t ur in g v id eo fr o m t he c am er a
i f ( _pl ayer ! = n ul l ) {
_pl ayer .c los e( ) ;
}
r e t u r n su p e r .o nC los e( ) ;
}
p r o te c te d b o o l e a n o nS aveP r om p t ( ) {
// Su pp r ess t he s ave pr om p t
r e t u r n t r u e ;
}
p r o te c te d v o i d m ake M enu( M enu m enu, i n t ins t an c e) {
s u p e r .m ake M enu( m enu, ins t an c e) ;
i f ( _r e c o r di ng ) {
m enu. ad d( _sto pR ec o r d );
}
e l s e {
}
m enu. ad d( _star t R ec o r d );
i f ( _pendi ng C omm it ) {
m enu. ad d( _c omm i t );
m enu. ad d( _r eset );
}
i f ( _ c omm it t ed ) {
m enu. ad d( _pl ayR ec o r di ng );
}
i f ( _dis pl ayVis ib le ) {
m enu. ad d( _hi deDis pl ay ) ;
}
e l s e {
}
}
m enu. ad d( _sho w Dis pl ay );
p r o te c te d b o o l e a n in vokeA c t io n( in t a c t io n) {
s wi t c h ( a c t io n) {
c a s e A CT ION _IN V O KE : // Tr ac kba ll c li c k
i f ( _r e c o r di ng ) {
in t r espo ns e = Di alo g . a sk ( Di alo g . D_YE S_ N O , " Re c o r di ng paus ed. C omm it r ec o r di ng ? " , Dia lo g . YE S ) ;
i f (r espo ns e == Dia lo g. YE S ) {
t h i s . c omm itR ec o r di ng () ;
}
}
r et u r n t r u e ; // W e' v e c o ns um ed t he ev ent
}
r e t u r n s u p e r .i nvo k eA c t io n( ac t io n) ;
}
p r o te c te d v o i d o nVis ib il ityC ha ng e( b o ol e a n vis ib le) {
i f ( vis ib le && _pl a ye r ! = n ul l ) {
_v id eoC o nt r o l .s et Vis ib le( t r u e );
_dis pl ayVis ib le = t r u e ;
}
}
p r iva t e vo i d s t ar t Re c o r d( ){
t r y {
i f ( ! _pendi ng C omm it ) {
_ou t S t r eam .r eset () ;
// 将缓存作 为录制缓 存
_r e c o r dC o nt r o l .s et Re c o r dS t r ea m ( _ou t S t r eam );
_p endi ng C omm it = t r u e ;
_ c omm itt ed = f a l s e ;
}
// 开始 录制
_r ec o r dC o nt r o l .s t ar t Re c o r d() ;
_r ec o r di ng = t r u e ;
}
c a t c h ( E xc ep t io n e ){ Vid eoRe c o r di ng Demo . err o rD ia l o g ( e. t oS t r i ng ()) ;
}
}
p r iva t e vo i d s t o p Re c o r d( ) {
t r y {
_r ec o r dC o nt r o l .s t o pRe c o r d() ;
_r ec o r di ng = fa l s e ;
}
c a t c h ( E xc ep t io n e ){
Vid eoRe c o r di ng Demo . err o rD ia l o g ( " Re c o r dC o nt r o l#s t o pRec o r d( ) t hr ew " + e.t oS t r in g ()) ;
}
}
p r iva t e vo i d c omm itRe c o r di ng ( ){
t r y {
_r ec o r dC o nt r o l .c omm it() ;
_pendi ng C omm it = fa l s e ;
_c omm i tt ed = t r u e ;
_r ec o r di ng = fa l s e ;
// 获取 视频数据 流
b yt e [ ] d at a = _ou t S t r eam .t o Byt eArr ay() ;
// 以文 件的形式 保存视频
F il eC o nn ec t io n f c o nn = (F il eC o nn ec t io n) C o nn ec t o r .o p en ( _ videoF il e );
i f (f c o nn .exis t s ()) {
f c o nn .d elet e( ) ;
}
f c o nn .c r eat e( ) ;
Ou t pu t S t r eam o s = f c o nn .o penO ut pu t S t r eam () ;
os .w r ite( da t a) ; os .f lus h() ; os .c los e( ) ; f c o nn .c los e( ) ;
Di alo g .a le r t ( " C omm itt ed" );
}
c a t c h ( E xc ep t io n e ){
Vid eoRe c o r di ng Demo . err o rD ia l o g ( " Re c o r dC o nt r o l#c omm it( ) t hr ew " + e.t oS t r in g ()) ;
}
}
}
类 V i d e o R e c o r d i n g S et u p S cr e e n. j a v a
pa c kage c om .r im .s am pl es. devi c e.video r e c o r di ng demo ;
im p o r t ne t .r im .d ev ic e.ap i. ui .*;
im p o r t ne t .r im .d ev ic e.ap i. ui .c o nt ai ner .* ;
im p o r t ne t .r im .d ev ic e.ap i. ui .c om po nent. *;
/**
* A s c r ee n t ha t al lo w s a us er t o c hoos e t he enc o di ng us ed t o r ec o r d
* video s and t h e f il e s ys t em t o r ec o r d t o .
*/
p u bli c fi n a l c l a s s Vid eoRec o r di n g S et up S c r ee n exte n d s M ai nS c r ee n i m pl e m e n t s F iel dC ha ng e L is t ener{
p r iva t e s t a t i c S t r in g F IL E _S Y ST E M _U RI _H EA DE R = " f il e: ///" ;
p r iva t e Ob j e c t C ho ic eFi eld _e n c o di ng s ; p r iva t e Ob j e c t C ho ic eFi eld _f il eSys t ems ; p r i va t e But t o nF iel d _lau n c hRe c o r der ;
p ub l i c Vid eoRe c o r di ng S et up S c r ee n( S t r in g [ ] enc o di n g s ) {
s e t T itle( " S et up s c r ee n " );
_e n c o di ng s = n e w Ob j ec t C ho ic eFi eld( " E nc o di ng : " , en c o di ng s , 0 ) ;
add( _e n c o di ng s );
_f il eSys t ems = n e w Ob j ec t C ho ic eFi eld ( " F il e S ys t em" , d ir , 0 ) ;
add( _f il eSys t e m s );
_lau n c hRe c o r der = n e w Bu tt o nF iel d( " S t ar t r ec o r di ng " ,
Butt o nF iel d.C ON SU M E _C L IC K | F iel d.F IE L D_ RIG H T );
_lau n c hRe c o r der .s et C ha ng e L is t en er ( t hi s );
add( _lau n c hRe c o r der ) ;
}
p u bli c s t a t i c fi na l S t r in g [ ] d ir = { " s t o r e/ " , " S DC ar d/" };
p u bli c s t a t i c fi na l S t r in g SD _CA RD_P AT H = " S DC ar d/Bl a c kBer r y/v id eos /mm ap i _r im let .3 G P " ; p u bli c s t a t i c fi na l S t r in g M E M O RY _P AT H = " s t o r e/ho m e/us er /videos /mm ap i_r im let .3 GP " ; p u bli c S t r in g videoF il eP a t h = SD _CA RD_P AT H ;
p ub l i c vo i d f iel dC ha ng ed( F iel d f iel d, in t c o nt ext ) {
i f ( f iel d = = _lau n c hRe c o r der ) {
S t r in g s ele c t edE n c o di ng = (S t r in g )
_e nc o di ng s . g et C ho ic e( _ enc o di n g s .g et S el ec t edIn dex()) ; S t r in g s ele c t edF il eSys t em = (S t r in g )
_f il eSys t ems .g et C ho i c e( _f il eSys t ems .g et S ele c t edIn dex()) ;
S t r in g f il eP a t h = nu l l ; i f ( s ele c t edF il eSys t em. equa ls ( " s t o r e/ " )) { f il eP a t h = M E M O RY _P AT H ;
}
e l s e i f ( s elec t edF il eSys t em. equa ls ( " S DC ar d/" )) {
f il eP a t h = SD _CA RD_P AT H ;
}
U iA pp li c at io n.g e t U iA pp li c a t i o n () .p us hS c r e en(
n e w Vid eo Re c o r di ng S c r ee n( s ele c t edE nc o di n g , F IL E _SY S TE M _U RI_H EA DE R + f il eP at h)) ;
c los e( ) ;
}
}
p r o te c te d b o o l e a n o nS aveP r om p t ( ) {
// Su pp r ess t he s ave di al o g
r e t u r n t r u e ;
}
}
类 V i d e o P l a y ba ckS c r e en. j a va
pa c kage c om .r im .s am pl es. devi c e.video r e c o r di ng demo ;
im p o r t j avax.m ic r o edi t io n.m edi a. P la y er ;
im p o r t j avax.m ic r o edi t io n.m edi a. P la y er L is t ener ;
im p o r t j avax.m ic r o edi t io n.m edi a. c o n t r o l. Vid eoC o nt r o l;
im p o r t j avax.m ic r o edi t io n.m edi a. c o n t r o l. Vo lum eC o nt r o l;
im p o r t j ava.io .I OE xc ep t io n;
im p o r t j ava.io .I np ut S t r eam ;
im p o r t j avax.m ic r o edi t io n. io .C o nn ec t o r ;
im p o r t j avax.m ic r o edi t io n. io .f il e.F il eC o nn ec t io n;
im p o r t ne t .r im .d ev ic e.ap i. ui .F iel d;
im p o r t ne t .r im .d ev ic e.ap i. ui .U iA pp li c at io n;
im p o r t ne t .r im .d ev ic e.ap i. ui .c om po nent. Di alo g ; im p o r t ne t .r im .d ev ic e.ap i. ui .c om po nent. L ab elF iel d ; im p o r t ne t .r im .d ev ic e.ap i. ui .c o nt ai ner . M ai nS c r ee n ;
p u bli c c l a s s Vid eoPla yba c kS c r e en exte n d s M ai nS c r ee n{
p r iva t e P la ye r _ video P la y er ;
p r iva t e Vid eoC o nt r o l _v id eoC o nt r o l ;
p ub l i c Vid eoPla yba c kS c r e en( In pu t S t r eam in pu t S t r ea m ) {
i f ( in pu t S t r eam = = n ull ) {
t h r o w n e w N ul lPoi nt er E xc ept io n( "' in pu t S t r eam ' c an no t b e nu ll " );
}
t r y {
_v id eoPla ye r = j av ax.m ic r o edi t io n.m edi a. M an a g er . c reat e P la y er ( in pu t S t r eam ,
" video /s bv " );
in itS c r ee n() ;
}
c a t c h ( E xc ept io n e ) {
Di alo g . a le rt ( " E xc ept io n w hi le in i t ia li z in g t he pl a ybac k vid eo pl ayer /n/n" + e) ;
}
}
/**
* 构造 视频回 放屏幕, 按指定路 径装载视 频文 件
*/
p ub l i c Vid eoPla yba c kS c r e en( S t r in g f il e) {
b o ol e a n no t E m pt y ;
// 检测给定 路径是否 有媒体文 件
t r y {
F il eC o nn ec t io n f c o nn = (F il eC o nn ec t io n) C o nn ec t o r . o p en (f il e) ;
no t E m pt y = f c o nn .exis t s ( ) && f c o nn .f il eSi z e( ) > 0 ;
f c o nn .c los e( ) ;
}
c a t c h ( IO E xc e pt io n e ){
Di alo g .a le r t ( " E xc ep t io n w hi le ac c ess in g t h e video f il esi z e: /n/n" + e) ;
no t E m pt y = fa l s e ;
}
// 如有媒体 文件并有 内容,初 始化界面 进行 播放
i f ( no t E m pt y )
{
t r y
{
}
// 创建 Vid eo P la ye r
_ video P la y er = j a vax.m ic r o edi t io n.m e di a. M an ag er . c rea t eP l a y er (f il e) ;
in itS c r ee n() ;
c a t c h ( E xc ept io n e )
{
}
}
e l s e
{
Di alo g . a le rt ( " E xc ept io n w hi le in i t ia li z in g t he pl ayb ac k video player /n/n " + e) ;
add( n e w L ab elF iel d( " T he v id eo f il e you ar e t r yin g t o pl a y is emp t y " ));
}
}