一次艰难的采集之旅

看一网站内容很好,决定了开始本次采集活动.具体网址隐藏,只讲经过跟处理方法.

网站直观是以伪静态形式进行展示,为方便采集,直接采集一级列表页后,拿到全部的1500多个二级列表页.为防止因为采集原因造成对方的服务器压力过大,直接保存所有二级列表页的内容到本地文件进行后续操作.

这里的所有二级列表页保存后,没发现任何异常现象.本地解析所有内容页地址1.5W个.采集出现的主要问题就在这些内容页上.

为保证采集的安全性,因为是针对特定服务器,所以没开启多线程,防止压死对方服务器.或是被对方认为是恶意攻击.采集的原则,一样将页面内容以文本形式写入到文件.

分析保存的内容时,发现文件内容不全.发现原来他的系统作过设置.

反解析他的出现提示.根据内容发现,错误提示内容里,请联系**@**.com,以这个为关键字重新采集所有页面内容,发现过50条左右数据后,就会出现这个情况.

打开后续页面时,然后提示输入验证码.操作完成后,发现cookie里有变化.测试构造cookie问题依然,说明页面的cookie跟服务器的session有所相关.为方便起见,人工完成验证后,复制本地cookie到采集动作中.

采集到1K左右的时候,又出现问题了.这里页面反馈今天的请求次数已满.试着清空cookie之类的也完全不起作用,猜测应该跟IP相关.重启路由,验证采集正常.另测试重新注册一个帐号采集也正常.

如此反复,现在还在继续中...没有这次分析,估计机器是没办法完成了.

常用FFMPEG指令集

最近浏览国外网站时候发现,翻译不准确的敬请谅解。

1、将文件当做直播送至live
ffmpeg -re -i localFile.mp4 -c copy -f flv rtmp://server/live/streamName

2、将直播媒体保存至本地文件
ffmpeg -i rtmp://server/live/streamName -c copy dump.flv

3、将其中一个直播流,视频改用h264压缩,音频不变,送至另外一个直播服务流
ffmpeg -i rtmp://server/live/originalStream -c:a copy -c:v libx264 -vpre slow -f flv rtmp://server/live/h264Stream

4、将其中一个直播流,视频改用h264压缩,音频改用faac压缩,送至另外一个直播服务流
ffmpeg -i rtmp://server/live/originalStream -c:a libfaac -ar 44100 -ab 48k -c:v libx264 -vpre slow -vpre baseline -f flv rtmp://server/live/h264Stream

5、将其中一个直播流,视频不变,音频改用faac压缩,送至另外一个直播服务流
ffmpeg -i rtmp://server/live/originalStream -acodec libfaac -ar 44100 -ab 48k -vcodec copy -f flv rtmp://server/live/h264_AAC_Stream

6、将一个高清流,复制为几个不同视频清晰度的流重新发布,其中音频不变
ffmpeg -re -i rtmp://server/live/high_FMLE_stream -acodec copy -vcodec x264lib -s 640×360 -b 500k -vpre medium -vpre baseline rtmp://server/live/baseline_500k -acodec copy -vcodec x264lib -s 480×272 -b 300k -vpre medium -vpre baseline rtmp://server/live/baseline_300k -acodec copy -vcodec x264lib -s 320×200 -b 150k -vpre medium -vpre baseline rtmp://server/live/baseline_150k -acodec libfaac -vn -ab 48k rtmp://server/live/audio_only_AAC_48k

7、功能一样,只是采用-x264opts选项
ffmpeg -re -i rtmp://server/live/high_FMLE_stream -c:a copy -c:v x264lib -s 640×360 -x264opts bitrate=500:profile=baseline:preset=slow rtmp://server/live/baseline_500k -c:a copy -c:v x264lib -s 480×272 -x264opts bitrate=300:profile=baseline:preset=slow rtmp://server/live/baseline_300k -c:a copy -c:v x264lib -s 320×200 -x264opts bitrate=150:profile=baseline:preset=slow rtmp://server/live/baseline_150k -c:a libfaac -vn -b:a 48k rtmp://server/live/audio_only_AAC_48k

