1.linux下socket 网络编程(客户端向服务器端发送文件) 求源代码 大哥大姐帮帮忙 。联盟联盟。源码谢谢
2.有关asp源代码解密
3.Xvid_BF什么意思
linux下socket 网络编程(客户端向服务器端发送文件) 求源代码 大哥大姐帮帮忙 。软件。联盟联盟谢谢
server:
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <syslog.h>
#include <sys/time.h>
#include <string.h>
#include <fcntl.h>
#include <sys/wait.h>
#define MAXDATASIZE
#define SERVPORT
#define BACKLOG
int SendFileToServ(const char *path,源码 const char *FileName, const char *ip)
{
#define PORT
int sockfd;
int recvbytes;
char buf[MAXDATASIZE];
char send_str[MAXDATASIZE];
char filepath[] = { 0};
struct sockaddr_in serv_addr;
FILE *fp;
sprintf(filepath, "%s%s", path, FileName);
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
return 1;
}
bzero(&serv_addr,sizeof(struct sockaddr_in));
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(PORT);
inet_aton(ip, &serv_addr.sin_addr);
int IErrCount = 0;
again:
if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1)
{
if (5 == IErrCount)
return 1;
IErrCount++;
perror("connect");
sleep(2);
goto again;
}
//if ((fp = fopen(FileName, "rb")) == NULL)
if ((fp = fopen(filepath, "rb")) == NULL)
{
perror("fopen ");
return 1;
}
recvbytes = write(sockfd, FileName, strlen(FileName));
recvbytes = read(sockfd, buf, MAXDATASIZE);
if (!memcmp(buf, "sendmsg", 7))
{
while(fgets(send_str, MAXDATASIZE, fp))
{
recvbytes = write(sockfd, send_str, strlen(send_str));
recvbytes = read(sockfd, buf, MAXDATASIZE);
if (recvbytes <= 0)
{
fclose(fp);
close(sockfd);
return 1;
}
if (memcmp(buf, "goon", 4))
{
fclose(fp);
close(sockfd);
return 1;
}
}
recvbytes = write(sockfd, "end", 3);
}
else
{
fclose(fp);
close(sockfd);
return 1;
}
memset(buf, 0, MAXDATASIZE);
if (read(sockfd, buf, MAXDATASIZE) <= 0)
{
close(sockfd);
return 2;
}
char *Eptr = "nginx reload error";
//printf("bf[%s]\n", buf);
int ret;
ret = strncmp(buf, Eptr, strlen(Eptr));
//printf("%d\n", ret);
if (!ret)
{
close(sockfd);
return 2;
}
close(sockfd);
return 0;
}
int mysyslog(const char * msg)
{
FILE *fp;
if ((fp = fopen("/tmp/tmp.log", "a+")) == NULL)
{
return 0;
}
fprintf(fp, "[%s]\n", msg);
fclose(fp);
return 0;
}
static void quit_handler(int signal)
{
kill(0, SIGUSR2);
syslog( LOG_NOTICE, "apuserv quit...");
// do something exit thing ,such as close socket ,close mysql,free list
// .....
//i end
exit(0);
}
static int re_conf = 0;
static void reconf_handler(int signal)
{
re_conf=1;
syslog(LOG_NOTICE,"apuserv reload configure file .");
// 请在循环体中判断,如果re_conf == 1,软件传奇 竖版 源码请再次加载配置文件。联盟联盟
}
static int isrunning(void)
{
int fd;
int ret;
struct flock lock;
lock.l_type = F_WRLCK;
lock.l_whence = 0;
lock.l_start = 0;
lock.l_len = 0;
const char *lckfile = "/tmp/apuserv.lock";
fd = open(lckfile,源码O_WRONLY|O_CREAT);
if (fd < 0) {
syslog(LOG_ERR,"can not create lock file: %s\n",lckfile);
return 1;
}
if ((ret = fcntl(fd,F_SETLK,&lock)) < 0) {
ret = fcntl(fd,F_GETLK,&lock);
if (lock.l_type != F_UNLCK) {
close(fd);
return lock.l_pid;
}
else {
fcntl(fd,F_SETLK,&lock);
}
}
return 0;
}
int MyHandleBuff(const char *buf, char *str, char *FileName, char *pth)
{
sscanf(buf, "%s %s %s", pth, FileName, str);
printf("path=%s\nfilename=%s\nip=%s\n", pth, FileName, str);
return 0;
}
int main(int argc, char **argv)
{
int sockfd,client_fd;
socklen_t sin_size;
struct sockaddr_in my_addr,remote_addr;
char buff[MAXDATASIZE];
int recvbytes;
#if 1
int pid ;
char ch ;
int ret;
int debug = 0;
signal(SIGUSR1, SIG_IGN);
signal(SIGUSR2, SIG_IGN);
signal(SIGHUP, SIG_IGN);
signal(SIGTERM, quit_handler);
syslog(LOG_NOTICE,"apuserver start....");
while ((ch = getopt(argc, argv, "dhV")) != -1) {
switch (ch) {
case 'd':
debug = 1;
break;
case 'V':
printf("Version:%s\n","1.0.0");
return 0;
case 'h':
printf(" -d use daemon mode\n");
printf(" -V show version\n");
return 0;
default:
printf(" -d use daemon mode\n");
printf(" -V show version\n");
}
}
if (debug && daemon(0,0 ) ) {
return -1;
}
if (isrunning()) {
fprintf(stderr, "apuserv is already running\n");
syslog(LOG_INFO,"apuserv is already running\n");
exit(0);
}
while (1) {
pid = fork();
if (pid < 0)
return -1;
if (pid == 0)
break;
while ((ret = waitpid(pid, NULL, 0)) != pid) {
syslog(LOG_NOTICE, "waitpid want %d, but got %d", pid, ret);
if (ret < 0)
syslog(LOG_NOTICE, "waitpid errno:%d", errno);
}
kill(0, SIGUSR2);
sleep(1);
syslog(LOG_NOTICE,"restart apuserver");
}
signal(SIGHUP, reconf_handler);
signal(SIGPIPE, SIG_IGN);
signal(SIGUSR1,SIG_IGN);
signal(SIGUSR2, SIG_DFL);
signal(SIGTERM, SIG_DFL);
#endif
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
exit(1);
}
bzero(&my_addr,sizeof(struct sockaddr_in));
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)
{
perror("bind");
exit(1);
}
if(listen(sockfd,BACKLOG)==-1)
{
perror("listen");
exit(1);
}
int nret;
while(1)
{
sin_size = sizeof(struct sockaddr_in);
if((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size))==-1)
{
perror("falied accept");
continue;
}
memset(buff, 0, MAXDATASIZE);
recvbytes = read(client_fd, buff, MAXDATASIZE);
char str[] = { 0};
char FileName[] = { 0};
char path[] = { 0};
MyHandleBuff(buff, str, FileName, path);
if (recvbytes > 0)
{
nret = SendFileToServ(path, FileName, str);
printf("nret[%d]\n", nret);
if (1 == nret)
write(client_fd, "send file error", );
else if(2 == nret)
write(client_fd, "reload nginx error", );
else
write(client_fd, "succ", 4);
}
close(client_fd);
}
}
_________________________________________________
client:
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <syslog.h>
#include <sys/time.h>
#include <string.h>
#include <fcntl.h>
#include <sys/wait.h>
#define MAXDATASIZE
#define SERVPORT
#define BACKLOG
int mysyslog(const char * msg)
{
FILE *fp;
if ((fp = fopen("/tmp/tmp.log", "a+")) == NULL)
{
return 0;
}
fprintf(fp, "[%s]\n", msg);
fclose(fp);
return 0;
}
static void quit_handler(int signal)
{
kill(0, SIGUSR2);
syslog( LOG_NOTICE, "apuserv quit...");
// do something exit thing ,such as close socket ,close mysql,free list
// .....
//i end
exit(0);
}
static int re_conf = 0;
static void reconf_handler(int signal)
{
re_conf=1;
syslog(LOG_NOTICE,"apuserv reload configure file .");
// ·?1nf == 1£?′μ?
static int isrunning(void)
{
int fd;
int ret;
struct flock lock;
lock.l_type = F_WRLCK;
lock.l_whence = 0;
lock.l_start = 0;
lock.l_len = 0;
const char *lckfile = "/tmp/dstserver.lock";
fd = open(lckfile,O_WRONLY|O_CREAT);
if (fd < 0) {
syslog(LOG_ERR,"can not create lock file: %s\n",lckfile);
return 1;
}
if ((ret = fcntl(fd,F_SETLK,&lock)) < 0) {
ret = fcntl(fd,F_GETLK,&lock);
if (lock.l_type != F_UNLCK) {
close(fd);
return lock.l_pid;
}
else {
fcntl(fd,F_SETLK,&lock);
}
}
return 0;
}
int main(int argc, char **argv)
{
int sockfd,client_fd;
socklen_t sin_size;
struct sockaddr_in my_addr,remote_addr;
char buff[MAXDATASIZE];
int recvbytes;
#if 1
int pid ;
char ch ;
int ret;
int debug = 0;
signal(SIGUSR1, SIG_IGN);
signal(SIGUSR2, SIG_IGN);
signal(SIGHUP, SIG_IGN);
signal(SIGTERM, quit_handler);
syslog(LOG_NOTICE,"dstserver start....");
while ((ch = getopt(argc, argv, "dhV")) != -1) {
switch (ch) {
case 'd':
debug = 1;
break;
case 'V':
printf("Version:%s\n","1.0.0");
return 0;
case 'h':
printf(" -d use daemon mode\n");
printf(" -V show version\n");
return 0;
default:
printf(" -d use daemon mode\n");
printf(" -V show version\n");
}
}
if (debug && daemon(0,0 ) ) {
return -1;
}
if (isrunning()) {
fprintf(stderr, "dstserver is already running\n");
syslog(LOG_INFO,"dstserver is already running\n");
exit(0);
}
while (1) {
pid = fork();
if (pid < 0)
return -1;
if (pid == 0)
break;
while ((ret = waitpid(pid, NULL, 0)) != pid) {
syslog(LOG_NOTICE, "waitpid want %d, but got %d", pid, ret);
if (ret < 0)
syslog(LOG_NOTICE, "waitpid errno:%d", errno);
}
kill(0, SIGUSR2);
sleep(1);
syslog(LOG_NOTICE,"restart apuserver");
}
signal(SIGHUP, reconf_handler);
signal(SIGPIPE, SIG_IGN);
signal(SIGUSR1,SIG_IGN);
signal(SIGUSR2, SIG_DFL);
signal(SIGTERM, SIG_DFL);
#endif
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
exit(1);
}
bzero(&my_addr,sizeof(struct sockaddr_in));
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)
{
perror("bind");
exit(1);
}
if(listen(sockfd,BACKLOG)==-1)
{
perror("listen");
exit(1);
}
char filepath[MAXDATASIZE]= { 0};
FILE *fp;
while(1)
{
sin_size = sizeof(struct sockaddr_in);
if((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size))==-1)
{
perror("falied accept");
continue;
}
memset(buff, 0, MAXDATASIZE);
recvbytes = read(client_fd, buff, MAXDATASIZE);
sprintf(filepath, "/etc/nginx/url_rule/%s", buff);
if ((fp = fopen(filepath, "wb")) == NULL)
{
perror("fopen");
close(client_fd);
continue;
}
write(client_fd, "sendmsg", 7);
while(read(client_fd, buff, MAXDATASIZE))
{
if (!memcmp(buff, "end", 3))
{
fclose(fp);
break;
}
else
{
fprintf(fp, "%s", buff);
write(client_fd, "goon", 4);
}
}
//system("nginx -s reload");
char *Sptr = "nginx reload succ";
char *Eptr = "nginx reload error";
int ret;
ret = system("nginx -s reload");
printf("ret[%d]\n", ret);
if (ret != 0)
{
write(client_fd, Eptr, strlen(Eptr));
}
else
{
write(client_fd, Sptr, strlen(Sptr));
}
close(client_fd);
}
}
以前写的:内容忘记了。不是软件很复杂你可以自己看!
有关asp源代码解密
下面是联盟联盟encode解密出来的,还是加密了,不过这样解开就简单多了,直接一个response.write UnEncode(www_fjqq_cn) 光这一句就可以了,下面的都不必看.
<%
www_fjqq_cn="帅帅m[_3w斌斌斌斌uu~&""ww4##的dY$gg`\$mmm##v2ww""ww4##大dY$gg`\$mmm##v2ww""bcj>}jd[jde9j[=3dYUgg`\Ummm斌~wwww{ [c.dUgg`\{ wwww""ww商供提务服盟联容内序程偷小家首内国ww""[bj_jUdYUgg`\}[YWbf[H3[bj_jUdYUgg`\斌~wwww{ [bj_jUgg`\{ wwww""ww的ww""[bj_jUdYUgg`\}[YWbf[H3[bj_jUdYUgg`\斌~&""ww4[bj_j%2ww""ww4[bj_j2ww""bcj>}jd[jde9j[=3[bj_jUdYUgg`\斌~bhk}[].Fj[=3bcj>斌wwfi.$de_dkww2bhkUgg`\2wwww3bhk斌斌w帅[-[Ykj[}Kd;dYeZ[}m[_~~帅\kdYj_eduKd;dYeZ[}YY~帅uuuu\ehu_u3u'ujeub[d}YY~帅uuuuuuuu_\uc_Z}YY""_""'~w斌wuj^[d帅uuuuuuuuuuuuj[cfu3uC_Z}YY""u_""u'~u!uj[cf帅uuuuuuuuuuuuuuuu[bi[帅uuuuuuuuuuuuj[cf3lXYhb\{ j[cf帅uuuuuuuuuuuuuuuu[dZu_\帅uuuuuuuuuuuuuuuud[-j帅uuuuuuuuuuuuuuuuuuuuKd;dYeZ[3j[cf帅uuuuuuuuuuuuuuuu[dZu\kdYj_ed帅帅帅帅"
execute(UnEncode(www_fjqq_cn))
function UnEncode(www_cfss_cn)
but=
for i = 1 to len(www_cfss_c-)
if mid(www_cfss_cn,i,1)<>"帅" the-
If Asc(Mid(www_cfss_c-, i, 1)) < Or Asc(Mid(www_cfss_c-, i, 1)) > Then
a = a & Chr(Asc(Mid(www_cfss_cn, i, 1)))
else
pk=asc(mid(www_cfss_cn,i,1))-but
if pk> then
pk=pk-
elseif pk< then
pk=pk+
end if
a=a&chr(pk)
e-d if
else
a=a&vbcrlf
end if
next
UnEncode=a
end function
%>
Xvid_BF什么意思
很复杂,一两句说不清楚。源码
XviD vs DivX
年,软件TDX的联盟联盟规则中,除了允许使用旧有的源码DivX3.编码之外,新加入了第二种核准使用的软件编码?也就是本文标题中的XivD编码。作为每年在网上放出数千部最新影片的网上高品质影音组织,他们所遵循的规则对于整个MPEG-4编码的应用市场来说,都有决定性的重要意义。XviD在TDX中,以Di称:XviD是继承DivX3.的非商业同人版。那么XviD到底是什么?它又有些什么样通天彻底的视频压缩本领?或许您并不知道的是:XviD是个本来不会出现的东西……
几经波折的诞生记
4年以前,在PC上能用的唯一MPEG-4编码器就是由微软所开发的,包括MS MPEG4V1、MS MPEG4V2、MS MPEG4V3的系列编码内核。其中前面两种都可以用来制作AVI文件,至今都作为Windows的默认组件。不过V1和V2的php快递系统源码编码质量都还不太好,直到MS MPEG4V3开始,画面质量有了显著的进步。不过微软却决定仅将这个MS MPEG4V3 的视频编码内核封闭在Windows Media流媒体技术,也就是我们熟知的ASF文件之中,不再能用于AVI文件。ASF文件虽然有一些好处,但是过于封闭甚至不能被编辑,惹恼了天不怕地不怕的**黑客。很快便有小组修改了微软的MS MPEG4V3,解除了不能用于AVI文件的限制,并开放了其中一些压缩参数,由此,也就诞生了我们今天所熟悉的MPEG4编码器DivX;-)3。。
DivX广泛流行,成为DVDrip的标准,问题是,它的基础技术是非法盗用微软的,只能在地下里流传却上不了台面,无法进行更广泛的产品化,更无法生产硬件播放机。在这种情况下,一些精通视频编码的程序员(包括原DivX 3.的开发者)成立了一家名为DivXNetworks Inc.的公司,简称DXN。DXN发起一个开放源码项目ProjectMayo,目标是开发一套全新的、开放源码的协会网站源码phpMPEG4编码软件。特别是完全符合ISO MPEG4标准的OpenDivX CODEC吸引了许多软件高手参与,并很快开发出OpenDivX编码器和解码器原型,之后又开发出更高性能的编码器Encore 2等等。这一时期,主要编码工作是DXN的人在做,而许多技术难关的解决得力于来自开放源码社会的帮助。
就在一切都看起来进展顺利的时候,好戏上演了。ProjectMayo虽然是开放源码,但不是依据GPL(通用公共许可证,一种开放源码项目中常用的保障自由使用和修改的软件或源码的协议)。DXN在设计授权协议时留了一手,年7月,就在Encore 2基本成型,差不多可以产品化的时候,DXN另搞了一个DIVX.COM网站,封闭了源码,发布了他们自己的DivX 4。DivX 4的基础就是OpenDivX中的Encore 2,但利用了DivX的牌号,可以说出乎意料地摆了所有人一刀。由于DXN不再参与,ProjectMayo陷于停顿,Encore2的源码也被DXN从服务器上撤下。经过激烈的争论,DXN虽然承认Encore 2在法律上是开放的,但仍然拒绝把它放回服务器。发布任务网站源码开放源码社会就这样被狠狠地涮了一回。
OpenDivX尚不能实际使用,而DivX 4(以及后续的收费版本--DivX 5)等等都成了私有财产,许多人为打破微软垄断而无偿付出的智慧和劳动仅仅是帮助了DXN发财,这种结果当然是不能被接受的。为此,整个0dayz组织永远地拒绝了DXN公司的DivX4\5,而原OpenDivX开发组中的幸存者,逐渐重新聚拢开发力量,在最后一个OpenDivX版本的基础上,发展出了XviD。
劫后余生的XviD到现在又度过了近1年时间,它继承并发展了OpenDIVX Encore 2,性能得到极大提高,被认为目前世界上速度最快的MPEG4 CODEC。XviD重写了所有代码,并吸取前车之鉴依照GPL发布(注意不再是LGPL,所以谁要是想用它做成产品而不开放源码是非法的)。不过,因为MPEG4还存在专利权的问题,所以XviD只能仿照LAME的做法,仅仅作为对如何实现ISO MPEG-4标准的一种研究交流,网站上只提供源码,如果要使用就要自己编译源码或者到第三方网站下载编译好的可运行版本。
想当初Gaj之流的几个家伙搞OpenDivX的时候,一开始是很像一个像模像样的开放源码项目,很多人都被吸引过去一起开发,燕窝溯源码信息测试。直到后来,那几个家伙一夜之间露出骗子的本来面目,把OpenDivX的成果一股脑带走,变成了封闭源码的DivX4,而后进一步变成现在的收费的DivX5了。本来很好的OpenDivX被逼流产,不过也就促成了今天XviD的诞生、发展和壮大。现在的XviD更可以说超越了DivX 5,以更好的质量、更强的功能挑战着新一代的MPEG4应用战场。
丰富多彩的技术特性
不仅XviD的出现本身就是开放源码社会中典型的一部教科书,它在技术上的各种新特性也都是货真价实、童叟无欺的。对于一个第二代的MPEG4视频编码内核来说,XviD的各种算法设计都有代表性的先进意义。
多种编码模式
除了最原始单重估定码流压缩(1-pass CBR)之外,XviD提供了包括:单重质量模式动态码流压缩、单重量化(Quantization)模式动态码流压缩、和包括外部控制和内部控制的两种双重(2-pass)动态码流压缩模式。XviD显然是目前PC上的MPEG4编码内核中,可选模式最多的视频编码。
其中特别是双重(2-pass)动态码流压缩模式,通过检测画面运动幅度以最优化的方式曲线分配画面量化幅度,使充满活性元素的视频影片可以在占用空间和画面质量之间获得最佳的平衡。而单重量化(Quantization)模式动态码流压缩,可以高速地一次性生成可控画面细节的动态码流视频文件,在较少的压缩时间代价之下,可以获得较稳定的画面细节质量,这都是单纯的DivX3.所不具有的优秀功能。
量化(Quantization)方式和范围控制
量化(Quantization),简单的说就是在编码时通过对时间或空间上相邻的画面单元进行同化、模糊细节的程度,是对画面质量最基本的控制因素。XviD不仅提供了标准的MPEG量化方式,还特地提供了更适合低码流压缩的.h量化方式。并且XviD还可以在双重(2-pass)运算时,根据对画面信息的综合分析,动态的决定某段场景的画面量化方式,真可以说是为网络媒体文件传播中,空间与画质的平衡而考虑,设计贴心得到家了。
XviD还提供了强大的对压缩过程中的量化幅度的范围控制。用户可以选定压缩时允许使用的量化幅度范围。例如设定一个量化的上限,就可以避免可能出现的画质大幅下降的情况。
运动侦测(Motion Search)和曲线平衡分配(Curve)
对画面逐帧进行运动侦测,以及对全片段的运动侦测结果进行分析后,重新以曲线平衡分配每一帧的量化幅度,以做到:需要高码流的运动画面可以分配更多空间、更高的码流、更低的量化幅度来保持画面的细节;而对于不包含太多运动信息的静态画面,则消减分配预算。这种把好钢用在刀刃上的做法,是XviD做为第二代MPEG4编码的核心内容。
XviD提供了多极运动侦测精度,包括半像素插值(half pixel interpolation)的技术以x像素的微区块为单元标示上运动矢量;以及4分运动矢量(inter4v motion vectors)的方式,以8x8的像素区块为单元更细致的纪录运动向量以供二重分析。
动态关键帧距(I-frame interval)
动态关键帧距是另一个XviD所具有的,在空间和画面之间获得最大平衡的技术。我们知道在视频压缩中不是每一帧都记录着全部的画面信息,事实上只有关键帧记录着完整的画面信息,而后续的P帧(P-Frame)仅仅是纪录下与之前一帧的差值。如果关键帧之间的画面变化很大,则会浪费宝贵的空间在P-Frame上;而加入把变化很大的那一帧记录在关键帧里,那么由于后续的帧不再有更大的变化,就可以节省P帧所需的空间。因此,根据画面镜头切换和运动幅度来变换关键帧的位置,对于视频压缩下的画面质量提高,就有着事半功倍的效果。
心理视觉亮度修正
除了基本的MPEG4编码外,XviD还提供了不少附加功能。其中典型的就是心理视觉亮度修正。这个功能可能通过去除肉眼不能分辨的亮度信号和亮度差异,来提高压缩效率。遗憾的是,尽管这个设计非常的有创意,但是目前的实际应用中却会导致肉眼可见的画面质量下降,还期待在日后的版本中可以有所改进。
演职员表选项
另外一个贴心的设计是**专用的“演职员表选项”。这个功能可以在用户指定的某些不必要保留细节的段落处(例如**的演职员表),设定为极低的码流。甚至压缩到正片码流的%以下,可以节省不少空间,设计得非常贴心。
外部自定义控制
除了XivD自己的内部曲线分配控制方式外,XviD也提供了外部的开放接口。允许使用者略过XviD本身的编码分析内核,利用第三方提供的外部分析工具,例如Gordian Knot,生成的分配好的控制文件,再交还XviD做最终的二重运算压缩。这种方式扩展了XviD的可用性和用户控制程度,因为像Gordian Knot这种软件甚至可以做到由用户控制每一帧的量化幅度和码流分配额度,可以为高级应用提供更多的可能性。
运动矢量加速(Hinted Me)编码
XviD还有专为提高编码效率而开发的设计,就是纪录下画面的运动矢量信息至一个Log文件中。再在二重运算压缩时通过直接读取该文件中的信息,节省下对运动矢量信息的重复运算,大幅提高编码速度。
画面优化解码
不仅在编码上XivD拥有强大的功能,在解码时的画面优化方面,XviD也有很多新的建树。例如"Horizontal deblock (Y)"可以柔化水平方向的亮度马赛克;"Horizontal deblock (C)"可以柔化水平相的色度马赛克;"Deringing(Y)"可以柔化环状亮度色斑;"Deinging (C)"可以柔化环状色度色斑;"mosquito"可以减少画面中的蚊状噪斑。并且,这些XviD的画面优化手段都是可选的,因此只要关闭几个不是那么必要的选项,就可以在低配置的PC机上播放。
正在开发的B帧
另一个XviD中引人注目的技术发展,就是B帧。我们知道I帧就是关键帧,P帧在关键帧之间,只储存与之前一幅已解压画面的差值。B帧与P帧的原理一样,但除了叁考之前解压了的画面外,亦会参考后面一帧中的画面信息。因此B帧解压出来的画面比P帧就要来的好。
之前的MPEG4编码内核都仅仅使用了I帧和P帧存储画面。如果能在此基础上使用B帧技术,自然可以在画质和压缩比上更上一层楼。目前XviD已经为开发人员提供了测试性质B帧体验版的XviD编码内核,相信不久的将来,XviD就可以把MPEG4编码的优势发挥到极致,成为网上视频记录格式的盟主。
XviD格式的DVDrip怎么看?
XviD格式的DVDrip较之XviD格式的DVDrip,在播放时差别不大,注意以下两点:
1.安装ffdshow,安装后,它可以解码任何一种(DivX3,5,XviD)MPEG-4编码,还有很多画面优化功能。
2.安装ZoomPlayer。现在很多新的DVDrip的音频部份支持国粤双语、中英双语、中日双语等多音轨模式,用MediaPlayer播放时调节声道很麻烦,而ZoomPlayer可以很方便地切换声道。ZoomPlayer是一款绿色的播放软件,特有消除OverScan功能优化缩放画面。除支持全屏幕及播放列表等外还支持面板代换(可自定义面板,详见SKIN目录下的defaultskin.skn),还包括好用的控制栏及使用背景颜色来测试显示泼的控制栏及使用背景颜色来测试显示器的明亮度功能,并且能在播放ASF、WMV等文件时拖动时间条(不用修复),支持 DVD 的播放。需要DirectX支持,最低不能低于DX8。
最近,在很多DVDrip社区,已经出现了字幕组,互相配合进行字幕的制作工作,DVDrip的翻译和本地化制作产生了。最近网上广为流传的《圣斗士-冥王篇》就是由高校的漫画社团制作的字幕