FFmpeg支持的外部库相对来说比较多,当前互联网

2019-08-10 作者:小鱼儿主页高手论坛   |   浏览(136)

之前我们给大家介绍了正则表达式中的定界符、原子和元字符,那么我们关于正则表达式教程的基本语法就剩下了正则表达式中的模式修正符。本节会向大家介绍模式修正符的概念、模式修正符的构成,以及结合实例的模式修正符的演示,大家在学习完本节内容之后,就完全可以读懂正则表达式了。

图片上传插件ImgUploadJS:用HTML5 File API 实现截图粘贴上传、拖拽上传,

一 . 背景及效果

当前互联网上传文件最多的就是图片文件了,但是传统web图片的截图上传需要:截图保存->选择路径->保存后再点击上传->选择路径->上传->插入。
图片文件上传也需要:选择路径再->上传->插入,步骤繁杂,互联网体验为王,如果支持截图粘贴上传、拖拽上传将大大提升体验。
当前知乎和github对现代浏览器均支持这两种特性,闲来无事就学习实现了一下,今天就说一说这个1kb插件实现什么功能,怎么使用和原理。
首先看一下插效果:
截图后直接粘贴上传。

图片 1

拖拽上传

图片 2

http网络

图片 3

二.使用示例
直接调用:
XML/HTML Code复制内容到剪贴板

  1. <div id="box" style="width: 800px; height: 400px; border: 1px solid;" contenteditable="true"></div>    
  2. <script type="text/javascript" src="UploadImage.js"></script>    
  3. new UploadImage("box", "UploadHandler.ashx").upload(function (xhr) {//上传完成后的回调    
  4. var img = new Image();    
  5. img.src = xhr.responseText;    
  6. this.appendChild(img);    
  7. }); 

AMD/CMD

XML/HTML Code复制内容到剪贴板

  1. <div id="box" style="width: 800px; height: 400px; border: 1px solid;" contenteditable="true"></div>    
  2. <script type="text/javascript" src="require.js"></script>    
  3. <script>    
  4. require(['UploadImage'], function (UploadImage) {    
  5. new UploadImage("box", "UploadHandler.ashx").upload(function (xhr) {//上传完成后的回调    
  6. var img = new Image();    
  7. img.src = xhr.responseText;    
  8. this.appendChild(img);    
  9. });    
  10. })    
  11. </script>   

三.浏览器支持
当前版本只支持以下,浏览器,后期可能会支持更多浏览器。
•IE11
•Chrome
•FireFox
•Safari(未测式,理论应该支持)
四.原理及源码
1.粘贴上传 处理目标容器(id)的paste事件,读取e.clipboardData中的数据,如果是图片进行以下处理:
用H5 File API(FileReader)获取文件的base64代码,并构建FormData异步上传。
2.拖拽上传
处理目标容器(id)的drop事件,读取e.dataTransfer.files(H5 File API: FileList)中的数据,如果是图片并构建FormData异步上传。
以下是初版本代码,比较简单。不再赘述。
部份核心代码

XML/HTML Code复制内容到剪贴板

  1. function UploadImage(id, url, key)    
  2. {    
  3. this.element = document.getElementById(id);    
  4. this.url = url; //后端处理图片的路径    
  5. this.imgKey = key || "PasteAreaImgKey"; //提到到后端的name    
  6. }    
  7. UploadImage.prototype.paste = function (callback, formData)    
  8. {    
  9. var thatthat = this;    
  10. this.element.addEventListener('paste', function (e) {//处理目标容器(id)的paste事件    
  11. if (e.clipboardData && e.clipboardData.items[0].type.indexOf('image') > -1) {    
  12. var that = this,    
  13. reader = new FileReader();    
  14. file = e.clipboardData.items[0].getAsFile();//读取e.clipboardData中的数据:Blob对象    
  15. reader.onload = function (e) { //reader读取完成后,xhr上传    
  16. var xhr = new XMLHttpRequest(),    
  17. fd = formData || (new FormData());;    
  18. xhr.open('POST', thatthat.url, true);    
  19. xhr.onload = function () {    
  20. callback.call(that, xhr);    
  21. }    
  22. fd.append(thatthat.imgKey, this.result); // this.result得到图片的base64    
  23. xhr.send(fd);    
  24. }    
  25. reader.readAsDataURL(file);//获取base64编码    
  26. }    
  27. }, false);    
  28. }  

File API 实现截图粘贴上传、拖拽上传, 一 . 背景及效果 当前互联网上传文件最多的就是图片文件了,但是传...

FFmpeg使用手册 - FFmpeg 编码支持与定制