8、将当前摄像头及音频通过DSSHOW采集,视频h264、音频faac压缩后发布
ffmpeg -r 25 -f dshow -s 640×480 -i video=”video source name”:audio=”audio source name” -vcodec libx264 -b 600k -vpre slow -acodec libfaac -ab 128k rtmp://server/application/stream_name

9、将一个JPG图片经过h264压缩循环输出为mp4视频
ffmpeg.exe -i INPUT.jpg -an -vcodec libx264 -coder 1 -flags +loop -cmp +chroma -subq 10 -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -flags2 +dct8x8 -trellis 2 -partitions +parti8x8+parti4x4 -crf 24 -threads 0 -r 25 -g 25 -y OUTPUT.mp4

10、将普通流视频改用h264压缩,音频不变,送至高清流服务(新版本FMS live=1)
ffmpeg -i rtmp://server/live/originalStream -c:a copy -c:v libx264 -vpre slow -f flv “rtmp://server/live/h264Stream live=1″

11.ffmpeg直播切片
ffmpeg -i c730609ee7eb558741177b831653eec5.mov -an -c:v libx264 -b:v 128k -vpre ipod320 -flags -global_header -map 0 -f segment -segment_time 4 -segment_list axxx/test.m3u8 -segment_format mpegts axxx/stream%05d.ts

12.ffmpeg直接切HLS
ffmpeg -i in.mkv -map 0 -codec:v libx264 -codec:a libfaac -f ssegment -segment_list out.list out%03d.ts

13.两遍编码
ffmpeg -i 555.mp4 -an -vcodec libx264 -pass 1  -preset veryslow -threads 0 -b 500k -x264opts frameref=15:fast_pskip=0 -f rawvideo -y /dev/null && ffmpeg -i 555.mp4 -acodec libvo-aacenc -ab 256k -ar 96000 -vcodec libx264 -pass 2 -preset veryslow -threads 0 -b 200k -x264opts frameref=15:fast_pskip=0 tmp.mp4

14.自适应码流
ffmpeg -i 555.mp4 -c:v libx264 -b:v 350k -minrate 100k -maxrate 450k xxxx.mp4
ffmpeg -i 555.mp4 -c:v libx264 -b:v 350k -qmin 0 -qmax 50 -b:a 64k  xxxx.mp4

15获取文件视频信息
ffprobe -v quiet -print_format json -show_format -show_streams #

16 -deinterlace
隔行扫描的视频一般在播放的时候,会有横条感,逐行扫描的视频播放的时候感觉会好很多,会感觉清晰很多

超坑爹hadoop+hbase配置详细手册

配置以hadoop2.0为基础版本
hadoop一个比较坑爹的地方是他对glic的GLIBC_版本有要求,所以,如果系统里的libc.so.6不支持GLIBC_12的话,建议升级glic版本。查看是否支持的指令是:strings /lib64/libc.so.6 |grep GLIBC_

glibc的版本升也是一个超级坑爹的地方,具体可参考指令:glibc-2.14/configure –prefix=/usr –host=i686-linux-gnu –build=i686-linux-gnu CC=”gcc -m32″ CXX=”g++ -m32″   CFLAGS=”-O2 -march=i686″  CXXFLAGS=”-O2 -march=i686″   –disable-profile –enable-add-ons –with-headers=/usr/include –with-binutils=/usr/bin

比较好的解决方式是使用centos 6及以上版本,可完美解决该问题

系统安装前,永远关闭防火墙,指令:chkconfig –level 35 iptables off
修改selinux配置为disabled
还需要安装which

配置手机是集群为基本单位:两台机器192.168.1.111/112为配置说明

设置SSH的无密码登录:
1. ssh-keygen -t rsa -P ” //生成空密码文件
2. cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys //这个是本地的无密码登录
3. vi /etc/ssh/sshd_config //修改sshd的配置文件中的

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys

三项的注销去掉,然后重启sshd服务,指令 service sshd restart
4.scp /root/.ssh/id_rsa.pub root@192.168.1.112:/root/ 将本地的无密码登录文件复制到其它服务器
5.在其它服务器上执行1-3步,并同时执行 cat /root/id_rsa.pub >> /root/.ssh/authorized_keys导入远程的无密码登录
6.同样将其它机器的无密码登录导入到主服务器

JDK的配置(注意版本问题及32/64位)

解压到 /usr/local/jdk 目录下,各机器位置一样
配置PATH路径,修改/root/.bash_profile 在文件结尾的地方,增加以下内容(=号的两边不能留空格!)

export JAVA_HOME=/usr/local/jdk
export JRE_HOME=/usr/local/jdk/jre
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

执行指令 source /root/.bash_profile 即可生效,测试命令行执行:java -version 根据具体返回进行处理

hadoop的配置:

解压hadoop到/usr/local/hadoop 因为版本的不同,所以相应的修改也不一样,这里以2.0版本为例

配置文件在 etc/hadoop 目录下
启动文件在 sbin 目录下
命令文件在 bin 目录下

集群部署涉及到文件:core-site.xml hadoop-env.sh hdfs-site.xml mapred-site.xml masters slaves

各文件配置说明如下:具体相关说明,请百度

core-site.xml

<property>
<name>fs.default.name</name>
<value>hdfs://192.168.111.154:9000</value>
</property>

<property>
<name>dfs.name.dir</name>
<value>/data/hdfs/name</value>
</property>

<property>
<name>dfs.data.dir</name>
<value>/data/hdfs/data</value>
</property>

<property>
<name>hadoop.tmp.dir</name>
<value>/data/hdfs/tmp</value>
</property>

<property>
<name>dfs.replication</name>
<value>1</value>
</property>

hadoop-env.sh 修改

export JAVA_HOME=/usr/local/jdk 为你的JDK路径

hdfs-site.xml

<property>
<name>dfs.support.append</name>
<value>true</value>
</property>

<property>
<name>dfs.datanode.max.xcievers</name>
<value>4096</value>
</property>

mapred-site.xml

<property>
<name>mapred.job.tracker</name>
<value>192.168.111.154:9001</value>
</property>

masters

192.168.1.111 //namenode节点服务器

slaves

192.168.1.112 //datanode节点服务器

初始化namenode节点 进入 /usr/local/hadoop/bin 目录 执行 ./hadoop namenode -format 完成节点初始化,若存在错误,根据具体情况进行处理

测试启动HDFS功能 进入 /usr/local/hadoop/sbin 目录 执行 ./start-dfs.sh
通过JAVA的 jps功能,查看里程是否正常运行(主结点及数据结点)

测试创建HDFS目录 进入 /usr/local/hadoop/bin 目录 执行 ./hdfs dfs -mkdir /testdir
若无特别出错提示,则正常。错误问题再说

HBASE的配置

解压HBASE到 /usr/local/hbase
修改文件 config/hbase-env.sh  设置

export JAVA_HOME=/usr/local/jdk

JDK的路径

hbase-site.xml配置如下:(具体说明请百度)
<property>
<name>dfs.support.append</name>
<value>true</value>
</property>

<property>
<name>hbase.rootdir</name>
<value>hdfs://192.168.111.154:9000/hbase</value> //这个目录是需要通过HDFS指令来创建的
</property>

<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>

<property>
<name>hbase.zookeeper.quorum</name>
<value>192.168.111.154</value>
</property>

<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/data/hbase/zookeeper</value>
</property>

regionservers 是从结点的IP地址,每行一个

配置完成后,测试启动  进入 /usr/local/hbase/bin 执行 ./start-hbase.sh 根据结果进行调整

pytho防脚本二次启动带多线程退出代码

