视频播放器
Jpeg2000 视频播放器
功能需求
播放本地硬盘的 J2v 后缀的视频图像。
1. 选择需要播放的文件
2. 在状态栏显示:视频的原始分辨率,分辨率级别,文件的码率、播放帧率、当前的播放
分辨率、当前的码率,CPU的使用率
3. 选择播放方式
4. 将解码后的图像显示、播放
5. 暂停、结束功能。
6. 暂停时提供截图功能
7. DEMO版暂时不提供音频和字幕功能
性能需求
高性能,播放器本身不导致太多的性能下降。
对于2K(2048*1080)的j2v视频,在8核电脑(CPU E5462, 2.8G 8 cores, 2G memory, Nvidia
GTX260, Windows XP 32 professional)上测试,引擎本身的解码速率能达到21FPS(纯CPU解码)和26fps(GPU加速解码)。
在播放器中,
在添加了读文件和回显功能后,性能下降不能超过10%。即在同一电脑上测试,应该达到19fps和23fps以上。
功能需求详述
1. 选择需要播放的文件
a) 弹出文件选择窗口,显示j2v后缀的文件供用户选择
2. 在状态栏显示:视频名称,视频的原始分辨率(OrgRes),当前的播放分辨率(CurRes)、
分辨率级别(DwtLevel),当前分辨率级别(CurDwtLvl),文件的码率(BitsRate)、当前的码
率(CurBitsRate),视频帧率(FPS)播放帧率(CurFPS)、CPU的使用率(CPUU)
a) 视频名称:即当前的j2v文件名,不包含.j2v后缀
b) 视频的原始分辨率
分辨率级别
当前的播放分辨率
当前分辨率级别
从这些属性数值中,可以在解码成功后,调用引擎函数
decoder->CheckProperties(handler, properties);
获得。其中当前分辨率级别是在调用引擎前由用户指定:
sSize mSize; // 视频原始分辨率
sSize mOutputSize; // 当前的输出分辨率
sSize mThumbOutputSize; // 缩略图大小
OutputFormat mOutputFormat; // 输出格式,在调用的时候指定
sSize mCodeBlockSize; // 码块大小,jpeg2000的属性
sSize mTileSize; // 分块大小,jpeg2000的属性
s2d mTileNum; // 分块数量,jpeg2000的属性
short mComponentNum; // 通道数量,jpeg2000的属性
short mCalculatedComponentNum; // 输出的通道数量,jpeg2000的属性
short mDwtLevel; // 分辨率级别,jpeg2000的属性,在下文“选择播放方式”中需要用到
short mLayer; // 分层数量,jpeg2000的属性
short mBitDepth; // 通道位深,jpeg2000的属性
short mRoiShift; // 感兴趣区域设置,jpeg2000的属性
EncodeFormat mFormat; // 编码格式,jpeg2000的属性
EncodeMathod mMethod; // 编码方式,jpeg2000的属性
Jp2_Progression mProgression; // 渐进方式,jpeg2000的属性
int mHeaderLength; // 码流的头大小,jpeg2000的属性
从这些属性数值中,可以获得
视频的原始分辨率
分辨率级别
当前的播放分辨率
另外当前分辨率级别是在调用引擎前由用户指定
c) 文件的码率:以Mbits/sec为单位,精确到整数。在j2v文件头可以获取视频的码
率:
BitRate = video_bitsRate / 1048576
d) 当前码率:以Mbits/sec为单位,精确到小数点后一位。每秒更新一次,计算该秒
内的输入视频码流大小得到:
CurBitRate = total_sinput_ize_of_current_second_in_bytes * 8 / 1048576
e) 视频帧率:在j2v的文件头可以获得这个数值,在DCP规范中只有24FPS和48FPS
两个合法值。为整数。
f) 播放帧率(CurFPS):每秒更新一次,显示播放器运行到当前的总帧率,简单讲就是
本视频从开始到当前引擎成功解码并回显的帧数除以播放时长。精确到小数点后一
位
g) CPU使用率:每秒更新一次,简单回显当前的CPU使用率,精确到小数点后一位
h) 显示举例如下:
Demo 分辨率:1024*540(2048*1080) DWT级别:4 / 5 码率:230.8//250MBS 帧率:21..2/24FPS CPU:98.4%
3. 选择播放方式
a) 缺省为原始大小的文件
b) 菜单上提供选项,用户可以选择分辨率级别, DCP规范不大于6,所以在菜单上
我们提供选择1-6和全尺寸。将此参数,传给“解码库”,解码库可以提供不同的
分辨率输出。
举例,视频的分辨率级数为5,当用户选择4,则解码到分辨率4级,如果用户选
择6,大于合法的分辨率级别,则忽略该选择,仍输出5
4. 将解码后的图像显示、播放
a) 为效率考虑,本版本只需要显示引擎的输出分辨率,不进行视频的拉伸和变形。
b) 如果播放的视频大小小于窗口,则将视频显示在窗口正中
c) 如果视频尺寸大于窗口,也仅需要显示正中即可
d) 回显格式可以使用24位BMP
5. 暂停、结束功能。
6. 暂停时提供截图功能
a) 暂停时,菜单栏提供选项,可以将当前画面另存为jp2(即直接存储输入的码流)
或BMP(输出的码流,缺少文件头,可以调用引擎工具存储)
b) 为简单考虑,文件名可以自动设定为视频名称加上计数。例如Demo001.jp2 7. DEMO版暂时不提供音频和字幕功能
J2v文件格式说明
1. J2v视频文件包括文件头,帧头和帧三个部分:
……………………………………….. 文件头 帧头 第一帧 帧头 第一帧 帧头 第一帧
2. 文件头格式:文件头长度为16524字节,可以使用如下结构读出: struct j2k_video_file_header_s
{
union
{
char mDcpHeader[16524];
struct
{
char mJ; // "J"
char mV; // "J"
int mHeaderLength; // 头长度 = 16524
int mVideoSize; // 视频长度
char mReservedInfoEnable; // =0
示随后的信息无用,=0xff表示随后的信息有
char mReserved[256]; // 保留信息,通常显示版权,版本等信息
int mFrameCount; // 视频总帧数, 由此和播放帧率可以计算时长
int mFps; // 播放帧率,必须为24或48
float mBitsRate; // 视频码率
int mWidth; // 全尺寸的宽度(像素)
int mHeight; // 全尺寸的高度(像素)
int mBitdepth; // 每通道的位深
int mChannel; // 通道数
};
};
}
typedef struct j2k_video_file_header_s J2kVideoHeader;
该结构定义在decoder/j2kf2v/j2kvideo.h 代码示例为:
J2kVideoHeader videoHeader; const int DCP_HEADER_LENGTH = 16524; fread(&videoHeader, 1, DCP_HEADER_LENGTH, fp);
其中 mJ 和mV是j2v文件的标志,必须为字母“J”和“V” 除去以上所指示的内容外,其他字节暂时无用。
3. 帧头格式
每个帧头的长度为20字节:
A B C 0 – 16 字节
其中0-16字节保留
第17到19字节记为A,B,C,保存本帧的长度(字节数)
帧长度 = (A << 16) + (B << 8) + c
4. 帧格式
每一帧实际上就是一帧jpeg2000的码流,以0xFF , 0X4F 打头
在截屏的时候,可以将本段内容直接以二进制方式存为jp2格式的图片
解码引擎调用说明
请参见历程jp2viewer或jp2vplayer获得调用的示例