3.1 FFmpeg本身支持一些编码、封装与协议,但是支持的依然有限,有些是因为licence,有些是因为相对来说比较大,FFmpeg所做的是提供一套基础的框架,而这些编码、封装与协议可以作为一个FFmpeg的模块挂在FFmpeg中,这些模块以第三方的外部库的方式提供支持,可以通过FFmpeg的源码的configure进行查看FFmpeg默认支持的编码、封装与协议的支持,不支持的可以再configure –help的时候查看所支持的第三方外部库,可以通过对应的参数选项进行支持:
图片 4
图片 5
通过上图可以看到,FFmpeg支持的外部库相对来说比较多,主要包含如下列表:
bzip2 1.0.6
Fontconfig 2.11.94
Frei0r 20130909-git-10d8360
GnuTLS 3.3.15
libiconv 1.14
libass 0.12.2
libbluray 0.8.1
libbs2b 3.1.0
libcaca 0.99.beta18
dcadec 20150506-git-98fb3b6
FreeType 2.5.5
Game Music Emu 0.6.0
GSM 1.0.13-4
iLBC 20141214-git-ef04ebe
Modplug-XMMS 0.8.8.5
LAME 3.99.5
OpenCORE AMR 0.1.3
OpenJPEG 1.5.2
Opus 1.1
RTMPDump 20140707-git-a1900c3
Schroedinger 1.0.11
libsoxr 0.1.1
Speex 1.2rc2
Theora 1.1.1
TwoLAME 0.3.13
vid.stab 0.98
VisualOn AAC 0.1.3
VisualOn AMR-WB 0.1.2
Vorbis 1.3.5
vpx 1.4.0
WavPack 4.75.0
WebP 0.4.3
x264 20150223-git-121396c
x265 1.7
XAVS svn-r55
Xvid 1.3.3
XZ Utils 5.2.1
zlib 1.2.8
这些外部库可以通过configure进行定制,命令行如下:
图片 6
如果不需要这么多配置选项,只是想支持H264视频与AAC音频编码,可以讲配置项简化为如下:
图片 7
如图所示,如果要支持H264与AAC,需要系统中包括libx264与libfaac的第三方库进行支持,否则会出现错误提示:
图片 8
未找到libfaac错误提示
图片 9
未找到libx264错误提示
如果需要支持H265编码,可以与支持h265基本类似,从前面的help信息中可以看到,只需要增加—enable-libx265即可支持h265编码,其他对应的编码类似。
FFmpeg默认支持的编码、封装与协议相对比较多,所以编译出来的FFmpeg体积比较大,在有些应用场景中并不需要FFmpeg所支持的一些编码、封装或者协议,可以通过configure --help查看到一些有用的裁剪操作:
图片 10
可以通过这些选项关闭掉不需要用到的编码、封装与协议等模块,验证方法如下:
图片 11
disable掉所有的模块后,可以看到ffmpeg的编译配置项输出信息几乎为空:
图片 12
Disable所有的模块之后,可以根据定制,支持上自己所需要的模块,例如希望支持h264视频编码、aac音频编码、封装为mp4,则可以通过如下方式进行支持:
图片 13
配置后输出的编译配置信息如下:
图片 14
支持h264、aac编码与mp4封装的FFmpeg编译配置参数
从图中可以看到,FFmpeg已经支持了h264编码、aac编码与mp4封装格式的支持。这样通过编译后生成的ffmpeg即是配置裁剪过的ffmpeg,体积会比默认编译的ffmpeg小很多。
3.2 FFmpeg 的编码器支持
FFmpeg源代码中可以包含的编码非常多,常见的,不常见的都可以在编译配置列表中见到,可以通过使用编译配置命令configure --list-encoders参数来查看:
图片 15
从图中可以看出,ffmpeg支持的encoder比较全面,比如aac、ac3、h264、h265、mpeg4、mpeg2video、pcm、flv的编码器支持。
3.3 FFmpeg 的解码器支持
FFmpeg源代码中本身包含了很多的解码支持,解码主要为输入的时候进行的解码,也可以理解为将压缩过的编码进行解压缩,关于解码的支持,可以通过./configure –list-decoders命令来进行查看:
图片 16
从图中可以看到ffmpeg所支持的解码器模块decoders,支持了mpeg4、h264、h265(HEVC)、mp3等。
3.4 FFmpeg 的复用(Muxing)支持
FFmpeg的复用为将压缩后的编码封装到一个容器格式中(又叫Muxing),如果要查看FFmpeg源代码中都可以支持哪些容器格式,可以用过命令./configure --list-muxers查看:
图片 17
从图中可以看到,ffmpeg支持生成裸流文件,例如h264、aac、pcm,也支持一些常见的格式,例如mp3、mp4、flv、hls、webm等。

