使用ffprobe获取视频信息 以 json/xml/ini 等格式输出

Command :
/bin/ffprobe -i xxx.mp4 -print_format json -show_format -show_streams -v quiet -pretty

-show_format json|ini|xml 支持多种格式

将有如下输出:

XML 格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<ffprobe>
    <streams>
        <stream index="0" codec_name="h264" codec_long_name="H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10" profile="High" codec_type="video" codec_time_base="1/120" codec_tag_string="avc1" codec_tag="0x31637661" width="1920" height="1080" coded_width="1920" coded_height="1080" has_b_frames="2" sample_aspect_ratio="0:1" display_aspect_ratio="0:1" pix_fmt="yuvj420p" level="42" color_range="pc" chroma_location="left" refs="1" is_avc="true" nal_length_size="4" r_frame_rate="60/1" avg_frame_rate="60/1" time_base="1/15360" start_pts="0" start_time="0:00:00.000000" duration_ts="8625930" duration="0:09:21.583984" bit_rate="3.152659 Mbit/s" bits_per_raw_sample="8" nb_frames="33695">
            <disposition default="1" dub="0" original="0" comment="0" lyrics="0" karaoke="0" forced="0" hearing_impaired="0" visual_impaired="0" clean_effects="0" attached_pic="0" timed_thumbnails="0"/>
            <tag key="language" value="und"/>
            <tag key="handler_name" value="VideoHandler"/>
        </stream>
        <stream index="1" codec_name="aac" codec_long_name="AAC (Advanced Audio Coding)" profile="LC" codec_type="audio" codec_time_base="1/48000" codec_tag_string="mp4a" codec_tag="0x6134706d" sample_fmt="fltp" sample_rate="48 KHz" channels="2" channel_layout="stereo" bits_per_sample="0" r_frame_rate="0/0" avg_frame_rate="0/0" time_base="1/48000" start_pts="576" start_time="0:00:00.012000" duration_ts="26956368" duration="0:09:21.591000" bit_rate="129.131000 Kbit/s" max_bit_rate="129.131000 Kbit/s" nb_frames="26324">
            <disposition default="1" dub="0" original="0" comment="0" lyrics="0" karaoke="0" forced="0" hearing_impaired="0" visual_impaired="0" clean_effects="0" attached_pic="0" timed_thumbnails="0"/>
            <tag key="language" value="und"/>
            <tag key="handler_name" value="SoundHandler"/>
        </stream>
    </streams>

    <format filename="未命名.mp4" nb_streams="2" nb_programs="0" format_name="mov,mp4,m4a,3gp,3g2,mj2" format_long_name="QuickTime / MOV" start_time="0:00:00.000000" duration="0:09:21.584000" size="220.556567 Mibyte" bit_rate="3.294542 Mbit/s" probe_score="100">
        <tag key="major_brand" value="isom"/>
        <tag key="minor_version" value="512"/>
        <tag key="compatible_brands" value="isomiso2avc1mp41"/>
        <tag key="encoder" value="Lavf57.83.100"/>
    </format>
</ffprobe>

Mac 关闭SIP

SIP 是在 OS X El Capitan 中有一个跟安全相关的模式叫 SIP(System Integrity Protection ),它禁止让软件以 root 身份来在 Mac 上运行。同时保障系统完整性。没特殊需求别瞎折腾

  1. 开机按住Command+R 进入 Recovery Mode
  2. 左上角菜单里找到实用工具 -> 终端
  3. 输入csrutil disable回车
  4. 重启

重新启用SIP,重复上述步骤在第三部执行csrutil enable即可
查看当前sip状态 执行 csrutil status

设置brew国内镜像

替换bottle源

# zsh 设置 ~/.zshrc
# bash 设置 ~/.bashrc
export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.ustc.edu.cn/homebrew-bottles"

刚设置完需要手动source一下,就像这样:source ~/.zshrc

替换homebrew

cd "$(brew --repo)"
git remote set-url origin https://mirrors.ustc.edu.cn/brew.git

替换homebrew-core

cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git

应用的是中科大的镜像源

撸了个轮子 2FA 一次性密码 生成 算法 Python版

Pypi: https://pypi.python.org/pypi/pytotp/3

from pytotp import c2fa

# 生成一个密钥
key = c2fa.generate_secret_key()

# 生成密码
token = c2fa.oath_hotp(c2fa.b32_decode(key),c2fa.get_timestamp())

#验证密码
result = c2fa.verify_key(key,'123456')
if result:
    print("Successfully")
else:
    print("Wrong token")

Python解析并批量下载m3u8播放列表后自动合并

import os, sys, requests


def show_progress(processed,total):
        """
        简易进度条
        """
    percent=(int(processed)/int(total))*100

    bar_length=50
    hashes = '#' * int(percent/100.0 * bar_length)
    spaces = ' ' * (bar_length - len(hashes))
    sys.stdout.write('\rPercent: [%s] %d%%[%s/%s]'%(hashes+spaces,percent,processed,total))


lines = []

# 解析并获取所有需要下载的ts分段
with open('file.m3u8','r+') as f:
    for line in f.readlines():
        line=line.strip()
        if (line.endswith('ts')):
            url=line
            lines.append(url)

i=0
total=len(lines)

# 开始下载
for line in lines:
    filepath = line
    i=i+1
    if (not os.path.isfile(filepath)):
        url = URLPREFIX/{}'.format(line)
        data = requests.get(url)
        with open(filepath,'wb') as code:
            code.write(data.content)

    show_progress(i,total)

# 调用ffmpeg进行合并
os.system('ffmpeg -i file.m3u8 -c copy file.mkv')

2018年目标

年前立个flag

  1. 完成Secure Key
    • 基于TOTP的一次性密码管理、生成APP(iPhone版和Android版)
    • 扫码添加
    • 密钥库本地加密
    • iCloud及其他云工具同步(AES256加密)
    • 自定义分类
    • 自定义icon
    • 多应用版和内部私密版(一键替换LOGO、布局、主题颜色等信息)
  2. 使用Go/Python完成C-Queue初版
    • 可指定Broker
    • 兼容:AMQPBeanstalkdKafka
    • HTTP带Token回调
    • 运行时任务保持和回收
    • HTTP命令接口
    • 支持分布式部署
    • 并发一致性
  3. 使用Go/Python完成C-Mail。实现域名绑定、收发邮件,数据库存储,磁盘限额。兼容SSL/STARSSL,可分布式部署。
    • 实现域名绑定
    • 收发邮件
    • 数据库存储(或整合ElasticInbox)
    • 磁盘限额
    • 兼容SSL/STARTTLS
    • 可分布式部署
    • 私有HTTP接口
    • EventPush接口
  4. 完善C-DMSDocker Manage System 基于Go开发的Docker分布式运维监控系统)
    • 管理全局Swarm
    • 实现SSH协议
    • 主机发现
    • SSH安装部署Docker接入Swarm
    • 全局监控报警
  5. 完成C-DHUB(Docker Hub)
  6. 完成C-GSG(Global Sockets Gateway)

Git 删除旧的提交历史

1.创建新分支(–orphan)

--orphan 建立一个分支不继承任何分支且没有任何commit(基于当前代码分支代码)

git checkout --orphan new

执行完毕后会自动切换到new分支

2.将当前代码进行commit

git add -A

3.创建commit

git commit -am "init"

4.删除要替换的分支

git branch -D master

5.将new更名

git branch -m master

6.推送(-f)

git push -f origin master

7.done