经过测试代码可以正常运行:
def checkrun():
count_str = 0
fname = __file__.replace(‘./’,”)
ff = subprocess.Popen(‘ps aux | grep ‘+fname+’ | grep -v “grep” | wc -l’, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in ff.stdout.readlines():
count_str += int(line)
retval = ff.wait()
return count_str

def main_thread_web():
global threadst,exitflg
if(len(threadst)<2):
t = threading.Thread(target=web_seach,args=(len(threadst)-1,random.randint(0,1)))
threadst.append(t)
t.start()
else:
threads_count = 0
for i in range(0,1):
if(threadst[i]==’1′):
threads_count += 1
if((threadst[i]==’0′) or (threadst[i]==’1′)):
t = threading.Thread(target=web_seach,args=(i,random.randint(0,1)))
threadst[i]=t
t.start()

if(threads_count ===  len(threads)):
exitflg = True
sys.exit(0)

def codingbyweb():

******

return status

def web_seach(nloops,necs):
global threadst,exitflg
get_cod = codingbyweb(data1,url1)
if(get_cod<>”):
****
threadst[nloops] = ’0′
else:
threadst[nloops] = ’1′

if __name__==’__main__’:

if(checkrun()>1):
sys.exit(0)
exitflg = False
threadst = []
while(1):
main_thread_web()
if(exitflg == True):
sys.exit(0)
time.sleep(5)

但存在一个问题是线程会多几次垃圾操作.后面有时间再修改了

微视地址解析详解

查看微视某用户页面时.

通过FIREBUG的帮助发现期访问http://wsm.qq.com/weishi/t/other.php的一个地址,

不过返回是以JSONCABAK形式的,说明可以通过构造相应的参数拿到返回值.

通过返回值反解析出其中的数据格式及数据包内容,拿到ID及VID参数.

通过激活某个视频,发现其有一个地址访问指向到http://wsi.weishi.com/weishi/videogeturl/downloadVideo.php,

这个地址根据相应的ID及VID参数返回一个包含地址的信息包,解析该包即可拿到相应的视频地址.
如此,全部解析完全.

相关的解析需要有Referer参数,所以,只能通过构造相应header参数才可以正常实现功能,具体代码见附件

geturl

JWPLAYER增加键盘监听事件

修改view/components/DisplayComponent.as文件中的addListeners方法增加全局键盘监听事件

这里需要使用全局类,不然监听会无效
RootReference.stage.addEventListener(KeyboardEvent.KEY_DOWN, keyclickHandler);

keyclickHandler的具体方法如下:
protected function keyclickHandler(event:KeyboardEvent):void{
if ( event.keyCode == Keyboard.SPACE ){
if (player.state == PlayerState.PLAYING || player.state == PlayerState.BUFFERING) {
dispatchEvent(new ViewEvent(ViewEvent.JWPLAYER_VIEW_PAUSE));
} else {
dispatchEvent(new ViewEvent(ViewEvent.JWPLAYER_VIEW_PLAY));
}

}

}
}

其它方法需要根据具体情况来定义

基于mod_h264_streaming插件的流分段加载技术

http://172.24.26.168/data/video/450k_mp4_4_aac.mp4?start=20&end=40

在基本的大文件的流式加载技术,让现在的流媒体点播实现了快速加载播放.但加载的过程中,若不进行分段式加载,则在播放过程中的流量浪费则造成更多的费用支出.

mod_h264_streaming是一个开源的MP4文件转流的一个插件.提供参数start及end参数选项.提供文件的截断播放.据此,可在播放器加载之初,根据实际视频文件长度进行自定义截断处理,然后再进行分断加载,播放过程中监控视频播放位置跟当前片断截断点进行比较,在范围内进行下一片断加载.亦可以根据seek指针位置到文件结束位,进行二次分断操作.具体可根据实现难度进行调整.

目前未涉及AS代码开发,暂无实例.

谷歌如何管理世界上最聪明的工程师

谷歌一直以关注人力资源和管理战略而著称,该公司的一大重要任务就是说服旗下大量工程师服务各自老板和主管经理的管理,并让这些工程师信服这些管理者的价值。

近日,《哈佛商业评论》(Harvard Business Review)刊登的一篇文章就详细解释了谷歌人力资源职员如何回答这一问题——管理者的作用体现在哪里?

工程师一直是谷歌内部的重要力量,在这些工程师的眼中,他们并不需要管理者,因为那样会增加官僚作风、遏制他们的创新,甚至还会让他们偏离“真正的工 作”。不过,谷歌在2002年时曾取消了工程师管理者的职位,尝试扁平化组织。事实上,这种做法并没有奏效,而且还导致了一些细小的个人问题也反馈到了首 席执行官等高层领导。最终,在经历了一项长达多年的名为“氧气项目(Project Oxygen)”的研究之后,谷歌还是发现,好的管理者的确会起到巨大作用。“氧气项目”主要是利用现有面试、调查和行为评论等方式来评估重要的管理行为 及其影响。

谷歌认为,最优秀的管理者应当具有以下八种特质:

1、是一个好的指导者。

2、能够赋予工作团队权力,而不是事无巨细地参与各种微观管理。

3、关注团队成员的成功和个人生活状况。

4、富有生产力,并以结果为导向。

5、是一个好的交流者,可以倾听他人的意见,并与他人共享信息。

6、帮助员工在事业上取得进步。

7、具有清晰的眼光,并能够为团队制定明确的战略。

8、具有重要的技能,能够帮助他(她)本人为团队提供意见。

在一个充满工程师的公司里,上述第二个特质可能最为重要。那些曾经质疑管理层效率和习惯于从事分散性目标任务的员工并不希望被牢牢管死。

谷歌还将上述8条物质作为考量工程师经理人的最佳准则,并用这些特质来考量、建议和培训经理人的具体行为。因此,工程师经理不仅要避免微观管理,而且 还需要平衡自由和意见,并给工程师提供可行的建议,给他们分配可以拓展的任务,明确信任他们的汇报,同时还要用高水平的人来鼓励他们。

以下就是谷歌员工对管理层的相关评述:

1、关于避免微观管理:“他不需要对我事无巨细的管理,而且要有逻辑性,能够倾听别人的意见,而不要安排恶毒的议程。他必须懂得尊重别人。这样的经理是不会让我离开谷歌的。”

2、关于平衡自由与意见:“他鼓励人们提出意见,但也要知道何时才能干预,并提出成功的建议。”

3、关于信任:“他需要培育一种有责任的文化氛围,而不要忽略我们会享受工作的事实。他应当知道他在管理一个人才队伍,而且也要能够与我们分享他信任我们这一事实。”

尽管工程师不喜欢别人过多的干预他们的工作,但如果有管理者能够密切关注他们的职业发展时,他们也会很愿意。特别是在谷歌这样的公司,经理人必须花费大量的时间来描述如何才能在晋升之外更好的发展自己的业务,例如获取参与更大项目的机遇等。

明确管理者的最佳特质和行为才是第一步,除了上述八条特质之外,管理者还需要从人力资源部门了解相关的反馈信息,特别是员工对他们各个特质的反馈、最佳法则相关的信息以及培训课堂上的建议,从而弥补他们的弱点。

FFMPGE将视频转为GIF动画详细说明

因业务需要,需将视频生成为GIF动画效果,通过测试,使用ffmpeg指令:

/usr/bin/ffmpeg -i http://domhttp.kksmg.com/2012/09/18/h264_450k_mp4_BTV12012091812401543682680943833_aac.mp4 -r 3 -ss 10 -vframes 30 -s 250×140 -f gif -y b98bf02afdc73253f2f07a113e440506.gif

其中:
-r 为帧频,一般视频参数为25左右.生成gif时候,每秒3张的效果是比较好的状态,文件不会太大,同时查看流畅度还可以.
-ss 为跳过时间,以秒为单位.抓取视频部分的时候,需要跳过前置的时间间隔.这里需要根据具体的视频文件来进行调整
-vframes 为需要生成的动画时长乘以-r参数的值..上面例子是生成10秒的GIF动画.所以,为30帧
-s 生成的动画大小.这里需要根据具体情况而定.
-f 生成的格式

这里需要注意的是:

生成文件的大小会跟 动画尺寸 帧频 时长等成正比,任何一个参数的调整都会影响到生成文件的大小.

所以,动画尽量不要以超过10秒为佳.