3.5FFmpeg的解复用(Demuxing)支持
FFmpeg的解复用为将读入的容器格式拆解开,将里面的压缩的音频流、视频流、字幕流、数据流等等提取出来(又叫Demuxing),如果要查看FFmpeg的源代码中都可以支持哪些输入的容器格式,可以通过命令./configure --list-demuxers 查看:
图片 18
从图中可以看到,ffmpeg源码中已经支持的demuxer非常多,包含图片(image)、mp3、flv、MP4、mov、avi等。

3.6FFmpeg 的通信协议支持
FFmpeg不仅仅支持本地的多媒体处理,而且还支持网络流媒体的处理,支持的网络流媒体协议相对来说也很全面,可以通过命令 ./configure --list-protocols 进行查看:
图片 19
从图中可以看到,ffmpeg支持的流媒体协议比较多,包括mms、http、hls(M3U8)、rtmp、rtp、甚至支持tcp、udp,也支持本地文件file协议,和多个文件拼接串流的支持concat,在后面的章节中会有详细介绍。

- FFmpeg 编码支持与定制 3.1 FFmpeg本身支持一些编码、封装与协议,但是支持的依然有限,有些是因为licence,有些是因为相对来...

在CentOS 7 上安装Zookeeper集群

测试机上需要安装java软件
$ rpm -qa|grep java
$ sudo yum install -y java-1.8.0-openjdk.x86_64
$ java -version
openjdk version "1.8.0_65"
OpenJDK Runtime Environment (build 1.8.0_65-b17)
OpenJDK 64-Bit Server VM (build 25.65-b01, mixed mode)

1、创建用户:bjrenrui0001~0003
sudo groupadd zookeeper
sudo useradd -g zookeeper zookeeper
echo "[email protected]"|sudo passwd zookeeper —stdin

2、创建工作目录
bjrenrui0001:
sudo mkdir /yanfa/mq
sudo ln -s /yanfa/mq /mq
sudo chown -R dreamjobs.dreamjobs /mq

bjrenrui0002~0003:
sudo mkdir mq
sudo chown dreamjobs.dreamjobs mq
sudo ln -s /home/backupfile/mq /mq
sudo chown dreamjobs.dreamjobs mq

  1. 单机模式(Standalone mode)
    下载,解压
    cd /mq
    wget
    tar zxvf zookeeper-3.4.7.tar.gz -C /mq
    ln -s /mq/zookeeper-3.4.7 zookeeper

启动
默认就是单机模式
cd /mq/zookeeper/
cp ./conf/zoo_sample.cfg ./conf/zoo.cfg
sh ./bin/zkServer.sh start

防火墙开启2181端口

检查服务状态:
[[email protected] bin]$ sh zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /mq/zookeeper/bin/../conf/zoo.cfg
Mode: standalone

使用java 客户端连接ZooKeeper
./bin/zkCli.sh -server 127.0.0.1:2181
然后就可以使用各种命令了,跟文件操作命令很类似,输入help可以看到所有命令。

关闭
sh bin/zkServer.sh stop

2 分布式模式(Replicated mode)
在生产环境中,要配置成分布式模式,才能发挥威力。
ZooKeeper集群一般被称为ZooKeeper ensemble(集成),或者 quorum(法定人数).

准备3台机器

假设有三台机器,hostname和ip对应关系是:
192.168.100.200 bjrenrui0001
192.168.100.201 bjrenrui0002
192.168.100.202 bjrenrui0003

ZooKeeper不存在明显的master/slave关系,各个节点都是服务器,leader挂了,会立马从follower中选举一个出来作为leader.
由于没有主从关系,也不用配置SSH无密码登录了,各个zk服务器是自己启动的,互相之间通过TCP端口来交换数据。

创建日志和数据目录:
bjrenrui0001~0003
cd /mq/zookeeper
mkdir -p zookeeperdatadir/{logs,data}

修改bjrenrui0001的配置文件conf/zoo.cfg:
[[email protected] conf]$ grep -vE '^($|#)' zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/mq/zookeeper/zookeeperdatadir/data
dataLogDir=/mq/zookeeper/zookeeperdatadir/logs
clientPort=2181
server.1=bjrenrui0001:2888:3888
server.2=bjrenrui0002:2888:3888
server.3=bjrenrui0003:2888:3888
修改完后拷贝到 bjrenrui0002,以及 bjrenrui0003上

myid文件:
要在每台机器的dataDir下,新建一个myid文件,里面存放一个数字,用来标识当前主机
bjrenrui0001: echo "1" >> /mq/zookeeper/zookeeperdatadir/data/myid
bjrenrui0002: echo "2" >> /mq/zookeeper/zookeeperdatadir/data/myid
bjrenrui0003: echo "3" >> /mq/zookeeper/zookeeperdatadir/data/myid

