一半君的总结纸

听话只听一半君

Linux 下如何简便的录屏幕成 GIF 文件用于贴图在论坛或Stackoverflow问大神PyQt问题 – FFcast

公司虽然有录屏幕工具,但是好麻烦

需要的工具有

  1. 编译时候带 –enable-x11grab 的ffmpeg,如何知道带没带可以直接运行ffmpeg,然后
    ffmpeg_x11grab如果你从repo里装的ffmpeg的没有带这个argument,那你可以自己编译一个
  2. 需要有imagemagick
  3. lolilolicon(萝莉控!?)大神编的FFcast script, 有原版(需要bash>4.3),和chilicuil修改版(不需要bash>4.3)因为我这里是CentOS 6.5,比较老,没有bash 4.3,所以我这里用chilicuil大神的
    git clone https://github.com/minos-org/ffcast.git
    cd ffcast
    make
    # 你可以随便“装”个地方先,之后再拷去别的地方,或者你直接prefix=$HOME/.local也可以
    make install DESTDIR=$HOME/tools
    
  4. imgur网站有很多上传工具和script,比如这个Bart’s Bash Script Uploader
  5. xsel 或者 xclip

综上,你可以自己拼一个script

#!/bin/bash
TMP_AVI=$(mktemp /tmp/outXXXXXXXXXX.avi)
TMP_GIF=$(mktemp /tmp/outXXXXXXXXXX.gif)
ffcast -s ffmpeg -y -r 15 $TMP_AVI \
&& convert -set delay 10 -layers Optimize $TMP_AVI $TMP_GIF \
&& ~/.local/bin/imgurbash.sh $TMP_GIF

其中-set delay 10 是慢放用的
为了达到“连放”效果,lz还特意去找ffmpeg accurate seeking的说明,试了老半天 ..
edit: lz又重录了一段,遗憾的是”连放效果”不好…orz

ffmpeg -i out.avi -ss 00:00:03.20 -t 00:00:00.55 -vcodec copy out_1.avi -y ; convert -loop 0 -layers Optimize out_1.avi out.gif ; ~/.local/bin/imgurbash.sh out.gif

之后你就有了…
idmt sb

edit:又改了下,因为imgur上传gif最大只能2MB,这里试着用gifsicle把他压小些,因为不知道如何指定说我就要最大2MB,请自动酌情降低质量要怎么写,如果实在太大,重录把… 反正问PyQT问题一般也就录几秒

#!/bin/bash
TMP_AVI=$(mktemp /tmp/outXXXXXXXXXX.avi)
TMP_GIF=$(mktemp /tmp/outXXXXXXXXXX.gif)
ffcast -s ffmpeg -y -r 15 $TMP_AVI \
&& convert -set delay 10 -layers Optimize $TMP_AVI $TMP_GIF 

maxsize=2048
actualsize=$(du -k "$TMP_GIF" | cut -f 1)
if [ $actualsize -ge $maxsize ]
then
	TMP_GIF2=$(mktemp /tmp/outXXXXXXXXXX.gif)
	gifsicle -O2 --colors 64 $TMP_GIF  > $TMP_GIF2
fi

~/.local/bin/imgurbash.sh $TMP_GIF

edit2: 在家里的centos7上又半自动了下

#!/bin/bash
while getopts "ru" OPTION; do 
    case $OPTION in 
        r)  echo recording
            TMP_AVI=$(mktemp /tmp/outXXXXXXXXXX.avi)
            TMP_GIF=$(mktemp /tmp/outXXXXXXXXXX.gif)
            ffcast -s ffmpeg -y -r 20 -vcodec huffyuv $TMP_AVI \
            && convert -set delay 10 -layers Optimize $TMP_AVI $TMP_GIF
            export TMP_GIF=$TMP_GIF 
            gwenview $TMP_GIF >/dev/null 2>&1
            echo recorded gif : $TMP_GIF 
            exit 0
            ;; 
        
        u)  maxsize=2048
            TMP_GIF=$(ls -t /tmp/out*.gif | head -1)
            actualsize=$(du -k $TMP_GIF | cut -f 1)
            echo actialsize: $actualsize
            if [ $actualsize -ge $maxsize ]
            then
                TMP_GIF2=$(mktemp /tmp/outXXXXXXXXXX.gif)
                gifsicle -O2 --colors 64 $TMP_GIF  > $TMP_GIF2
                TMP_GIF = $TMP_GIF2
            fi

            echo 'uploading gif : '$TMP_GIF
            ~/scripts/imgurbash.sh $TMP_GIF
            ;; 

        *) echo "Incorrect options provided" exit 1 ;; 
    esac 
