1、Destination
(1)了解Evalvid的系统结构及其优缺点
(2)了解整合Evalvid和NS2所得的myEvalvid的系统结构
(3)了解通过更改myEvalvid得到的myEvalvid-NT系统结构
(4)了解可解画面比例(Decodable Frame Rate)的意义及其分析模型
(5)了解如何使用 myEvalvid 和 myEvalvid-NT 来仿真和评估多媒体图像传输
(6)使用myEvalvid-NT验证所得的可解画面比例分析模型
(7)了解各种影响图像传输的因素
(8)了解各种因素之间的相关性
2、Background
(1)Evalvid的系统结构及其优缺点
Evalvid是一套德国人发明的多媒体质量评估工具,提供了用户从原始影像数据压缩、封包传送产生效能分析结果,在视觉上比较影像传输质量的好坏。其结构图如图1所示。
其主要组件包括:
信源——格式可以是YUV QCIF(176*144)或者YUV CIF(352*288)
视频编解码器——支持NCTU codec和ffmpeg,其中ffmpeg能提供比较多样的编码方式
视频发送器——UDP封包传输
评价Trace——效果评估的工作是在发送端处理,需要将接收端的Trace文件传回发送端
重建视频——接收端收到的图像文件画面数必须和发送端一致,若不一致,则由重建视频根据最近一个成功解出的画面来修补遗失的画面
PSNR(峰值信噪比)——这个值越大则表示目的图像与原始图像差距越小,也就是画面的质量越好
MOS(平均主观评分)——评鉴数字图像质量的主观指针。其范围从1(最差)到5(最好)。可将PSNR的值转换为MOS值。
Evalvid提供的模型只是一个简单的Error Model,限制了研究者验证所提出来的方法和结构。于是通过myEvalvid、my_UDP和myEvalvid_Sink三个接口程序(Agent)与NS2联络,构成myEvalvid。
(2)myEvalvid的系统结构
myEvalvid——读取VS(视频发送器)处理后的视频记录文件,将记录文件中的每一个画面切割成较小的片段,并在tcl脚本中设置好的时间内把这些区段往较底层的UDP层传送出去。
my_UDP——UDP Agent的延伸,记录封包传送的时间、封包的识别和封包负载大小记录,如同Tcp-dump或win-dump。
myEvalvid_Sink——接收由my_UDP所传送出去的封包,并记录接收的时间、封包的识别和封包负载大小。
(3)myEvalvid-NT的系统结构
http://140.116.72.80/~smallko/ns2/myEvalvidNT.htm
myEvalvid-NT将myEvalvid中的ET(评价Trace)做了修改,使其能计算出可解画面比例(Decodable Frame Rate)、封包/画面遗失率(Packet/Frame Loss Rate)、封包/画面的端到端时延(Packet/Frame Delay)与封包/画面的抖动率(Packet/Frame Jitter)。
GOP(Group of Pictures)策略影响编码质量:所谓GOP,意思是画面组,一个GOP就是一组连续的画面。 MPEG编码将画 面(即帧)分为I、P、B三种,I是内部编码帧,P是前向预测帧,B是双向内插帧。简单地讲,I帧是一个完整的画面,而P帧和B帧记录的是相对于I帧的变 化。没有I帧,P帧和B帧就无法解码,这就是MPEG格式难以精确剪辑的原因,也是我们之所以要微调头和尾的原因。
3、Analysis
实验1
(1)./ffmpeg.exe -s qcif -vcodec mpeg4 -r 30 -g 9 -bf 2 -i foreman_qcif.yuv foreman_qcif.m4v
//将yuv文件转换为m4v文件,-s参数为set frame size, -vcodec参数为指定要压缩的方式,-r参数为set frame rate,设置每秒30个画面,-g参数为set the group of picture size,这里设置每一个gop有9个画面,-bf参数为use ‘frames’B frames,这里设置I和P之间或P与P之间有两个B frame,-r参数为input file name,最后设置处理后的文件为foreman_qcif.m4v
(2)./MP4Box.exe -hint -mtu 1024 -fps 30 -add foreman_qcif.m4v foreman_qcif.mp4
//将m4v文件转换为mp4
(3)./mp4trace.exe -f -f 192.168.0.2 12346 foreman_qcif.mp4 >foreman_qcif.st
//将视频中的每一个帧的相关信息撷取出来,并存放到st文件中。192.168.0.2为传送出去的目的IP, 12346为目的端口。仿真,故只是虚拟,不是真的发送到该IP地址。
(4)ns lab19_1.tcl 0 0 0.01 0 1 1024
//随机错误模式,multicast传送,错误率为0.01,seed为1,最大的封包大小为1024
//sd——传送记录文件,rd——接收记录文件
需要先安装ns2-module (my_traffictrace.cc, my_udp.cc, my_udp.h, my_udpsink.cc, my_udpsink.h)
http://140.116.72.80/~yufrank/YCY/myevalvid_rtp/rtptools.rar
http://140.116.72.80/~smallko/ns2/myevalvid2.rar
a) add a folder “mympeg” into the ns directory and put the following files into.
my_traffictrace.cc, my_udp.cc, my_udp.h, my_udpsink.cc, my_udpsink.h
myevalvid.cc,myevalvid_sink.h,myevalvid_sink.cc
b) Put a frametype_ and sendtime_ field in the hdr_cmn header. The frametype_ field is to indicate which frame type the packet belongs to. I frame type is defined to 1, P is defined to 2, and B is defined to 3. The sendtime_ field is to record the packet sending time. It can be used to measure end-to-end delay. Modify the file packet.h in the common folder
struct hdr_cmn {
enum dir_t { DOWN= -1, NONE= 0, UP= 1 };
packet_t ptype_; // packet type (see above)
int size_; // simulated packet size
int uid_; // unique id
int error_; // error flag
int errbitcnt_; // # of corrupted bits jahn
int fecsize_;
double ts_; // timestamp: for q-delay measurement
int iface_; // receiving interface (label)
dir_t direction_; // direction: 0=none, 1=up, -1=down
// source routing
char src_rt_valid;
double ts_arr_; // Required by Marker of JOBS
//add the following three lines
int frametype_; // frame type for MPEG video transmission (Henry)
double sendtime_; // send time (Henry)
unsigned long int frame_pkt_id_;
c)Modify the file agent.h in the common folder
class Agent : public Connector {
public:
Agent(packet_t pktType);
virtual ~Agent();
void recv(Packet*, Handler*);
......
inline packet_t get_pkttype() { return type_; }
// add the following two lines
inline void set_frametype(int type) { frametype_ = type; } // (Henry)
inline void set_prio(int prio) { prio_ = prio; } // (Henry)
protected:
int command(int argc, const char*const* argv);
......
int defttl_; // default ttl for outgoing pkts
// add the following line
int frametype_; // frame type for MPEG video transmission
......
private:
void flushAVar(TracedVar *v);
};
d)Modify the file agent.cc in the common folder
Agent::Agent(packet_t pkttype) :
size_(0), type_(pkttype), frametype_(0),
channel_(0), traceName_(NULL),
oldValueList_(NULL), app_(0), et_(0)
{
}
......
Agent::initpkt(Packet* p) const
{
hdr_cmn* ch = hdr_cmn::access(p);
ch->uid() = uidcnt_++;
ch->ptype() = type_;
ch->size() = size_;
ch->timestamp() = Scheduler::instance().clock();
ch->iface() = UNKN_IFACE.value(); // from packet.h (agent is local)
ch->direction() = hdr_cmn::NONE;
ch->error() = 0; /* pkt not corrupt to start with */
// add the following line
ch->frametype_= frametype_;
......
e)modify home\Administrator\ns-allinone-2.34\ns-2.34\tcl\lib\ns-default.tcl
Add this line “Agent/my_UDP set packetSize_
and “Tracefile set debug_ 0”
f) add this line “mympeg/my_traffictrace.o mympeg/my_udp.o mympeg/my_udpsink.o mympeg /myevalvid_sink.o mympeg /myevalvid.o \” into the Obj_CC section in Makefile.in
g) Recompile
$./configure ; make clean; make depend; make
(5)./etmp4 sd rd foreman_qcif.st foreman_qcif.mp4 foreman_qcife
//采用etmp4产生一个有画面遗失的视频mp4文件(即foreman_qcife)
(6)./ffmpeg -i foreman_qcif.mp4 foreman_qcife.yuv
//将上一步骤所得的mp4文件恢复成yuv影片文件。
(7)./avgpsnr
//针对重建后的yuv文件及原始yuv文件,获得重建后的PSNR值的大小
(8)YUVviewer观察重建后影片与原影片的区别
实验2
一个单纯的无线网络,有四个节点n0,n1,n2,n3,n0传视频数据给n1,n2传视频数据给n3,另外有两条CBR流做背景传送,影响视频的传输。
ns lab19_2.tcl
实验3
(1)ns lab20.tcl
(2)awk -f convert.awk Verbose_StarWarsIV.dat >Verbose_StarWarsIV.st
(3)./et.exe
//评估分析,可解画面数以及可解画面比例的大小~~
./et.exe sd rd Verbose_StarWarsIV.st 1 2
(4)awk -f delay.awk delay_pkt.txt
awk '{print $1,$2}' delay_pkt.txt >delay_pkt
awk -f delay.awk delay_1.txt
awk '{print $1,$2}' delay_1.txt >delay_1
awk '{print $1,$3}' delay_pkt.txt >jitter_pkt
awk '{print $1,$3}' delay_1.txt >jitter_frame
实验3
(1)./ffmpeg.exe -s qcif -vcodec mpeg4 -r 30 -g 9 -bf 2 -qscale 31 -i foreman_qcif.yuv foreman_qcif.m4v
(2)./MP4Box.exe -hint -mtu 1024 -fps 30 -add foreman_qcif.m4v foreman_qcif.mp4
(3)./mp4trace.exe -f -f 192.168.0.2 12346 foreman_qcif.mp4 >foreman_qcif.st
(4)ns lab21.tcl 0 0 0.01 0 1 1024
(5)./etmp4 sd rd foreman_qcif.st foreman_qcif.mp4 foreman_qcife
(6)./ffmpeg -i foreman_qcif.mp4 foreman_qcife.yuv
(7)./avgpsnr.exe 176 144 420 foreman_qcif.yuv foreman_qcife.yuv
(8)./ffmpeg.exe -s qcif -vcodec mpeg4 -r 30 -g 9 -bf 2 -qscale 10 -i foreman_qcif.yuv foreman_qcif.m4v
//qscale固定为10,mtu设置为1024,GOP length 9
(9)./ffmpeg.exe -s qcif -vcodec mpeg4 -r 30 -g 15 -bf 2 -qscale 10 -i foreman_qcif.yuv foreman_qcif.m4v
//qscale固定为10,mtu设置为1024,GOP length 15
(1)了解Evalvid的系统结构及其优缺点
(2)了解整合Evalvid和NS2所得的myEvalvid的系统结构
(3)了解通过更改myEvalvid得到的myEvalvid-NT系统结构
(4)了解可解画面比例(Decodable Frame Rate)的意义及其分析模型
(5)了解如何使用 myEvalvid 和 myEvalvid-NT 来仿真和评估多媒体图像传输
(6)使用myEvalvid-NT验证所得的可解画面比例分析模型
(7)了解各种影响图像传输的因素
(8)了解各种因素之间的相关性
2、Background
(1)Evalvid的系统结构及其优缺点
Evalvid是一套德国人发明的多媒体质量评估工具,提供了用户从原始影像数据压缩、封包传送产生效能分析结果,在视觉上比较影像传输质量的好坏。其结构图如图1所示。
其主要组件包括:
信源——格式可以是YUV QCIF(176*144)或者YUV CIF(352*288)
视频编解码器——支持NCTU codec和ffmpeg,其中ffmpeg能提供比较多样的编码方式
视频发送器——UDP封包传输
评价Trace——效果评估的工作是在发送端处理,需要将接收端的Trace文件传回发送端
重建视频——接收端收到的图像文件画面数必须和发送端一致,若不一致,则由重建视频根据最近一个成功解出的画面来修补遗失的画面
PSNR(峰值信噪比)——这个值越大则表示目的图像与原始图像差距越小,也就是画面的质量越好
MOS(平均主观评分)——评鉴数字图像质量的主观指针。其范围从1(最差)到5(最好)。可将PSNR的值转换为MOS值。
Evalvid提供的模型只是一个简单的Error Model,限制了研究者验证所提出来的方法和结构。于是通过myEvalvid、my_UDP和myEvalvid_Sink三个接口程序(Agent)与NS2联络,构成myEvalvid。
(2)myEvalvid的系统结构
myEvalvid——读取VS(视频发送器)处理后的视频记录文件,将记录文件中的每一个画面切割成较小的片段,并在tcl脚本中设置好的时间内把这些区段往较底层的UDP层传送出去。
my_UDP——UDP Agent的延伸,记录封包传送的时间、封包的识别和封包负载大小记录,如同Tcp-dump或win-dump。
myEvalvid_Sink——接收由my_UDP所传送出去的封包,并记录接收的时间、封包的识别和封包负载大小。
(3)myEvalvid-NT的系统结构
http://140.116.72.80/~smallko/ns2/myEvalvidNT.htm
myEvalvid-NT将myEvalvid中的ET(评价Trace)做了修改,使其能计算出可解画面比例(Decodable Frame Rate)、封包/画面遗失率(Packet/Frame Loss Rate)、封包/画面的端到端时延(Packet/Frame Delay)与封包/画面的抖动率(Packet/Frame Jitter)。
GOP(Group of Pictures)策略影响编码质量:所谓GOP,意思是画面组,一个GOP就是一组连续的画面。 MPEG编码将画 面(即帧)分为I、P、B三种,I是内部编码帧,P是前向预测帧,B是双向内插帧。简单地讲,I帧是一个完整的画面,而P帧和B帧记录的是相对于I帧的变 化。没有I帧,P帧和B帧就无法解码,这就是MPEG格式难以精确剪辑的原因,也是我们之所以要微调头和尾的原因。
3、Analysis
实验1
(1)./ffmpeg.exe -s qcif -vcodec mpeg4 -r 30 -g 9 -bf 2 -i foreman_qcif.yuv foreman_qcif.m4v
//将yuv文件转换为m4v文件,-s参数为set frame size, -vcodec参数为指定要压缩的方式,-r参数为set frame rate,设置每秒30个画面,-g参数为set the group of picture size,这里设置每一个gop有9个画面,-bf参数为use ‘frames’B frames,这里设置I和P之间或P与P之间有两个B frame,-r参数为input file name,最后设置处理后的文件为foreman_qcif.m4v
(2)./MP4Box.exe -hint -mtu 1024 -fps 30 -add foreman_qcif.m4v foreman_qcif.mp4
//将m4v文件转换为mp4
(3)./mp4trace.exe -f -f 192.168.0.2 12346 foreman_qcif.mp4 >foreman_qcif.st
//将视频中的每一个帧的相关信息撷取出来,并存放到st文件中。192.168.0.2为传送出去的目的IP, 12346为目的端口。仿真,故只是虚拟,不是真的发送到该IP地址。
(4)ns lab19_1.tcl 0 0 0.01 0 1 1024
//随机错误模式,multicast传送,错误率为0.01,seed为1,最大的封包大小为1024
//sd——传送记录文件,rd——接收记录文件
需要先安装ns2-module (my_traffictrace.cc, my_udp.cc, my_udp.h, my_udpsink.cc, my_udpsink.h)
http://140.116.72.80/~yufrank/YCY/myevalvid_rtp/rtptools.rar
http://140.116.72.80/~smallko/ns2/myevalvid2.rar
a) add a folder “mympeg” into the ns directory and put the following files into.
my_traffictrace.cc, my_udp.cc, my_udp.h, my_udpsink.cc, my_udpsink.h
myevalvid.cc,myevalvid_sink.h,myevalvid_sink.cc
b) Put a frametype_ and sendtime_ field in the hdr_cmn header. The frametype_ field is to indicate which frame type the packet belongs to. I frame type is defined to 1, P is defined to 2, and B is defined to 3. The sendtime_ field is to record the packet sending time. It can be used to measure end-to-end delay. Modify the file packet.h in the common folder
struct hdr_cmn {
enum dir_t { DOWN= -1, NONE= 0, UP= 1 };
packet_t ptype_; // packet type (see above)
int size_; // simulated packet size
int uid_; // unique id
int error_; // error flag
int errbitcnt_; // # of corrupted bits jahn
int fecsize_;
double ts_; // timestamp: for q-delay measurement
int iface_; // receiving interface (label)
dir_t direction_; // direction: 0=none, 1=up, -1=down
// source routing
char src_rt_valid;
double ts_arr_; // Required by Marker of JOBS
//add the following three lines
int frametype_; // frame type for MPEG video transmission (Henry)
double sendtime_; // send time (Henry)
unsigned long int frame_pkt_id_;
c)Modify the file agent.h in the common folder
class Agent : public Connector {
public:
Agent(packet_t pktType);
virtual ~Agent();
void recv(Packet*, Handler*);
......
inline packet_t get_pkttype() { return type_; }
// add the following two lines
inline void set_frametype(int type) { frametype_ = type; } // (Henry)
inline void set_prio(int prio) { prio_ = prio; } // (Henry)
protected:
int command(int argc, const char*const* argv);
......
int defttl_; // default ttl for outgoing pkts
// add the following line
int frametype_; // frame type for MPEG video transmission
......
private:
void flushAVar(TracedVar *v);
};
d)Modify the file agent.cc in the common folder
Agent::Agent(packet_t pkttype) :
size_(0), type_(pkttype), frametype_(0),
channel_(0), traceName_(NULL),
oldValueList_(NULL), app_(0), et_(0)
{
}
......
Agent::initpkt(Packet* p) const
{
hdr_cmn* ch = hdr_cmn::access(p);
ch->uid() = uidcnt_++;
ch->ptype() = type_;
ch->size() = size_;
ch->timestamp() = Scheduler::instance().clock();
ch->iface() = UNKN_IFACE.value(); // from packet.h (agent is local)
ch->direction() = hdr_cmn::NONE;
ch->error() = 0; /* pkt not corrupt to start with */
// add the following line
ch->frametype_= frametype_;
......
e)modify home\Administrator\ns-allinone-2.34\ns-2.34\tcl\lib\ns-default.tcl
Add this line “Agent/my_UDP set packetSize_
and “Tracefile set debug_ 0”
f) add this line “mympeg/my_traffictrace.o mympeg/my_udp.o mympeg/my_udpsink.o mympeg /myevalvid_sink.o mympeg /myevalvid.o \” into the Obj_CC section in Makefile.in
g) Recompile
$./configure ; make clean; make depend; make
(5)./etmp4 sd rd foreman_qcif.st foreman_qcif.mp4 foreman_qcife
//采用etmp4产生一个有画面遗失的视频mp4文件(即foreman_qcife)
(6)./ffmpeg -i foreman_qcif.mp4 foreman_qcife.yuv
//将上一步骤所得的mp4文件恢复成yuv影片文件。
(7)./avgpsnr
//针对重建后的yuv文件及原始yuv文件,获得重建后的PSNR值的大小
(8)YUVviewer观察重建后影片与原影片的区别
实验2
一个单纯的无线网络,有四个节点n0,n1,n2,n3,n0传视频数据给n1,n2传视频数据给n3,另外有两条CBR流做背景传送,影响视频的传输。
ns lab19_2.tcl
实验3
(1)ns lab20.tcl
(2)awk -f convert.awk Verbose_StarWarsIV.dat >Verbose_StarWarsIV.st
(3)./et.exe
//评估分析,可解画面数以及可解画面比例的大小~~
./et.exe sd rd Verbose_StarWarsIV.st 1 2
(4)awk -f delay.awk delay_pkt.txt
awk '{print $1,$2}' delay_pkt.txt >delay_pkt
awk -f delay.awk delay_1.txt
awk '{print $1,$2}' delay_1.txt >delay_1
awk '{print $1,$3}' delay_pkt.txt >jitter_pkt
awk '{print $1,$3}' delay_1.txt >jitter_frame
实验3
(1)./ffmpeg.exe -s qcif -vcodec mpeg4 -r 30 -g 9 -bf 2 -qscale 31 -i foreman_qcif.yuv foreman_qcif.m4v
(2)./MP4Box.exe -hint -mtu 1024 -fps 30 -add foreman_qcif.m4v foreman_qcif.mp4
(3)./mp4trace.exe -f -f 192.168.0.2 12346 foreman_qcif.mp4 >foreman_qcif.st
(4)ns lab21.tcl 0 0 0.01 0 1 1024
(5)./etmp4 sd rd foreman_qcif.st foreman_qcif.mp4 foreman_qcife
(6)./ffmpeg -i foreman_qcif.mp4 foreman_qcife.yuv
(7)./avgpsnr.exe 176 144 420 foreman_qcif.yuv foreman_qcife.yuv
(8)./ffmpeg.exe -s qcif -vcodec mpeg4 -r 30 -g 9 -bf 2 -qscale 10 -i foreman_qcif.yuv foreman_qcif.m4v
//qscale固定为10,mtu设置为1024,GOP length 9
(9)./ffmpeg.exe -s qcif -vcodec mpeg4 -r 30 -g 15 -bf 2 -qscale 10 -i foreman_qcif.yuv foreman_qcif.m4v
//qscale固定为10,mtu设置为1024,GOP length 15