研究过XVID或者参与过XVID开发的高手进来帮看一下马塞克是怎么回事......
采用的UDP传输,网络好的时候好象就没什么马塞克,差的时候马塞克很严重,引起这个的原因是什么呢?如何避免?在XVID中的哪些参数是解决这个问题的关键?还有关键帧和非关键帧在解码的时候如何知道等?请高手一一指教一下,多谢了 问题点数:30、回复次数:11Top
1 楼hamimelon(夜过留香)回复于 2005-06-21 09:18:07 得分 10
主要参数:压缩速率、关键帧数量
一般来说速率设为700kb、关键帧设为30就没有什么马塞克了Top
2 楼veryok()回复于 2005-06-21 10:44:33 得分 0
压缩速率可以设置吗,哪一个参数啊?
我max_key_interval设置为300,难道是这个问题?Top
3 楼psusong(栀子花开)回复于 2005-06-21 11:41:07 得分 10
vop_coding_type is located the first byte after vop_start_code(0x000001B6)
the high two bits of the byte indicates the VOP type:
00:I-VOP
01:P-VOP
10:B-VOP
Take care!Top
4 楼psusong(栀子花开)回复于 2005-06-21 11:44:44 得分 0
It would be better when you set max_key_interval smaller than 50.
In fact you should adjust I frame interval dynamically
Top
5 楼yyhzpk(zpk)回复于 2005-06-21 12:27:26 得分 10
采用UDP本来就不可靠,马塞克是由于你一些帧丢掉了,
好的方法就是当发现丢帧时,如果是I帧,就把后面的B,P帧
就不要显示了,等下一个I帧的出现,建议采用TCP连接会好一些,
丢帧由自己控制Top
6 楼veryok()回复于 2005-06-21 12:55:20 得分 0
yyhzpk(zpk) 说的丢帧这个问题的确可能存在,现在主要是我接收到帧后,
怎么判断I帧或者是B,P帧,我用的
xvid_decore(void *handle, int opt, void *param1, void *param2);
这个来解码的,还有一个问题是既然I帧都丢了,我根本就没接收到,我还怎么去判断是不是丢了?^_^
psusong所的那个根据头字节来判断,真不好意思,我还是XVID新手,不知道怎么获取这个头字节?汗
缩小关键帧间隔我想可以解决视频出现马塞克后很快恢复的问题,但好象不能解决马塞克的出现?不知道是不是我理解错误?Top
7 楼httpaspjspphp(小杨大刀)回复于 2005-06-21 12:57:50 得分 0
网络传输的速度,服务端的采集频率,发送采用的协议,丢失的处理,客户端的缓存大小,压缩时的方式(软硬的分别)你要综合起来考虑啊Top
8 楼veryok()回复于 2005-06-21 12:59:08 得分 0
这是具体的参数
xvid_decore(void *handle, int opt, void *param1, void *param2);
opt=XVID_DEC_DECODE
param1 xvid_dec_frame_t
param2这里要写什么呢,我现在是给了个空指针,我想是不是从这里可以判断出点关于I帧或者是B,P帧的信息,我看了一下代码,好象
typedef struct
{
int version;
int type; /* [out] output data type */
union {
struct { /* type>0 {XVID_TYPE_IVOP,XVID_TYPE_PVOP,XVID_TYPE_BVOP,XVID_TYPE_SVOP} */
int general; /* [out] flags */
int time_base; /* [out] time base */
int time_increment; /* [out] time increment */
/* XXX: external deblocking stuff */
int * qscale; /* [out] pointer to quantizer table */
int qscale_stride; /* [out] quantizer scale stride */
} vop;
struct { /* XVID_TYPE_VOL */
int general; /* [out] flags */
int width; /* [out] width */
int height; /* [out] height */
int par; /* [out] pixel aspect ratio (refer to XVID_PAR_xxx above) */
int par_width; /* [out] aspect ratio width [1..255] */
int par_height; /* [out] aspect ratio height [1..255] */
} vol;
} data;
} xvid_dec_stats_t;
这个结构比较有可能获得点什么信息(还是是个输入参数?^_______^),可是真不知道怎么用?Top
9 楼veryok()回复于 2005-06-21 13:01:17 得分 0
TO httpaspjspphp:假如网络比较好的状况下,效果就很好,不会出现马塞克,出现马塞克只是在网络比较差的状况下,这种情况下可能的就是丢包,所以可能就是丢失的处理上我没处理好,Top
10 楼httpaspjspphp(小杨大刀)回复于 2005-06-21 14:01:56 得分 0
你既然是DUP传输的又是实时传输那就没有重传的必要了
试验一下
把服务器端的采集频率降到以前的一半或者稍多一点
把客户端的缓存变大一些
看看有没有效果
Top
11 楼psusong(栀子花开)回复于 2005-06-22 10:58:25 得分 0
在网络差的情况,你是怎么处理丢包的?是否会造成各种帧的乱续?
这种情况下,应该及时发一个I-VOP过去,重建参考帧序列,否则一定会出现马赛克
还有你用UDP传输,是很难进行QoS控制的!你怎么知道/预测网络的好坏?
你传给解码器的第五个字节的高两位就指示了帧类型(第一帧除外)!
Top




