wc 命令是 Linux 下 Word Count 的缩写,用来统计文件中的字节数,字数,行数等等。
非常简单
wc [options] files
-c, --bytes 统计字节数
-l, --lines 统计行数
-m, --chars 统计字符数,不能和 -c 一起使用
-w 统计字数,一个字定义为由空白、空格或者换行分割的字串
-L, --max-line-length 最长行的长度
命令:wc file.txt
比如有如下文件:
cat file.txt
Linux
Debian
Ubuntu
Linux Mint
命令有如下结果
wc file.txt
4 5 31 file.txt
wc -l file.txt
4 file.txt
wc -c file.txt
31 file.txt
wc -w file.txt
5 file.txt
wc -m file.txt
31 file.txt
wc -L file.txt
10 file.txt
直接使用命令 wc file.txt
输出的内容对应
wc file.txt
4 5 31 file.txt
行数 单词数 字节数 文件名
使用管道命令或者重定向来避免命令打印文件名
wc 命令如果从管道命令或者重定向命令中接受输入,则不产生文件名输出,参考如下例子:
当 wc 接受文件名作为参数时,打印出文件名
wc -l /etc/passwd
41 /etc/passwd
当文件以管道形式或者标准输入时不打印文件名
cat /etc/passwd | wc -l
41
unusual redirection, but wc still ignores the filename
< /etc/passwd wc -l
41
typical redirection, taking standard input from a file
wc -l < /etc/passwd
41
由此可以看到,当文件被当成 wc 的参数传递过去的时候会打印出文件名,而其他标准输入时候不会打印出文件名。某些情况下,你可能希望打印文件名,因此有必要知道何时会打印文件名,而何时不会打印。
MultiTail是一个开源的ncurses的实用工具,可用于在一个窗口或单一外壳,显示实时一样的尾巴命令,该命令拆分控制台为更多子窗口的日志文件的最后几行(很像显示多个日志文件到标准输出屏幕命令 )。 它还支持颜色突出显示,过滤,添加和删除窗口等。
他和tail的区别就是他会在控制台中打开多个窗口,这样可以同时监控多个日志。
apt install multitail
如果要在 CentOS,基于 Red Hat 的发行版中使用,需要开启 EPEL repository,然后安装
yum install -y multitail
监控两个日志文件,窗口上下
multitail /var/log/syslog /var/log/auth.log
如果要让窗口左右排布
multitail -s 2 /var/log/syslog /var/log/auth.log
同理,-s num
来表示后接多少个文件
进入 multitail 之后,有一些交互式命令
h
来打开帮助b
来选择打开的文件,使用上下键选择文件,一旦选择文件 multitail 会显示文件最后 100 行,使用 jk 移动光标,或者 gg/G 来快速移动到文件顶部或者最后,q 退出a
用来添加另外的监控日志文件Cache
在实际场景中有着非常广泛的使用,通常情况下如果遇到需要大量时间计算或者获取值的场景,就应当将值保存到缓存中。Cache
和 ConcurrentMap
类似,但又不尽相同。最大的不同是 ConcurrentMap
会永久的存储所有的元素值直到他们被显示的移除,但是 Cache
会为了保持内存使用合理,而配置自动将一些值移除。
通常情况下,Guava caching 适用于以下场景:
先来看一下 Guava 中 Cache 接口的定义:
com.google.common.cache.Cache
com.google.common.cache.Cache#asMap
com.google.common.cache.Cache#cleanUp
com.google.common.cache.Cache#get
com.google.common.cache.Cache#getAllPresent
com.google.common.cache.Cache#getIfPresent
com.google.common.cache.Cache#invalidate
com.google.common.cache.Cache#invalidateAll()
com.google.common.cache.Cache#invalidateAll(java.lang.Iterable<?>)
com.google.common.cache.Cache#put
com.google.common.cache.Cache#putAll
com.google.common.cache.Cache#size
com.google.common.cache.Cache#stats
Cache 接口定义的方法大都一目了然,值得一说的就是 stats()
方法,这个方法会返回一个 CacheStats
对象,这个对象包括了该 Cache 的一些统计信息,包括 hitCount
, missCount
,loadSuccessCount
,loadExceptionCount
,totalLoadTime
和 evictionCount
。
Cache
通过 CacheBuilder
类的 Builder 模式获取,常见的用法:
LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
.maximumSize(1000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.removalListener(MY_LISTENER)
.build(
new CacheLoader<Key, Graph>() {
public Graph load(Key key) throws AnyException {
return createExpensiveGraph(key);
}
});
如果使用的场景中对应着 key 的值有默认的值,那么可以选择使用 CacheLoader
,如果没有默认值,那么仍然可以原子的 get-if-absent-compute
方法,在 get
方法中提供一个 Callable
,或者元素也可以通过 Cache.put
来直接插入到缓存中。
LoadingCache
是一个附加着 CacheLoader
的 Cache。LoadingCache<K,V>
在 Guava 中是一个 interface,通常是用来本地 Cache 缓存 k-v 数据,value 会一直保存在内存中直到被移除或者失效。实现这个接口的类期望是线程安全的,能够安全的在多线程程序中被访问。
当第一次调用 get()
方法时,如果 value 不存在则会触发 load()
方法,load 方法不能返回 null,否则会报错。
LoadingCache 是不支持缓存 null 值的,如果 load 回调方法返回 null,则在 get 的时候会抛出异常。
如果在 CacheLoader 中抛出异常,那么 Cache 会认为没有完成,所以新的值不会被 Cache。基于这一条规则,那么如何避免在 CacheLoader 中因为缓存 null 而抛出异常,那就是编程者自己处理 null 异常。
最正统的查询 LoadingCache
的方法是调用 get(k)
方法,这个方法如果查询到已经缓存的值会立即返回,否则使用缓存的 CacheLoader
自动加载一个新值到缓存并返回。因为 CacheLoader
可能会抛出异常,那么如果有异常,则LoadingCache.get(k)
会抛出 ExecutionException
异常。而如果 CacheLoader 抛出 unchecked 未检查的异常,则 get(k)
方法会抛出 UncheckedExecutionException
异常。
此时可以选择使用 getUnchecked(k)
方法,这个方法会将所有的异常包装在 UncheckedExecutionException 异常中。需要注意的是,如果 CacheLoader 声明了检查异常,也就是 CacheLoader 显式的定义了异常,就不能调用 getUnchecked(k)
方法
CacheBuilder 在构建 Cache 时提供了两种定时回收的方法
调用 LoadingCache 的 invalidate
方法可以使得 key 失效
Let’s Encrypt 是一个免费 SSL 证书发行项目,自动化发行证书,证书有 90 天的有效期。于是有了另外一个项目可以自动安装,自动续期。
直接上网站
选择 WEB 服务器版本,系统版本,然后执行脚本即可。
执行完成之后执行 certbot run
跟着步骤就行了。
在 crontab -e
编辑文件
0 0 1 * * /usr/bin/certbot renew --force-renewal
定时每天检查,如果要过期则自动延期。
使用 -d
来指定域名
certbot --nginx -d yourdomain.com
acme.sh 是使用 Shell 编写的 acme 客户端,用来申请 Let’s Encrypt 证书。
curl https://get.acme.sh | sh
certbot 做了什么
listen 443 ssl;
ssl_certificate /path/to/pem;
ssl_certificate_key /path/to/pem;
include /path/to/ssl.conf;
ssl_dhparam /path/to/pem; # 参数,加密强度
ssl_session_cache shared:le_nginx_SSL:1m;
ssl_session_timeout 1440m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphes "..." # 安全套件
tail 命令从指定点开始将文件写到标准输出。使用 tail 命令的 -f 选项可以方便的查阅正在改变的日志文件,tail -f filename 会把 filename 里最尾部的内容显示在屏幕上,并且不但刷新,使你看到最新的文件内容。
默认情况下 tail 会打印文件最后 10 行。
tail [OPTION] file
用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。
命令参数:
-f 循环读取,只要文件有修改会立即显示
-q 不显示处理信息
-v 显示详细的处理信息
-c NUM 显示的字节数
-n NUM 显示行数
--pid=PID 与 -f 合用,表示在进程 ID,PID 死掉之后结束。
-q, --quiet, --silent 从不输出给出文件名的首部
-s, --sleep-interval=S 与 -f 合用,表示在每次反复的间隔休眠 S 秒
命令:
tail -n 5 /var/log/syslog
说明:
显示文件最后 5 行内容,使用重定向可以将最后 10000 行重定向到其他文件,比如
tail -n 10000 /var/log/syslog > newfile.log
命令:
tail -f /var/log/syslog
命令:
tail -n +5 /var/log/syslog
tailf 是 tail -f
的快捷版本,man 手册中 tailf 已经被启用,可以使用一个 alias 来继续使用 tailf。
Linux 启动项管理
Debian/Ubuntu/Linux Mint 系利用 update-rc.d 来管理 Linux 自启动服务。RedHat/Fedora/CentOS 下貌似有一个 chkconfig 来管理。
而我使用的 Linux Mint 自带的启动服务管理配置地址在 ~/.config/autostart
目录下。
Linux 中的服务通常利用 /etc/init.d/
目录下的脚本进行启动,停止或者重新加载等操作。一般情况下如果安装完服务之后,该服务会自动启动。比如安装完 apache2 之后, apache 服务会在下次启动时自动启动。如果不需要 apache2 随机启动,可以你禁用自启动,然后在需要的时候手动的启动 apache 服务
# /etc/init.d/apache2 start
先看一下启动脚本的内容
# ls -l /etc/rc?.d/*apache2
lrwxrwxrwx 1 root root 17 Feb 5 21:47 /etc/rc0.d/K09apache2 -> ../init.d/apache2
lrwxrwxrwx 1 root root 17 Feb 5 21:47 /etc/rc1.d/K09apache2 -> ../init.d/apache2
lrwxrwxrwx 1 root root 17 Feb 5 21:47 /etc/rc2.d/K09apache2 -> ../init.d/apache2
lrwxrwxrwx 1 root root 17 Feb 5 21:47 /etc/rc3.d/K09apache2 -> ../init.d/apache2
lrwxrwxrwx 1 root root 17 Feb 5 21:47 /etc/rc4.d/K09apache2 -> ../init.d/apache2
lrwxrwxrwx 1 root root 17 Feb 5 21:47 /etc/rc5.d/K09apache2 -> ../init.d/apache2
lrwxrwxrwx 1 root root 17 Feb 5 21:47 /etc/rc6.d/S09apache2 -> ../init.d/apache2
运行级别(run level) 从 0,1到6,在每一个链接前有K和S区别,K 表示 Kill 停止一个服务,而 S 表示 Start 启动一个服务。
不同的运行级别定义如下:
# 0 - 停机
# 1 - 单用户模式
# 2 - 多用户,没有 NFS
# 3 - 完全多用户模式(标准的运行级)
# 4 – 系统保留的
# 5 - X11 (x window)
# 6 - 重新启动
Debian 系Linux下利用 rcconf 管理自启动脚本,rcconf的全称是 Debian Runlevel Configuration tool, 运行级别配置工具。作用和 update-rc.d 类似,但是更加直观简洁。他是一个 TUI(Text User Interface)。
sudo apt-get install rcconf
sudo rcconf
运行之后就会出现非常直观的配置界面,用方向键,空格,Tab就能够实现配置。如果熟悉命令依然可以通过 rcconf 命令来进行快速配置。
如果想要完全禁止 apache2 服务,需要删除 /etc/rcX.d/
目录下所有的链接,而使用 update-rc.d
# update-rc.d -f apache2 remove
添加自启动服务
# update-rc.d apache2 defaults
Adding system startup for /etc/init.d/apache2 ...
/etc/rc0.d/K20apache2 -> ../init.d/apache2
/etc/rc1.d/K20apache2 -> ../init.d/apache2
/etc/rc6.d/K20apache2 -> ../init.d/apache2
/etc/rc2.d/S20apache2 -> ../init.d/apache2
/etc/rc3.d/S20apache2 -> ../init.d/apache2
/etc/rc4.d/S20apache2 -> ../init.d/apache2
/etc/rc5.d/S20apache2 -> ../init.d/apache2
从上面的log中可以看到,默认的优先级是20(K和S后面数字)和 91 有很大区别。 S20 链接早于 S91 启动, K91 在 K20 之前停止。
如果想要 apache2 服务以 91 优先级启动或者停止,可以使用
# update-rc.d apache2 defaults 91
Adding system startup for /etc/init.d/apache2 ...
/etc/rc0.d/K91apache2 -> ../init.d/apache2
/etc/rc1.d/K91apache2 -> ../init.d/apache2
/etc/rc6.d/K91apache2 -> ../init.d/apache2
/etc/rc2.d/S91apache2 -> ../init.d/apache2
/etc/rc3.d/S91apache2 -> ../init.d/apache2
/etc/rc4.d/S91apache2 -> ../init.d/apache2
/etc/rc5.d/S91apache2 -> ../init.d/apache2
如果需要为启动和停止设置不同的优先级,则可以
# update-rc.d apache2 defaults 20 80
Adding system startup for /etc/init.d/apache2 ...
/etc/rc0.d/K80apache2 -> ../init.d/apache2
/etc/rc1.d/K80apache2 -> ../init.d/apache2
/etc/rc6.d/K80apache2 -> ../init.d/apache2
/etc/rc2.d/S20apache2 -> ../init.d/apache2
/etc/rc3.d/S20apache2 -> ../init.d/apache2
/etc/rc4.d/S20apache2 -> ../init.d/apache2
/etc/rc5.d/S20apache2 -> ../init.d/apache2
这样启动为20,停止为80. 而如果需要自定义不同的运行级别,则可以
# update-rc.d apache2 start 20 2 3 4 5 . stop 80 0 1 6 .
Adding system startup for /etc/init.d/apache2 ...
/etc/rc0.d/K80apache2 -> ../init.d/apache2
/etc/rc1.d/K80apache2 -> ../init.d/apache2
/etc/rc6.d/K80apache2 -> ../init.d/apache2
/etc/rc2.d/S20apache2 -> ../init.d/apache2
/etc/rc3.d/S20apache2 -> ../init.d/apache2
/etc/rc4.d/S20apache2 -> ../init.d/apache2
/etc/rc5.d/S20apache2 -> ../init.d/apache2
如此之后,在运行级别 2, 3, 4, 5 为S20 ,运行级别 0, 1, 6 则是 K80.
同样可以更加复杂
# update-rc.d apache2 start 20 2 3 4 . start 30 5 . stop 80 0 1 6 .
Adding system startup for /etc/init.d/apache2 ...
/etc/rc0.d/K80apache2 -> ../init.d/apache2
/etc/rc1.d/K80apache2 -> ../init.d/apache2
/etc/rc6.d/K80apache2 -> ../init.d/apache2
/etc/rc2.d/S20apache2 -> ../init.d/apache2
/etc/rc3.d/S20apache2 -> ../init.d/apache2
/etc/rc4.d/S20apache2 -> ../init.d/apache2
/etc/rc5.d/S30apache2 -> ../init.d/apache2
sudo chkconfig --add apache2
or
sudo chkconfig -- level 35 apache2 on
关于 chkconfig 更多的用法可以参考这里
在Linux下安装 Genymotion Android 模拟器。最近拾起 Android Development,Android 模拟器必不可少,用来用去 Genymotion 模拟器算是速度和效率最棒的模拟器了。
Genymotion 依赖 VirtualBox 运行,在安装之前确保已经安装 VirtualBox. 在Linux Mint下直接去 Software Manager 搜索 VirtualBox 然后点击安装即可。
Genymotion 安装需要一个 Genymotion 的个人账号,Genymotion 高级功能需要付费,所以去官网注册一个个人账号使用。 官网地址:https://www.genymotion.com
下载安装包,在注册账号登陆之后去首页按照自己的系统选择 32bit 或者 64bit 的安装包下载。目前最新的版本为 2.6.0.
假设安装包下载到 ~/Downloads
目录下,在终端:
# cd ~/Downloads/
# Move the downloaded file to ~/Android/ directory #
mv genymotion-2.6.0_x64.bin ~/Android/
# Set executable permission
chmod +x genymotion-2.6.0_x64.bin
# Install genymotion by running the file
./genymotion-2.6.0_x64.bin
# Navigate into genymotion directory
cd genymotion
# launch the genymotion #
./genymotion
运行 genymotion 之后,添加设备,此时需要登陆账号,有的时候会遇到 “unknown generic error” 错误,在我的观察下可能就是因为 genymotion 服务器挂了,等些时候再尝试即可。或者有的时候是因为代理的关系。
下载对应的镜像,然后就能够运行模拟器了。
为了方便使用可以将 Genymotion 的地址加入到 PATH 中,这样就能快速启动 Genymotion. 类似:
$ PATH=$PATH:/home/einverne/Android/genymotion/
在使用 Genymotion 的时候,有时会遇到 ”INSTALL_FAILED_NO_MATCHING_ABIS“ 错误。一些时候是因为 APP 和模拟器CPU架构的问题,但是在 Genymotion 这里需要额外安装一个文件。点击这里 去xda 下载 Genymotion-ARM-Translation_v1.1.zip 这个文件。并拖到模拟器中。这样就不会出现问题了。如果需要在模拟器中安装 GApps ,可以在上面的链接中找到对应的方法。
如果使用过程中出现 “An error occured while deploying the file. INSTALL_FAILED_CPU_ABI_INCOMPATIBLE” 这样的错误,利用上面的方法也能解决。造成这个错误的原因是因为 Genymotion 是一个基于 x86 的虚拟环境,不是一个 ARM 的模拟器。而 Genymotion 在更新过程中移除了 ARM Translation 和 Google Play Apps , 这样对开发者和使用者造成了一定的困扰,不过还好依然可以通过其他方法解决。
这两天大概看了一下Python的web框架—-Django,顺带复习一下Python。从刚开始的一无所知,到现在对Django中MVC的一些了解,感觉收获颇丰,还顺带回想起来以前学习过程中的一些MVC的知识,虽然Django不是完全按照MVC的命名模式 Model,View,Controller,但是它依然遵循类似的开发模式,Django自己说自己是 MTV 模式, Model,Template,View。
在看 Django 之前也了解了一些 Python 的Web框架,在之前的写字应用中用 webpy 作了一个简单的接口,webpy 实现很简单,用它当然也能做一些大项目,但是可能需要自己Custom的东西比较多。而Django可以快速上手。
安装非常简单,先安装 virtualenv
$ pip install virtualenv
$ cd my_project_folder
$ virtualenv . # create virtual env in current folder
$ source bin/activate
再安装 Django , 创建工程,然后就可以开工了。
$ pip install django # install latest version
# pip install django==1.9 或者指定某一版本
# pip install django --upgrade
$ django-admin startproject projectname
几个很常用的命令,在 manage.py
目录下:
$ python manage.py help
$ python manage.py runserver [port]
$ python manage.py makemigrations # 每一次修改 model 之后需要运行,之后需要运行 migrate
$ python manage.py migrate # 已经代替了 python manage.py syncdb 数据库相关,创建表
$ python manage.py createsuperuser
$ python manage.py startapp appname
几个文件解释:
models.py 和数据库表相关
model 中需要用到的 Field ,关键字:[Model field reference]
views.py 显示相关
处理HttpRequest请求,通过模板生成HTML网页返回
urls.py 匹配URL模式
通过正则匹配请求URL,将对应URL导向相应的view。Django 1.9 中可以引用三种对应的URL匹配模式,Function views
,Class-based views
和 Including another URLconf
方式来定义URL。
settings.py 项目设置
项目地址,安装应用,数据库,静态文件地址,等等都在此文件中配置。
我觉得最好的教程就是官方的Getting started with Django,但是唯一的坏处就是不够视频直观,这个时候上 Google 搜Django tutorial 能够找到很多视频教程,先行入门之后,再去回头看官方的教程或者文档,会很轻松的加快学习进度。
个人觉得几个很重要的文档,在新建 model 的时候, Django 自带了一些 Field, 这些变量的定义直接影响到数据库中保存的数据,在我刚开始学习的时候经常查看Model field reference. 在定义完 model 之后需要执行 python manage.py makemigrations
和 python manage.py migrate
来同步自定义的 model 和 数据库中内容。
在 view 中需要 render 模板的时候,常用的方式就是在 工程下app 的同级目录增加 templates 目录,将html模板放到该目录下。并且需要在 settings.py 文件中 TEMPLATES 设置中增加
'DIRS': [os.path.join(BASE_DIR, "templates")],
. 可以参考 官方文档 .
而接下来是网页的表单,可以自定义表单,也可以通过 Model 直接生成对应的表单,官方都有详细的介绍。
至此生成一个自己的简单页面应该没有任何问题了。下面就是学习一些深入的内容,在之前的视频中有用到 django-registration-redux
一个第三方的注册登陆的实现。能够快速实现一个网站的注册邮箱验证以及登录验证。然后因为 Django 生成的网页表单太丑,所以还用了 django-crispy-forms
这样一个第三方生成表单的应用。快速生成带CSS样式的表单。具体的使用看文档都能够快速使用。
到此,可以看一些教程实现一些自定义的表单 validation,可以看一下第三方应用的实现来充实一下自己的 django 知识,甚至可以实现一个具体的应用来锻炼一下。
less 命令可以对文件或其它输出进行分页显示,应该说是 linux 正统查看文件内容的工具,功能强大。less 的用法比起 more 更有弹性。在 more 的时候,我们并没有办法向前面翻,只能往后面看,但若使用了 less 时,就可以使用 [pageup] [pagedown] 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容。除此之外,在 less 里拥有更强大的搜索功能,不止可以向下搜,也可以向上搜。
less [options] 文件
less 与 more 类似,more 仅能向前移动,却不能向后移动,而且 less 在查看之前不会加载整个文件
命令参数:
-b 缓冲区大小 设置缓冲区的大小
-e 当文件显示结束后,自动离开
-f 强迫打开特殊文件,例如外围设备代号、目录和二进制文件
-g 只标志最后搜索的关键词
-i 忽略搜索时的大小写
-m 显示类似 more 命令的百分比
-N 在 less 中显示每行的行号
-o 文件名 将 less 输出的内容在指定文件中保存起来
-Q 不使用警告音
-s 显示连续空行为一行
-S 行过长时间将超出部分舍弃
-x 数字 将“tab”键显示为规定的数字空格
交互命令, less 中的交互命令可以在 less 中直接按下按键来使用:
h H 显示帮助界面
q :q Q :Q ZZ 退出 less 命令
移动,全屏导航
F like tail -f 滚动到文件末尾并持续监听文件写入
jk 下 / 上 一行,因为个人习惯了 vim 的 keymap 所以使用 jk,但 less 的移动键有很多个,可以 help 来查看
G 移动到最后一行
g 移动到第一行
f 向下移动一屏
b 向上移动一屏
d 向下移动半屏
u 向上移动半屏
y 向前滚动一行
空格键 滚动一页
回车键 滚动一行
[pagedown] 向下翻动一页
[pageup] 向上翻动一页
less 命令和 Vim 类似,也可以使用比如 10k,表示向上移动 10 行。
less 内搜索
/ 字符串:向下搜索“字符串”的功能
? 字符串:向上搜索“字符串”的功能
n 重复前一个搜索(与 / 或 ? 有关)
N 反向重复前一个搜索(与 / 或 ? 有关)
&pattern 只显示匹配的行
快速跳转
g < ESC-< 跳转到第一行
G > ESC-> 跳转到最后行
'' 跳转到上一个位置
其它交互命令
:e 检视其他文件
v 使用配置的编辑器 ($VISUAL or $EDITOR) 编辑当前文件
V 打印 less 版本
!command 执行 $SHELL 命令
h 显示 less 的帮助文档
&pattern 仅显示匹配模式的行,而不是整个文件
标记导航
当使用 less 查看大文件时,可以在任何一个位置作标记,可以通过命令导航到标有特定标记的文本位置:
ma 使用 a 标记文本的当前位置
'a 导航到标记 a 处
看到这些交互命令其实应该一点都不陌生,如果使用 Vim 的话,基本都是 Vim 中用到的。
命令:
less +F /var/log/syslog
将其他命令的输出结果分页查看,尤其是当其他命令的输出结果多于一页时。
ps -ef |less
举一反三
apt search nemo | less
查看命令历史使用记录并通过 less 分页显示
history | less
同时查看多个文件:
less /var/log/syslog /var/log/mysql/error.log
此时 less 只会显示一个 syslog,此时
:n
后,切换到 mysql/error.log:p
后,切换到 syslogFFplay 是一个使用 FFmpeg 和 SDL 库制作的简易轻便的媒体播放器,他可以用来测试 FFmpeg APIs。
使用方式很简答
ffplay [options] input_file
播放 demo.mp4 ,播放完成后自动退出
ffplay -autoexit demo.mp4
以特定大小播放 demo.mp4
ffplay -x 640 -y 480 demo.mp4
从指定时间开始播放
ffplay -ss 10 demo.mp4
指定播放时长
ffplay -t 10 demo.mp4
关闭音频
ffplay -an demo.mp4
关闭视频
ffplay -vn demo.mp4
将窗口标题设置为 “myplayer”,循环播放 2 次
ffplay -window_title myplayer -loop 2 demo.mp4
设置显示模式
ffplay -showmode rdft demo.mp4
参数 -showmode
后面接的mode值可以为
默认值 video, 在播放时,可以通过 w
快捷键在几种模式中切换
ffplay 相比于本地播放器,他也能够播放网络视频,如果能够拿到视频的网络播放地址,不管是直链,还是 m3u8,也能够直接加在 ffplay 后面播放,顺便也可以直接查看视频流的信息。
本地做一个测试,开启一个终端播放 ffplay
ffplay udp://127.0.0.1:8080
然后使用 ffmpeg 生成流媒体
ffmpeg -r 25 -i demo.mp4 -f mpegts udp://127.0.0.1:8080
这里的参数
-r 25
表示每秒25帧-f
输出视频流q, ESC 退出
f 全屏
p, SPC 暂停
w 切换显示模式(视频/音频波形/音频频带)
s 步进到下一帧
left/right 快退/快进 10 秒
down/up 快退/快进 1 分钟
page down/page up 跳转到前一章/下一章(如果没有章节,快退/快进 10 分钟)
mouse click 跳转到鼠标点击的位置(根据鼠标在显示窗口点击的位置计算百分比)