done 

然后在~/.bashrc里加了两个alias

alias record='~/scripts/gif-batch.sh -r'
alias upload='~/scripts/gif-batch.sh -u'

所以之后只要运行 record 就可以录,运行 upload 就可以上传了

edit3: 又给改进了下,在这里,加了上传到 gfycat 和可以指定文件名

#!/usr/bin/env bash

# the convert call depends on whether you have h264 support in 
# convert -list format
# if you don't have it , then record to -vcodec huffyuv
# if you see convert: Not enough pixel data `/tmp/x.avi' @ avi.c/ReadAVIImage/1243.
# maybe try removing -vcodec completely and use uncompressed avi

# usage:

#     gif-batch.sh -r # just record 
#     gif-batch.sh -w # just record window
#     gif-batch.sh -rc # record and upload 
#     gif-batch.sh -wc # record window and upload 
#     if-batch.sh -wc xxx.gif # record window and upload , save as xxx.gif

if [ $# -eq 0 ]; then 
    echo -e "Usage: \n\t git-batch.sh -wruc\n\n"
    exit 0
fi


control_c()
# run if user hits control-c
{
  echo -en "\n*** Ouch! Exiting ***\n"
  # cleanup
  exit $?
}

# trap keyboard interrupt (control-c)
trap control_c SIGINT

for last; do true; done


if [[ "$last" == *.gif ]]
then
    GIF_FILE=$last
    echo 'file:' $last
fi

while getopts "wruc" OPTION; do
    case $OPTION in
        w)  echo recording window
            RECORD_WINDOW=true
            FFCAST_PARAM="-w"
            # ;& # this means continue to execute the next block without testing its pattern
            ;&

        r)  echo recording
            TMP_AVI=$(mktemp /tmp/outXXXXXXXXXX.avi)
            TMP_GIF=$(mktemp /tmp/outXXXXXXXXXX.gif)
            if [ "$RECORD_WINDOW" = true ] ; then
                echo "recording window is true"
            fi

            RECORD_CMD=$(echo ffcast  ${FFCAST_PARAM:--s} ffmpeg -y -r 20 $TMP_AVI \&\& convert -set delay 10 -layers Optimize $TMP_AVI $TMP_GIF)
            echo Record command : $RECORD_CMD
            eval $RECORD_CMD

            if [ -n "$GIF_FILE" ]; then
                echo 'copying to specified gif file', $GIF_FILE 
                /bin/cp -f $TMP_GIF $GIF_FILE 
                TMP_GIF=$GIF_FILE
            fi

            export TMP_GIF=$TMP_GIF
            # gwenview $TMP_GIF >/dev/null 2>&1
            gthumb --viewer $TMP_GIF >/dev/null 2>&1
            echo recorded gif : $TMP_GIF
            # exit 0
            ;;&
         
        u)  maxsize=2048
            if [ -n "$GIF_FILE" ]; then
                TMP_GIF=$GIF_FILE
            else
                TMP_GIF=$(ls -t /tmp/out*.gif | head -1)
            fi

            actualsize=$(du -k $TMP_GIF | cut -f 1)
            echo actialsize: $actualsize
            if [ $actualsize -ge $maxsize ]
            then
                TMP_GIF2=$(mktemp /tmp/outXXXXXXXXXX.gif)
                gifsicle -O2 --colors 64 $TMP_GIF  > $TMP_GIF2
                TMP_GIF = $TMP_GIF2
            fi
 
            echo 'uploading gif : '$TMP_GIF
            # http://imgur.com/tools
            ~/scripts/imgurbash.sh $TMP_GIF
            exit 0
            ;;&
 
        c)  # upload to gfycat
            echo Uploading to gfycat
            if [ -n "$GIF_FILE" ]; then
                TMP_GIF=$GIF_FILE
            fi

            GYFCAT_KEY=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 10 | head -n 1)

            curl -i -F "key=$GYFCAT_KEY"       -F "acl=private"      -F "AWSAccessKeyId=AKIAIT4VU4B7G2LQYKZQ"      -F "policy=eyAiZXhwaXJhdGlvbiI6ICIyMDIwLTEyLTAxVDEyOjAwOjAwLjAwMFoiLAogICAgICAgICAgICAiY29uZGl0aW9ucyI6IFsKICAgICAgICAgICAgeyJidWNrZXQiOiAiZ2lmYWZmZSJ9LAogICAgICAgICAgICBbInN0YXJ0cy13aXRoIiwgIiRrZXkiLCAiIl0sCiAgICAgICAgICAgIHsiYWNsIjogInByaXZhdGUifSwKCSAgICB7InN1Y2Nlc3NfYWN0aW9uX3N0YXR1cyI6ICIyMDAifSwKICAgICAgICAgICAgWyJzdGFydHMtd2l0aCIsICIkQ29udGVudC1UeXBlIiwgIiJdLAogICAgICAgICAgICBbImNvbnRlbnQtbGVuZ3RoLXJhbmdlIiwgMCwgNTI0Mjg4MDAwXQogICAgICAgICAgICBdCiAgICAgICAgICB9" -F "success_action_status=200"      -F "signature=mk9t/U/wRN4/uU01mXfeTe2Kcoc="      -F "Content-Type=image/gif"      -F "file=@$TMP_GIF"    https://gifaffe.s3.amazonaws.com/

            echo GYFCAT_KEY: $GYFCAT_KEY

            echo transcoding ...

            # maybe i shoudl use jq to parse json file
            # http://stedolan.github.io/jq/

            function jsonval {
            temp=`echo $json | sed 's/\\\\\//\//g' | sed 's/[{}]//g' | awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}' | sed 's/\"\:\"/\|/g' | sed 's/[\,]/ /g' | sed 's/\"//g' | grep -w $prop`
            echo ${temp##*|}
            }

            json=$(curl http://upload.gfycat.com/transcode/$GYFCAT_KEY --silent) 

            prop='gfyName'
            gyfid=`jsonval`
            prop='mp4Url'
            mp4Url=`jsonval`
            prop='webmUrl'
            webmUrl=`jsonval`
            prop='gifUrl'
            gifUrl=`jsonval`
            echo API Response: $json

            echo 
            echo gyfid: $gyfid 
            echo mp4Url: $mp4Url
            echo webmUrl: $webmUrl
            echo gifUrl: $gifUrl
            echo ---------------
            echo gyfurl: http://gfycat.com/$gyfid

            exit 0
            ;;

        *) # echo "Incorrect options provided" exit 1 ;;
            echo "done"
            ;;
    esac
done

edit 4: 又改了下,现在去掉了imgur,因为逼格太低,换成了gfycat,lz知道有很多垃圾在里面,但是还没定型,lz也不知道最后想要什么效果
有几处疑问如下:

  1.  似乎在家里的centos7上用 -vcodec libx264,然后再convert转gif比较清楚,但是公司里convert非常之慢,似乎ffmpeg直接录成gif比较清楚
  2. 现在的json parse法比较弱智,也许用jq比较好,或者干脆把script写成python的,但是lz想先试试bash
#!/usr/bin/env bash

# the convert call depends on whether you have h264 support in 
# convert -list format
# if you don't have it , then record to -vcodec huffyuv
# if you see convert: Not enough pixel data `/tmp/x.avi' @ avi.c/ReadAVIImage/1243.
# maybe try removing -vcodec completely and use uncompressed avi

# usage:

#     gif-batch.sh -r # just record 
#     gif-batch.sh -w # just record window
#     gif-batch.sh -rc # record and upload 
#     gif-batch.sh -wc # record window and upload 
#     if-batch.sh -wc xxx.gif # record window and upload , save as xxx.gif

if [ $# -eq 0 ]; then 
    echo -e "Usage: \n\t git-batch.sh -wrc\n\n"
    exit 0
fi

CUR_DIR=$(pwd)

cleanup()
{
    cd $CUR_DIR

}

control_c()
# run if user hits control-c
{
  echo -en "\n*** Ouch! Exiting ***\n"
  cleanup
  exit $?
}

# trap keyboard interrupt (control-c)
trap control_c SIGINT


for last; do true; done
if [[ "$last" == *.gif ]]
then
    GIF_FILE=$last
    echo 'file:' $last
fi

random_key()
{

    echo $(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w $1 | head -n 1)
}


rand_name=`random_key 10`
echo rand file name : ${rand_name}

rec_dir_root=/tmp/ffcast
rec_dir=${rec_dir_root}/${rand_name}

mkdir -p $rec_dir

while getopts "wrc" OPTION; do
    case $OPTION in
        w)  echo recording window
            RECORD_WINDOW=true
            FFCAST_PARAM="-w"
            # ;& # this means continue to execute the next block without testing its pattern
            ;&

        r)  echo recording
            # TMP_AVI=$(mktemp /tmp/outXXXXXXXXXX.avi)
            # TMP_GIF=$(mktemp /tmp/outXXXXXXXXXX.gif)
            TMP_GIF=${rec_dir}/rec_${rand_name}.gif
            TMP_AVI=${rec_dir}/rec_${rand_name}.avi

            TMP_GIF_OPTIMIZE=${rec_dir}/rec_${rand_name}_optimize.gif

            # TMP_MOV=$(mktemp /tmp/outXXXXXXXXXX.mov)
            TMP_MOV=${rec_dir}/rec_${randname}.mov

            if [ "$RECORD_WINDOW" = true ] ; then
                echo "recording window is true"
            fi

            cd $rec_dir_root
            # RECORD_CMD=$(echo ffcast  ${FFCAST_PARAM:--s} ffmpeg -y -r 20 $TMP_AVI \&\& convert -set delay 10 -layers Optimize $TMP_AVI $TMP_GIF)
            # RECORD_CMD=$(echo ffcast  ${FFCAST_PARAM:--s} ffmpeg -y -r 20 $TMP_AVI \&\& convert -set delay 10 -dither none -depth 8 -deconstruct -layers optimizePlus -colors 32 $TMP_AVI $TMP_GIF)

            RECORD_CMD=$(echo ffcast  ${FFCAST_PARAM:--s} ffmpeg -y -r 20 -vcodec libx264 $TMP_AVI \&\& convert  -quality 100% -layers Optimize $TMP_AVI $TMP_GIF)

            # rm -rf /tmp/gif
            # mkdir -p /tmp/gif

            # RECORD_CMD=$(echo ffcast  ${FFCAST_PARAM:--s} ffmpeg -y -r 20 $TMP_GIF)

            cd $CUR_DIR

            echo Record command : $RECORD_CMD
            eval $RECORD_CMD

            # gifsicle –delay=10 –loop -O2 /tmp/gif/*.gif > animation.gif
            gifsicle -d10 $TMP_GIF -O3 -o $TMP_GIF_OPTIMIZE


            if [ -n "$GIF_FILE" ]; then
                echo 'copying to specified gif file', $GIF_FILE 
                /bin/cp -f $TMP_GIF $GIF_FILE 
                TMP_GIF=$GIF_FILE
            fi

            export TMP_GIF=$TMP_GIF_OPTIMIZE
            # export TMP_MOV=$TMP_MOV
            gwenview $TMP_GIF >/dev/null 2>&1
            # gthumb --viewer $TMP_GIF >/dev/null 2>&1

            echo recorded video : $TMP_GIF
            # exit 0
            
         
        # u  maxsize=2048
        #     if [ -n "$GIF_FILE" ]; then
        #         TMP_GIF=$GIF_FILE
        #     else
        #         TMP_GIF=$(ls -t /tmp/out*.gif | head -1)
        #     fi

        #     actualsize=$(du -k $TMP_GIF | cut -f 1)
        #     echo actialsize: $actualsize
        #     if [ $actualsize -ge $maxsize ]
        #     then
        #         TMP_GIF2=$(mktemp /tmp/outXXXXXXXXXX.gif)
        #         gifsicle -O2 --colors 64 $TMP_GIF  > $TMP_GIF2
        #         TMP_GIF = $TMP_GIF2
        #     fi
 
        #     echo 'uploading gif : '$TMP_GIF
        #     # http://imgur.com/tools
        #     ~/scripts/imgurbash.sh $TMP_GIF
        #     exit 0
        #     ;;&
 
            ;;&

        c)  # upload to gyfcat
            echo Uploading to gyfcat

            if [ -n "$GIF_FILE" ]; then
                TMP_GIF=$GIF_FILE
            else
                TMP_GIF=$(ls -t ${rec_dir_root}/*/*.gif | head -1)
            fi
            echo  Uploading file: $TMP_GIF
            GYFCAT_KEY=`random_key 10`

            # exit 0

            #curl -i -F "key=$GYFCAT_KEY"       -F "acl=private"      -F "AWSAccessKeyId=AKIAIT4VU4B7G2LQYKZQ"      -F "policy=eyAiZXhwaXJhdGlvbiI6ICIyMDIwLTEyLTAxVDEyOjAwOjAwLjAwMFoiLAogICAgICAgICAgICAiY29uZGl0aW9ucyI6IFsKICAgICAgICAgICAgeyJidWNrZXQiOiAiZ2lmYWZmZSJ9LAogICAgICAgICAgICBbInN0YXJ0cy13aXRoIiwgIiRrZXkiLCAiIl0sCiAgICAgICAgICAgIHsiYWNsIjogInByaXZhdGUifSwKCSAgICB7InN1Y2Nlc3NfYWN0aW9uX3N0YXR1cyI6ICIyMDAifSwKICAgICAgICAgICAgWyJzdGFydHMtd2l0aCIsICIkQ29udGVudC1UeXBlIiwgIiJdLAogICAgICAgICAgICBbImNvbnRlbnQtbGVuZ3RoLXJhbmdlIiwgMCwgNTI0Mjg4MDAwXQogICAgICAgICAgICBdCiAgICAgICAgICB9" -F "success_action_status=200"      -F "signature=mk9t/U/wRN4/uU01mXfeTe2Kcoc="      -F "Content-Type=image/gif"      -F "file=@$TMP_GIF"    https://gifaffe.s3.amazonaws.com/

            curl -i -F "key=$GYFCAT_KEY"       -F "acl=private"      -F "AWSAccessKeyId=AKIAIT4VU4B7G2LQYKZQ"      -F "policy=eyAiZXhwaXJhdGlvbiI6ICIyMDIwLTEyLTAxVDEyOjAwOjAwLjAwMFoiLAogICAgICAgICAgICAiY29uZGl0aW9ucyI6IFsKICAgICAgICAgICAgeyJidWNrZXQiOiAiZ2lmYWZmZSJ9LAogICAgICAgICAgICBbInN0YXJ0cy13aXRoIiwgIiRrZXkiLCAiIl0sCiAgICAgICAgICAgIHsiYWNsIjogInByaXZhdGUifSwKCSAgICB7InN1Y2Nlc3NfYWN0aW9uX3N0YXR1cyI6ICIyMDAifSwKICAgICAgICAgICAgWyJzdGFydHMtd2l0aCIsICIkQ29udGVudC1UeXBlIiwgIiJdLAogICAgICAgICAgICBbImNvbnRlbnQtbGVuZ3RoLXJhbmdlIiwgMCwgNTI0Mjg4MDAwXQogICAgICAgICAgICBdCiAgICAgICAgICB9" -F "success_action_status=200"      -F "signature=mk9t/U/wRN4/uU01mXfeTe2Kcoc="      -F "Content-Type=image/gif"      -F "file=@$TMP_GIF"    https://gifaffe.s3.amazonaws.com/
            echo GYFCAT_KEY: $GYFCAT_KEY

            echo transcoding ...

            # maybe i shoudl use jq to parse json file
            # http://stedolan.github.io/jq/

            function jsonval {
            temp=`echo $json | sed 's/\\\\\//\//g' | sed 's/[{}]//g' | awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}' | sed 's/\"\:\"/\|/g' | sed 's/[\,]/ /g' | sed 's/\"//g' | grep -w $prop`
            echo ${temp##*|}
            }

            json=$(curl http://upload.gfycat.com/transcode/$GYFCAT_KEY) 

            # is response is API Response: {"error":"Connection timeout. Please check upload.gfycat.com\/status\/key for your finished conversion (details at gfycat.com\/api)"}
            # we need to wait and poll
            prop='error'
            error=`jsonval`
            ready=0

            echo API Response: $json
            sleepCount=1
            if [[ $error == Connection* ]]; then
                echo probably your image is encoding
                while [  $ready -eq 0 ]; do
                    echo sleep 60s then check status - $sleepCount 
                    sleep 60
                    json=$(curl http://upload.gfycat.com/status/$GYFCAT_KEY --silent) 
                    prop='task'
                    task=`jsonval`

                    echo API Response: $json

                    # sleepCount=$sleepCount+1
                    sleepCount=$((sleepCount+1))

                    if [ $task == complete ]; then 
                        ready=1
                    fi

                done

            fi 

            # after loop exits
            # {"task":"complete","gfyname":"InformalOrderlyElkhound"}

            prop="gfyname"
            gfyName=`jsonval`
            json=$(curl http://gfycat.com/cajax/get/$gfyName) 

            # {"gfyItem":{"gfyId":"unsungzigzagbream","gfyName":"UnsungZigzagBream","gfyNumber":878900342,"userName":"anonymous","width":856,"height":552,"frameRate":10,"numFrames":983,"mp4Url":"http:\/\/fat.gfycat.com\/UnsungZigzagBream.mp4","webmUrl":"http:\/\/fat.gfycat.com\/UnsungZigzagBream.webm","gifUrl":"http:\/\/zippy.gfycat.com\/UnsungZigzagBream.gif","gifSize":872965,"mp4Size":3015134,"webmSize":1458303,"createDate":1408965314,"views":1,"title":null,"extraLemmas":null,"md5":"4e00b2c81ae2c79e0b5950bfdb9f177a","tags":null,"nsfw":null,"sar":null,"url":false,"source":4,"dynamo":null,"subreddit":null,"redditId":null,"redditIdText":null,"uploadGifName":null}}

            # prop='gfyItem'
            # gfyItem=`jsonval`

            # echo gfyItem : $gfyItem
            # json=$gfyItem

            echo transcoding "done"
            echo new json: $json

            prop='gfyName'
            gyfid=`jsonval`

            prop='mp4Url'
            mp4Url=`jsonval`
            prop='webmUrl'
            webmUrl=`jsonval`
            prop='gifUrl'
            gifUrl=`jsonval`

            # echo API Response: $json

            echo 
            echo gyfid: $gyfid 
            echo mp4Url: $mp4Url
            echo webmUrl: $webmUrl
            echo gifUrl: $gifUrl
            echo ---------------
            echo gyfurl: http://gfycat.com/$gyfid

            exit 0
            ;;

        *) # echo "Incorrect options provided" exit 1 ;;
            echo "done"
            ;;
    esac
done

ps:这个script的折腾只是为了方便的录成gif然后上传,如果你只是要录桌面,那直接用ffcast就可以了,比如

# 录指定窗口 用libx264
ffcast -w ffmpeg -y -r 20 -vcodec libx264 xxx.mov

# 录指定区域,用拖拽框选设定
ffcast -s ffmpeg -y -r 20 -vcodec huffyuv x.avi

pss: 公司似乎用不了libx264或是huffyuv,此时可以加上-b:v 16384k 让录的avi质量高些
psss: 录了个5m44s的demo,原avi 115.7MB,转gif后5.1MB
ffcast_demo

demo已上传至gfycat,点这里观看 … 似乎gfycat把他压成了1MB

pssss:
发现convert的时候很卡,开始试了加-limit area 512MiB 没什么效果,设下面两个环境变量似乎有效果

export MAGICK_THREAD_LIMIT=2
export MAGICK_THROTTLE=50

但是设置过后转换就慢到无法结束了,有人建议编译的时候–disable-openmp,不过经试验,设置MAGICK_AREA_LIMIT为一个较小的数可能有用比如0(强制cache到disk)

export MAGICK_AREA_LIMIT=100

最新版我就不继续贴这里了,我放在github的gist上了

参考:
GIF screencasting; the UNIX way
imgur upload tools

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: