FFmpeg 执行音视频格式转换、拼接和剪切处理非常好使,最近在项目中需要对音视频原文件进行处理,为了省事儿我直接在 code 里调用 shell 来执行相关命令。

但是这样搞往往会留坑,比如说当同名输出文件已存在于文件系统中时,terminal 控制台就会弹出交互请求是否覆盖已有文件,这对于程序来讲太不友好了,我需要一波默认覆盖的操作。

解决的问题办法就是在传参时添加 -y 参数,之后的问题就迎刃而解了。

# video concat 
ffmpeg -y -i "concat:8553.ts|7166.ts" -vcodec copy 55216.flv

# video cut
ffmpeg -y -i 4134.ts -ss 00:00:05.0 -t 00:00:20.0 -vcodec copy -async 1 slice.mp4

# extract the specific frame
ffmpeg -y -i 1.ts -f mjpeg -ss 3 -t 1  test1.jpg

# convert video to GIF
ffmpeg -y -i 1.ts -ss 4 -t 5 -r 5 -f gif -s 512x288 4.gif

最近因为项目需求重新拾起了 C++,迁移到 x86_64 Linux 平台上之后 CMake 实在是一个必不可少的技能点,以下是一个分步教程,涵盖了CMake的常见构建系统用例,内容翻译自官网教程。

Step1 A Basic Starting Point

最基本的就是将一个源代码文件编译成一个可执行程序。对于一个简单的工程来说,两行的CMakeLists.txt文件就足够了。这将是我们教程的开始。CMakeLists.txt文件看起来会像这样:

cmake_minimum_required (VERSION 2.6)
project (Tutorial)
add_executable(Tutorial tutorial.cxx)

注意,在这个例子中,CMakeLists.txt都是使用的小写字母。事实上,CMake命令是大小写不敏感的,你可以用大写,也可以用小写,也可以混写。tutorial.cxx源码会计算出一个数的平方根。它的第一个版本看起来非常简单,如下:

Continue reading

Waxing Gibbous Moon Above Earth's Limb

Waxing Gibbous Moon Above Earth’s Limb

placeHolder

随着宇宙中暗能量膨胀速度的加快,
许多遥远的星星每天都在更快地离我们远去,
直到某一天,
相互远离的速度最终超过光速,
恒星的光再也无法传到地球,
繁星消失。

The stars disappear.

— MorningRocks

Systemd integration

Systemd is now included in both the centos:7 and centos:latest base containers, but it is not active by default. In order to use systemd, you will need to include text similar to the example Dockerfile below:

FROM centos:7
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]

Dockerfile for systemd base image

This Dockerfile deletes a number of unit files which might cause issues. From here, you are ready to build your base image.

$ docker build --rm -t local/el7-systemd .

Example systemd enabled app container

In order to use the systemd enabled base container created above, you will need to create your Dockerfile similar to the one below.

FROM local/el7-systemd
RUN yum -y install httpd; yum clean all; systemctl enable httpd.service
EXPOSE 80
CMD ["/usr/sbin/init"]

Build this image:

$ docker build --rm -t local/el7-systemd-httpd .

Running a systemd enabled app container

In order to run a container with systemd, you will need to mount the cgroups volumes from the host. Below is an example command that will run the systemd enabled httpd container created earlier.

$ docker run -ti -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 80:80 local/el7-systemd-httpd

This container is running with systemd in a limited context, with the cgroups filesystem mounted. There have been reports that if you’re using an Ubuntu host, you will need to add -v /tmp/$(mktemp -d):/run in addition to the cgroups mount.

The Dawn of a New Era in Human Spaceflight

Sailing Over the Caribbean From the International Space Station

placeHolder

没有真正意义上的亲密,
我们手牵手时感受到的触觉,不过是彼此皮肤上的原子间的斥力罢了。

Atomic Force.

— MorningRocks

linux 下 g++ 编译程序时,-I, -L, -l 的作用

g++ -o compress  compress.cpp  \
  -I/home/include/ \
  -L/lib/ \
  -lz

1. -I (Capital i)

编译程序按照 -I 指定的路进去搜索头文件。

-I/home/include/ 表示将 -I/home/include/ 目录作为第一个寻找头文件的目录,寻找的顺序是:
/home/include/ –>/usr/include–>/usr/local/include

2. -L

表示:编译程序按照 -L 指定的路进去寻找库文件,一般的在 -L 的后面可以一次用 -l 指定多个库文件。

-L/lib/ 表示到 /lib/ 目录下找库文件

3. -l (lowercase L)

表示:编译程序到系统默认路进搜索,如果找不到,到当前目录,如果当前目录找不到,则到 $LD_LIBRARY_PATH 等环境变量置顶的路进去查找,如果还找不到,那么编译程序提示找不到库。

本例子使用的是gunzip库,库文件名是libz.so,库名是z。很容易看出,把库文件名的头lib和尾.so去掉就是库名了。

在 Docker 容器里跑 Python 程序时,我们经常遇到通过print函数或者logging 模块输出的信息在容器 log 中迷之失踪,过了好久又迷之出现。这是因为 Python 在写 stdout 和 stderr 的时候有缓冲区,导致输出无法实时更新进容器 log。

有如下几种方法解决:

1.增加环境变量
对于使用print函数打印的内容,在运行容器时增加环境变量PYTHONUNBUFFERED=0就可以解决。

2.配置 logging 的 stream 参数

import logging
logging.basicConfig(stream=sys.stdout)

这样,通过 logging 模块打印的日志都会直接写到标准输出 stdout。

或者自定义两个StreamHandler分别配置为输出到 stdout 和 stderr,来对不同 log 分别进行输出处理。

3.WSGI server 配置参数
如果是以 WSGI server 运行的 web 应用,以 gunicorn 为例,在 gunicorn 的启动命令中增加参数--access-logfile - --error-logfile -即可。

Sailing Over the Caribbean From the International Space Station

Sailing Over the Caribbean From the International Space Station

placeHolder

「喝醉的酒鬼总能找到回家的路,喝醉的鸟儿则可能永远也回不了家了。」

这是数学家 George Pólya 在一百年前证明的定理。

翻译成可以简单理解的人类语言(并不是)则是:
在二维网络中随机游走是常返的,但在三维空间中则不是。

此处应有数据做支撑:
在二维网络中随机游走,回到出发点的概率是 100%;在三维空间中大约是 34%;而在八维空间中,这个概率只有 7.3%。

A drunk man will find his way home, but a drunk bird may get lost forever.

— MorningRocks

析构函数是 C++ 中一个非常重要的概念,析构函数 (destructor) 与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。 析构函数往往用来做“清理善后” 的工作,例如在建立对象时用 new 开辟了一片内存空间,delete 则会调用析构函数后释放内存。

而在 Python 中没有专用的构造和析构函数,但是一般可以在__init____del__分别完成初始化和删除操作,以替代构造和析构。

但是 Python 社区中的许多人都不推荐使用 __del__,因为 Python 对对象使用了引用计数来管理,很多情况下是很难以估计是什么时候引用计数为 0 而造成销毁的,同时很多使用技巧告诉我们使用 Python 编程不用再过度优化内存使用,以避免写出 C++ 风格的代码。

在本文中,我们将明确如何来正确使用__del__

Continue reading