每台机器上启动zookeeper服务:
bjrenrui0001: sh /mq/zookeeper/bin/zkServer.sh start
bjrenrui0002: sh /mq/zookeeper/bin/zkServer.sh start
bjrenrui0003: sh /mq/zookeeper/bin/zkServer.sh start
每台机器上停止zookeeper服务:
bjrenrui0001: sh /mq/zookeeper/bin/zkServer.sh stop
bjrenrui0002: sh /mq/zookeeper/bin/zkServer.sh stop
bjrenrui0003: sh /mq/zookeeper/bin/zkServer.sh stop
因为3个节点的启动是有顺序的,所以在陆续启动三个节点的时候,前面先启动的节点连接未启动的节点的时候会报出一些错误,可以忽略。

防火墙开启2181端口:
sudo vi /etc/sysconfig/iptables
-A INPUT -p tcp -s 192.168.100.0/24 -j ACCEPT
sudo systemctl restart iptables.service

查看状态
[[email protected] conf]$ gmbjyf.sh bjyfnbserver "cat /mq/zookeeper/zookeeperdatadir/data/myid"
bjrenrui0001
1
bjrenrui0002
2
bjrenrui0003
3
$ gmbjyf.sh bjyfnbserver "sh /mq/zookeeper/bin/zkServer.sh restart"
bjrenrui0001
ZooKeeper JMX enabled by default
Using config: /mq/zookeeper/bin/../conf/zoo.cfg
ZooKeeper JMX enabled by default
Using config: /mq/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
ZooKeeper JMX enabled by default
Using config: /mq/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
bjrenrui0002
ZooKeeper JMX enabled by default
Using config: /mq/zookeeper/bin/../conf/zoo.cfg
ZooKeeper JMX enabled by default
Using config: /mq/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
ZooKeeper JMX enabled by default
Using config: /mq/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
bjrenrui0003
ZooKeeper JMX enabled by default
Using config: /mq/zookeeper/bin/../conf/zoo.cfg
ZooKeeper JMX enabled by default
Using config: /mq/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
ZooKeeper JMX enabled by default
Using config: /mq/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper … STARTED

$ gmbjyf.sh bjyfnbserver "sh /mq/zookeeper/bin/zkServer.sh status"
bjrenrui0001
ZooKeeper JMX enabled by default
Using config: /mq/zookeeper/bin/../conf/zoo.cfg
Mode: follower
bjrenrui0002
ZooKeeper JMX enabled by default
Using config: /mq/zookeeper/bin/../conf/zoo.cfg
Mode: leader
bjrenrui0003
ZooKeeper JMX enabled by default
Using config: /mq/zookeeper/bin/../conf/zoo.cfg
Mode: follower

使用java客户端连接ZooKeeper集群
找一台机器,解压zookeeper压缩包,不用配置,就可以使用java客户端连接ZooKeeper集群中的任意一台服务器了。
$ sh /mq/zookeeper/bin/zkCli.sh -server bjrenrui0001:2181
$ sh /mq/zookeeper/bin/zkCli.sh -server bjrenrui0002:2181
$ sh /mq/zookeeper/bin/zkCli.sh -server bjrenrui0003:2181

7 上安装Zookeeper集群 测试机上需要安装java软件 $ rpm -qa|grep java $ sudo yum install -y java-1.8.0-openjdk.x86_64 $ java -version openjdk version "1.8.0_6...

**什么是模式修正符?

**1, 模式修正符就是几个字母,我们在每个正则表达式中可以一次使用一个,也可以连续使用多个,每一个具一定的意义。
2, 模式修正符是对整个正则表达式调优使用,也可以说是对正则表达式功能的扩展。
还记得正则表达式的那个公式吗?'/原子和元字符/模式修正符',其中正斜线为边界符。

模式修正符的构成
模式修正符就是字母,只不过这些在模式修正符的应用之中有特殊的含义。下面我来看看都有哪些模式修正符,请看下表:

模式修正符 说明
i 表示在和模式进行匹配进不区分大小写
m 将模式视为多行,使用^和$表示任何一行都可以以正则表达式开始或结束
s 如果没有使用这个模式修正符号,元字符中的"."默认不能表示换行符号,将字符串视为单行
x 表示模式中的空白忽略不计
e 正则表达式必须使用在preg_replace替换字符串的函数中时才可以使用(讲这个函数时再说)
A 以模式字符串开头,相当于元字符^
Z 以模式字符串结尾,相当于元字符$
U 正则表达式的特点:就是比较“贪婪”,使用该模式修正符可以取消贪婪模式

由于i表示匹配不区分大小写,在下面的示例中,我们不再进行演示,我们来看一下其他模式修正符的示例。

1,模式修正符m。

复制代码 代码如下:

本文由小鱼儿玄机30码发布于小鱼儿主页高手论坛,转载请注明出处:FFmpeg支持的外部库相对来说比较多,当前互联网

关键词: 小鱼儿玄机30码