├── .classpath
├── .project
├── .tern-project
├── LICENSE
├── README.md
├── WebRoot
├── META-INF
│ └── MANIFEST.MF
├── WEB-INF
│ ├── classes
│ │ ├── cc
│ │ │ └── eguid
│ │ │ │ └── livepush
│ │ │ │ ├── PushManager.class
│ │ │ │ ├── PushManagerImpl.class
│ │ │ │ ├── Readme
│ │ │ │ ├── conf
│ │ │ │ └── ConfUtil.class
│ │ │ │ ├── dao
│ │ │ │ ├── HandlerDao.class
│ │ │ │ └── HandlerDaoImpl.class
│ │ │ │ ├── ffmpeg
│ │ │ │ ├── avcodec-57.dll
│ │ │ │ ├── avdevice-57.dll
│ │ │ │ ├── avfilter-6.dll
│ │ │ │ ├── avformat-57.dll
│ │ │ │ ├── avutil-55.dll
│ │ │ │ ├── ffmpeg.exe
│ │ │ │ ├── ffplay.exe
│ │ │ │ ├── ffprobe.exe
│ │ │ │ ├── postproc-54.dll
│ │ │ │ ├── swresample-2.dll
│ │ │ │ └── swscale-4.dll
│ │ │ │ └── handler
│ │ │ │ ├── OutHandler.class
│ │ │ │ ├── PushHandler.class
│ │ │ │ └── PushHandlerImpl.class
│ │ └── cn
│ │ │ └── njlingdong
│ │ │ └── cameraLive
│ │ │ ├── controller
│ │ │ └── CameraLiveController.class
│ │ │ ├── entity
│ │ │ ├── LiveInfoEntity.class
│ │ │ └── ResultData.class
│ │ │ ├── service
│ │ │ ├── CameraLiveService.class
│ │ │ └── CameraLiveServiceImpl.class
│ │ │ └── util
│ │ │ └── ResultDataUtil.class
│ ├── lib
│ │ ├── aopalliance-1.0.jar
│ │ ├── aspectjrt-1.8.6.jar
│ │ ├── aspectjweaver.jar
│ │ ├── commons-codec-1.9.jar
│ │ ├── commons-collections-3.1.jar
│ │ ├── commons-dbcp-1.2.2.jar
│ │ ├── commons-fileupload-1.3.1.jar
│ │ ├── commons-io-2.4.jar
│ │ ├── commons-lang-2.3.jar
│ │ ├── commons-logging.jar
│ │ ├── commons-pool.jar
│ │ ├── commons-pool2-2.4.1.jar
│ │ ├── ezmorph-1.0.4.jar
│ │ ├── jackson-annotations-2.4.1.jar
│ │ ├── jackson-core-2.4.1.jar
│ │ ├── jackson-databind-2.4.1.jar
│ │ ├── spring-aop-4.1.6.RELEASE.jar
│ │ ├── spring-aspects-4.1.6.RELEASE.jar
│ │ ├── spring-beans-4.1.6.RELEASE.jar
│ │ ├── spring-context-4.1.6.RELEASE.jar
│ │ ├── spring-context-support-4.1.6.RELEASE.jar
│ │ ├── spring-core-4.1.6.RELEASE.jar
│ │ ├── spring-dao-2.0.8.jar
│ │ ├── spring-expression-4.1.6.RELEASE.jar
│ │ ├── spring-jdbc-4.1.6.RELEASE.jar
│ │ ├── spring-security-core-4.0.3.RELEASE.jar
│ │ ├── spring-security-crypto-3.2.3.RELEASE.jar
│ │ ├── spring-security-web-4.0.3.RELEASE.jar
│ │ ├── spring-tx-4.1.6.RELEASE.jar
│ │ ├── spring-web-4.1.6.RELEASE.jar
│ │ └── spring-webmvc-4.1.6.RELEASE.jar
│ ├── springMVC.xml
│ └── web.xml
├── ckplayer.html
├── ckplayer
│ ├── ckplayer
│ │ ├── ckplayer.js
│ │ ├── ckplayer.swf
│ │ ├── ckplayer.xml
│ │ ├── language.xml
│ │ └── style.swf
│ ├── crossdomain.xml
│ └── js
│ │ └── offlights.js
├── css
│ └── index.css
├── editplayer.html
├── img
│ └── eguidlogo.png
├── index.html
├── js
│ ├── jquery.min.js
│ ├── liveService.js
│ ├── play.js
│ └── videojsAPI.js
├── play.html
└── player
│ ├── alt
│ ├── video-js-cdn.css
│ ├── video-js-cdn.min.css
│ ├── video.novtt.js
│ ├── video.novtt.min.js
│ └── video.novtt.min.js.map
│ ├── font
│ ├── VideoJS.eot
│ ├── VideoJS.svg
│ ├── VideoJS.ttf
│ └── VideoJS.woff
│ ├── ie8
│ ├── videojs-ie8.js
│ └── videojs-ie8.min.js
│ ├── lang
│ ├── ar.js
│ ├── ba.js
│ ├── bg.js
│ ├── ca.js
│ ├── cs.js
│ ├── da.js
│ ├── de.js
│ ├── el.js
│ ├── en.js
│ ├── es.js
│ ├── fa.js
│ ├── fi.js
│ ├── fr.js
│ ├── hr.js
│ ├── hu.js
│ ├── it.js
│ ├── ja.js
│ ├── ko.js
│ ├── nb.js
│ ├── nl.js
│ ├── nn.js
│ ├── pl.js
│ ├── pt-BR.js
│ ├── ru.js
│ ├── sr.js
│ ├── sv.js
│ ├── tr.js
│ ├── uk.js
│ ├── vi.js
│ ├── zh-CN.js
│ └── zh-TW.js
│ ├── video-js.css
│ ├── video-js.min.css
│ ├── video-js.swf
│ ├── video.js
│ ├── video.js.map
│ ├── video.min.js
│ ├── video.min.js.map
│ └── videojs-ie8.min.js
└── classes
├── cc
└── eguid
│ └── livepush
│ ├── PushManager.java
│ ├── PushManagerImpl.java
│ ├── Readme
│ ├── conf
│ └── ConfUtil.java
│ ├── dao
│ ├── HandlerDao.java
│ └── HandlerDaoImpl.java
│ ├── ffmpeg
│ ├── avcodec-57.dll
│ ├── avdevice-57.dll
│ ├── avfilter-6.dll
│ ├── avformat-57.dll
│ ├── avutil-55.dll
│ ├── ffmpeg.exe
│ ├── ffplay.exe
│ ├── ffprobe.exe
│ ├── postproc-54.dll
│ ├── swresample-2.dll
│ └── swscale-4.dll
│ └── handler
│ ├── OutHandler.java
│ ├── PushHandler.java
│ └── PushHandlerImpl.java
└── cn
└── njlingdong
└── cameraLive
├── controller
└── CameraLiveController.java
├── entity
├── LiveInfoEntity.java
└── ResultData.java
├── service
├── CameraLiveService.java
└── CameraLiveServiceImpl.java
└── util
└── ResultDataUtil.java
/.classpath:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | liveClient
4 |
5 |
6 |
7 |
8 |
9 | org.eclipse.wst.jsdt.core.javascriptValidator
10 |
11 |
12 |
13 |
14 | org.eclipse.jdt.core.javabuilder
15 |
16 |
17 |
18 |
19 | org.eclipse.wst.common.project.facet.core.builder
20 |
21 |
22 |
23 |
24 | org.eclipse.wst.validation.validationbuilder
25 |
26 |
27 |
28 |
29 | com.genuitec.eclipse.j2eedt.core.DeploymentDescriptorValidator
30 |
31 |
32 |
33 |
34 |
35 | org.eclipse.jem.workbench.JavaEMFNature
36 | org.eclipse.wst.common.modulecore.ModuleCoreNature
37 | org.eclipse.wst.common.project.facet.core.nature
38 | org.eclipse.jdt.core.javanature
39 | org.eclipse.wst.jsdt.core.jsNature
40 |
41 |
42 |
--------------------------------------------------------------------------------
/.tern-project:
--------------------------------------------------------------------------------
1 | {"ide":{},"libs":["ecma5","browser"],"plugins":{"guess-types":{}}}
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "{}"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright {yyyy} {name of copyright owner}
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # livePush_Demo
2 | livePush推流器的使用web demo:采用REST请求来发布和停止推流,并使用播放器进行实时预览
3 |
--------------------------------------------------------------------------------
/WebRoot/META-INF/MANIFEST.MF:
--------------------------------------------------------------------------------
1 | Manifest-Version: 1.0
2 | Class-Path:
3 |
4 |
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/classes/cc/eguid/livepush/PushManager.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/classes/cc/eguid/livepush/PushManager.class
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/classes/cc/eguid/livepush/PushManagerImpl.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/classes/cc/eguid/livepush/PushManagerImpl.class
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/classes/cc/eguid/livepush/Readme:
--------------------------------------------------------------------------------
1 | livePush0.2.1使用说明:
2 | (重要:使用前必须保证ffmpeg环境包在该项目的WEB-INF\classes\cc\eguid\livepush\ffmpeg\目录中)
3 | 1、对象创建
4 | PushManager pusher = new PushManagerImpl();
5 |
6 | 2、参数说明及设置
7 | 2.1、参数说明
8 | name:应用名;
9 | input:接收地址;
10 | output:推送地址;
11 | codec:视频编码;
12 | fmt:视频格式;
13 | fps:视频帧率;
14 | rs:视频分辨率;
15 | twoPart:0-推一个元码流;1-推一个自定义推流;2-推两个流(一个是自定义,一个是元码)
16 | 2.2、参数使用
17 | Map map = new HashMap();
18 | map.put("appName", "testwanglaing123");
19 | map.put("input","rtsp://admin:admin@192.168.2.236:37779/cam/realmonitor?channel=1&subtype=0");
20 | map.put("output", "rtmp://192.168.30.21/live/");
21 | map.put("codec","h264");
22 | map.put("fmt", "flv");
23 | map.put("fps", "25");
24 | map.put("rs", "640x360");
25 | map.put("twoPart","2");
26 |
27 | 3、调用方法
28 | 3.1、发布方法
29 | id push(map)
30 | pusher.push(map);
31 |
32 | 3.2、关闭发布方法
33 | void closePush(appName)
34 | pusher.closePush(appName);
35 |
36 | 3.3、查看所有正在push的列表
37 | Set viewAppName()
38 | pusher.viewAppName();
39 |
40 | 3.4、检测是否存在某个push
41 | boolean isHave(String appName)
42 | pusher.isHave(appName);
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/classes/cc/eguid/livepush/conf/ConfUtil.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/classes/cc/eguid/livepush/conf/ConfUtil.class
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/classes/cc/eguid/livepush/dao/HandlerDao.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/classes/cc/eguid/livepush/dao/HandlerDao.class
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/classes/cc/eguid/livepush/dao/HandlerDaoImpl.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/classes/cc/eguid/livepush/dao/HandlerDaoImpl.class
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/classes/cc/eguid/livepush/ffmpeg/avcodec-57.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/classes/cc/eguid/livepush/ffmpeg/avcodec-57.dll
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/classes/cc/eguid/livepush/ffmpeg/avdevice-57.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/classes/cc/eguid/livepush/ffmpeg/avdevice-57.dll
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/classes/cc/eguid/livepush/ffmpeg/avfilter-6.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/classes/cc/eguid/livepush/ffmpeg/avfilter-6.dll
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/classes/cc/eguid/livepush/ffmpeg/avformat-57.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/classes/cc/eguid/livepush/ffmpeg/avformat-57.dll
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/classes/cc/eguid/livepush/ffmpeg/avutil-55.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/classes/cc/eguid/livepush/ffmpeg/avutil-55.dll
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/classes/cc/eguid/livepush/ffmpeg/ffmpeg.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/classes/cc/eguid/livepush/ffmpeg/ffmpeg.exe
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/classes/cc/eguid/livepush/ffmpeg/ffplay.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/classes/cc/eguid/livepush/ffmpeg/ffplay.exe
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/classes/cc/eguid/livepush/ffmpeg/ffprobe.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/classes/cc/eguid/livepush/ffmpeg/ffprobe.exe
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/classes/cc/eguid/livepush/ffmpeg/postproc-54.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/classes/cc/eguid/livepush/ffmpeg/postproc-54.dll
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/classes/cc/eguid/livepush/ffmpeg/swresample-2.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/classes/cc/eguid/livepush/ffmpeg/swresample-2.dll
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/classes/cc/eguid/livepush/ffmpeg/swscale-4.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/classes/cc/eguid/livepush/ffmpeg/swscale-4.dll
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/classes/cc/eguid/livepush/handler/OutHandler.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/classes/cc/eguid/livepush/handler/OutHandler.class
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/classes/cc/eguid/livepush/handler/PushHandler.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/classes/cc/eguid/livepush/handler/PushHandler.class
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/classes/cc/eguid/livepush/handler/PushHandlerImpl.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/classes/cc/eguid/livepush/handler/PushHandlerImpl.class
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/classes/cn/njlingdong/cameraLive/controller/CameraLiveController.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/classes/cn/njlingdong/cameraLive/controller/CameraLiveController.class
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/classes/cn/njlingdong/cameraLive/entity/LiveInfoEntity.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/classes/cn/njlingdong/cameraLive/entity/LiveInfoEntity.class
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/classes/cn/njlingdong/cameraLive/entity/ResultData.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/classes/cn/njlingdong/cameraLive/entity/ResultData.class
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/classes/cn/njlingdong/cameraLive/service/CameraLiveService.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/classes/cn/njlingdong/cameraLive/service/CameraLiveService.class
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/classes/cn/njlingdong/cameraLive/service/CameraLiveServiceImpl.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/classes/cn/njlingdong/cameraLive/service/CameraLiveServiceImpl.class
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/classes/cn/njlingdong/cameraLive/util/ResultDataUtil.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/classes/cn/njlingdong/cameraLive/util/ResultDataUtil.class
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/aopalliance-1.0.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/aopalliance-1.0.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/aspectjrt-1.8.6.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/aspectjrt-1.8.6.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/aspectjweaver.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/aspectjweaver.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/commons-codec-1.9.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/commons-codec-1.9.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/commons-collections-3.1.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/commons-collections-3.1.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/commons-dbcp-1.2.2.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/commons-dbcp-1.2.2.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/commons-fileupload-1.3.1.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/commons-fileupload-1.3.1.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/commons-io-2.4.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/commons-io-2.4.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/commons-lang-2.3.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/commons-lang-2.3.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/commons-logging.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/commons-logging.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/commons-pool.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/commons-pool.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/commons-pool2-2.4.1.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/commons-pool2-2.4.1.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/ezmorph-1.0.4.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/ezmorph-1.0.4.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/jackson-annotations-2.4.1.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/jackson-annotations-2.4.1.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/jackson-core-2.4.1.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/jackson-core-2.4.1.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/jackson-databind-2.4.1.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/jackson-databind-2.4.1.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/spring-aop-4.1.6.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/spring-aop-4.1.6.RELEASE.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/spring-aspects-4.1.6.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/spring-aspects-4.1.6.RELEASE.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/spring-beans-4.1.6.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/spring-beans-4.1.6.RELEASE.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/spring-context-4.1.6.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/spring-context-4.1.6.RELEASE.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/spring-context-support-4.1.6.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/spring-context-support-4.1.6.RELEASE.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/spring-core-4.1.6.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/spring-core-4.1.6.RELEASE.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/spring-dao-2.0.8.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/spring-dao-2.0.8.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/spring-expression-4.1.6.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/spring-expression-4.1.6.RELEASE.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/spring-jdbc-4.1.6.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/spring-jdbc-4.1.6.RELEASE.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/spring-security-core-4.0.3.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/spring-security-core-4.0.3.RELEASE.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/spring-security-crypto-3.2.3.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/spring-security-crypto-3.2.3.RELEASE.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/spring-security-web-4.0.3.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/spring-security-web-4.0.3.RELEASE.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/spring-tx-4.1.6.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/spring-tx-4.1.6.RELEASE.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/spring-web-4.1.6.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/spring-web-4.1.6.RELEASE.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/lib/spring-webmvc-4.1.6.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/WEB-INF/lib/spring-webmvc-4.1.6.RELEASE.jar
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/springMVC.xml:
--------------------------------------------------------------------------------
1 |
2 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
27 |
29 |
--------------------------------------------------------------------------------
/WebRoot/WEB-INF/web.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | index.html
5 |
6 |
7 |
8 | springMVC
9 | org.springframework.web.servlet.DispatcherServlet
10 |
11 | contextConfigLocation
12 | /WEB-INF/springMVC.xml
13 |
14 | 1
15 |
16 |
17 | springMVC
18 | /
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/WebRoot/ckplayer.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 超酷播放器测试
5 |
6 |
7 |
8 |
9 |
10 |
11 |
133 |
134 |
135 |
103 |
104 |
158 |
159 |
160 |
--------------------------------------------------------------------------------
/WebRoot/player/font/VideoJS.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/player/font/VideoJS.eot
--------------------------------------------------------------------------------
/WebRoot/player/font/VideoJS.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/player/font/VideoJS.ttf
--------------------------------------------------------------------------------
/WebRoot/player/font/VideoJS.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/player/font/VideoJS.woff
--------------------------------------------------------------------------------
/WebRoot/player/ie8/videojs-ie8.min.js:
--------------------------------------------------------------------------------
1 | !function(a,b){"undefined"==typeof a.HTMLVideoElement&&(b.createElement("video"),b.createElement("audio"),b.createElement("track")),function(a,b){"use strict";"function"==typeof define&&define.amd?define(b):"object"==typeof exports?module.exports=b():a.returnExports=b()}(this,function(){var b,c=Array,d=c.prototype,e=Object,f=e.prototype,g=Function.prototype,h=String,i=h.prototype,j=Number,k=j.prototype,l=d.slice,m=d.splice,n=d.push,o=d.unshift,p=d.concat,q=g.call,r=g.apply,s=Math.max,t=Math.min,u=f.toString,v="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag,w=Function.prototype.toString,x=function(a){try{return w.call(a),!0}catch(b){return!1}},y="[object Function]",z="[object GeneratorFunction]";b=function(a){if("function"!=typeof a)return!1;if(v)return x(a);var b=u.call(a);return b===y||b===z};var A,B=RegExp.prototype.exec,C=function(a){try{return B.call(a),!0}catch(b){return!1}},D="[object RegExp]";A=function(a){return"object"!=typeof a?!1:v?C(a):u.call(a)===D};var E,F=String.prototype.valueOf,G=function(a){try{return F.call(a),!0}catch(b){return!1}},H="[object String]";E=function(a){return"string"==typeof a?!0:"object"!=typeof a?!1:v?G(a):u.call(a)===H};var I=e.defineProperty&&function(){try{var a={};e.defineProperty(a,"x",{enumerable:!1,value:a});for(var b in a)return!1;return a.x===a}catch(c){return!1}}(),J=function(a){var b;return b=I?function(a,b,c,d){!d&&b in a||e.defineProperty(a,b,{configurable:!0,enumerable:!1,writable:!0,value:c})}:function(a,b,c,d){!d&&b in a||(a[b]=c)},function(c,d,e){for(var f in d)a.call(d,f)&&b(c,f,d[f],e)}}(f.hasOwnProperty),K=function(a){var b=typeof a;return null===a||"object"!==b&&"function"!==b},L=j.isNaN||function(a){return a!==a},M={ToInteger:function(a){var b=+a;return L(b)?b=0:0!==b&&b!==1/0&&b!==-(1/0)&&(b=(b>0||-1)*Math.floor(Math.abs(b))),b},ToPrimitive:function(a){var c,d,e;if(K(a))return a;if(d=a.valueOf,b(d)&&(c=d.call(a),K(c)))return c;if(e=a.toString,b(e)&&(c=e.call(a),K(c)))return c;throw new TypeError},ToObject:function(a){if(null==a)throw new TypeError("can't convert "+a+" to object");return e(a)},ToUint32:function(a){return a>>>0}},N=function(){};J(g,{bind:function(a){var c=this;if(!b(c))throw new TypeError("Function.prototype.bind called on incompatible "+c);for(var d,f=l.call(arguments,1),g=function(){if(this instanceof d){var b=c.apply(this,p.call(f,l.call(arguments)));return e(b)===b?b:this}return c.apply(a,p.call(f,l.call(arguments)))},h=s(0,c.length-f.length),i=[],j=0;h>j;j++)n.call(i,"$"+j);return d=Function("binder","return function ("+i.join(",")+"){ return binder.apply(this, arguments); }")(g),c.prototype&&(N.prototype=c.prototype,d.prototype=new N,N.prototype=null),d}});var O=q.bind(f.hasOwnProperty),P=q.bind(f.toString),Q=q.bind(l),R=r.bind(l),S=q.bind(i.slice),T=q.bind(i.split),U=q.bind(i.indexOf),V=q.bind(n),W=q.bind(f.propertyIsEnumerable),X=q.bind(d.sort),Y=c.isArray||function(a){return"[object Array]"===P(a)},Z=1!==[].unshift(0);J(d,{unshift:function(){return o.apply(this,arguments),this.length}},Z),J(c,{isArray:Y});var $=e("a"),_="a"!==$[0]||!(0 in $),aa=function(a){var b=!0,c=!0,d=!1;if(a)try{a.call("foo",function(a,c,d){"object"!=typeof d&&(b=!1)}),a.call([1],function(){"use strict";c="string"==typeof this},"x")}catch(e){d=!0}return!!a&&!d&&b&&c};J(d,{forEach:function(a){var c,d=M.ToObject(this),e=_&&E(this)?T(this,""):d,f=-1,g=M.ToUint32(e.length);if(arguments.length>1&&(c=arguments[1]),!b(a))throw new TypeError("Array.prototype.forEach callback must be a function");for(;++f1&&(d=arguments[1]),!b(a))throw new TypeError("Array.prototype.map callback must be a function");for(var i=0;g>i;i++)i in f&&("undefined"==typeof d?h[i]=a(f[i],i,e):h[i]=a.call(d,f[i],i,e));return h}},!aa(d.map)),J(d,{filter:function(a){var c,d,e=M.ToObject(this),f=_&&E(this)?T(this,""):e,g=M.ToUint32(f.length),h=[];if(arguments.length>1&&(d=arguments[1]),!b(a))throw new TypeError("Array.prototype.filter callback must be a function");for(var i=0;g>i;i++)i in f&&(c=f[i],("undefined"==typeof d?a(c,i,e):a.call(d,c,i,e))&&V(h,c));return h}},!aa(d.filter)),J(d,{every:function(a){var c,d=M.ToObject(this),e=_&&E(this)?T(this,""):d,f=M.ToUint32(e.length);if(arguments.length>1&&(c=arguments[1]),!b(a))throw new TypeError("Array.prototype.every callback must be a function");for(var g=0;f>g;g++)if(g in e&&!("undefined"==typeof c?a(e[g],g,d):a.call(c,e[g],g,d)))return!1;return!0}},!aa(d.every)),J(d,{some:function(a){var c,d=M.ToObject(this),e=_&&E(this)?T(this,""):d,f=M.ToUint32(e.length);if(arguments.length>1&&(c=arguments[1]),!b(a))throw new TypeError("Array.prototype.some callback must be a function");for(var g=0;f>g;g++)if(g in e&&("undefined"==typeof c?a(e[g],g,d):a.call(c,e[g],g,d)))return!0;return!1}},!aa(d.some));var ba=!1;d.reduce&&(ba="object"==typeof d.reduce.call("es5",function(a,b,c,d){return d})),J(d,{reduce:function(a){var c=M.ToObject(this),d=_&&E(this)?T(this,""):c,e=M.ToUint32(d.length);if(!b(a))throw new TypeError("Array.prototype.reduce callback must be a function");if(0===e&&1===arguments.length)throw new TypeError("reduce of empty array with no initial value");var f,g=0;if(arguments.length>=2)f=arguments[1];else for(;;){if(g in d){f=d[g++];break}if(++g>=e)throw new TypeError("reduce of empty array with no initial value")}for(;e>g;g++)g in d&&(f=a(f,d[g],g,c));return f}},!ba);var ca=!1;d.reduceRight&&(ca="object"==typeof d.reduceRight.call("es5",function(a,b,c,d){return d})),J(d,{reduceRight:function(a){var c=M.ToObject(this),d=_&&E(this)?T(this,""):c,e=M.ToUint32(d.length);if(!b(a))throw new TypeError("Array.prototype.reduceRight callback must be a function");if(0===e&&1===arguments.length)throw new TypeError("reduceRight of empty array with no initial value");var f,g=e-1;if(arguments.length>=2)f=arguments[1];else for(;;){if(g in d){f=d[g--];break}if(--g<0)throw new TypeError("reduceRight of empty array with no initial value")}if(0>g)return f;do g in d&&(f=a(f,d[g],g,c));while(g--);return f}},!ca);var da=d.indexOf&&-1!==[0,1].indexOf(1,2);J(d,{indexOf:function(a){var b=_&&E(this)?T(this,""):M.ToObject(this),c=M.ToUint32(b.length);if(0===c)return-1;var d=0;for(arguments.length>1&&(d=M.ToInteger(arguments[1])),d=d>=0?d:s(0,c+d);c>d;d++)if(d in b&&b[d]===a)return d;return-1}},da);var ea=d.lastIndexOf&&-1!==[0,1].lastIndexOf(0,-3);J(d,{lastIndexOf:function(a){var b=_&&E(this)?T(this,""):M.ToObject(this),c=M.ToUint32(b.length);if(0===c)return-1;var d=c-1;for(arguments.length>1&&(d=t(d,M.ToInteger(arguments[1]))),d=d>=0?d:c-Math.abs(d);d>=0;d--)if(d in b&&a===b[d])return d;return-1}},ea);var fa=function(){var a=[1,2],b=a.splice();return 2===a.length&&Y(b)&&0===b.length}();J(d,{splice:function(a,b){return 0===arguments.length?[]:m.apply(this,arguments)}},!fa);var ga=function(){var a={};return d.splice.call(a,0,0,1),1===a.length}();J(d,{splice:function(a,b){if(0===arguments.length)return[];var c=arguments;return this.length=s(M.ToInteger(this.length),0),arguments.length>0&&"number"!=typeof b&&(c=Q(arguments),c.length<2?V(c,this.length-a):c[1]=M.ToInteger(b)),m.apply(this,c)}},!ga);var ha=function(){var a=new c(1e5);return a[8]="x",a.splice(1,1),7===a.indexOf("x")}(),ia=function(){var a=256,b=[];return b[a]="a",b.splice(a+1,0,"b"),"a"===b[a]}();J(d,{splice:function(a,b){for(var c,d=M.ToObject(this),e=[],f=M.ToUint32(d.length),g=M.ToInteger(a),i=0>g?s(f+g,0):t(g,f),j=t(s(M.ToInteger(b),0),f-i),k=0;j>k;)c=h(i+k),O(d,c)&&(e[k]=d[c]),k+=1;var l,m=Q(arguments,2),n=m.length;if(j>n){for(k=i;f-j>k;)c=h(k+j),l=h(k+n),O(d,c)?d[l]=d[c]:delete d[l],k+=1;for(k=f;k>f-j+n;)delete d[k-1],k-=1}else if(n>j)for(k=f-j;k>i;)c=h(k+j-1),l=h(k+n-1),O(d,c)?d[l]=d[c]:delete d[l],k-=1;k=i;for(var o=0;o=0&&!Y(a)&&b(a.callee)},Ea=Ca(arguments)?Ca:Da;J(e,{keys:function(a){var c=b(a),d=Ea(a),e=null!==a&&"object"==typeof a,f=e&&E(a);if(!e&&!c&&!d)throw new TypeError("Object.keys called on a non-object");var g=[],i=ua&&c;if(f&&va||d)for(var j=0;jm;m++){var n=Aa[m];l&&"constructor"===n||!O(a,n)||V(g,n)}return g}});var Fa=e.keys&&function(){return 2===e.keys(arguments).length}(1,2),Ga=e.keys&&function(){var a=e.keys(arguments);return 1!==arguments.length||1!==a.length||1!==a[0]}(1),Ha=e.keys;J(e,{keys:function(a){return Ha(Ea(a)?Q(a):a)}},!Fa||Ga);var Ia,Ja,Ka=0!==new Date(-0xc782b5b342b24).getUTCMonth(),La=new Date(-0x55d318d56a724),Ma=new Date(14496624e5),Na="Mon, 01 Jan -45875 11:59:59 GMT"!==La.toUTCString(),Oa=La.getTimezoneOffset();-720>Oa?(Ia="Tue Jan 02 -45875"!==La.toDateString(),Ja=!/^Thu Dec 10 2015 \d\d:\d\d:\d\d GMT[-\+]\d\d\d\d(?: |$)/.test(Ma.toString())):(Ia="Mon Jan 01 -45875"!==La.toDateString(),Ja=!/^Wed Dec 09 2015 \d\d:\d\d:\d\d GMT[-\+]\d\d\d\d(?: |$)/.test(Ma.toString()));var Pa=q.bind(Date.prototype.getFullYear),Qa=q.bind(Date.prototype.getMonth),Ra=q.bind(Date.prototype.getDate),Sa=q.bind(Date.prototype.getUTCFullYear),Ta=q.bind(Date.prototype.getUTCMonth),Ua=q.bind(Date.prototype.getUTCDate),Va=q.bind(Date.prototype.getUTCDay),Wa=q.bind(Date.prototype.getUTCHours),Xa=q.bind(Date.prototype.getUTCMinutes),Ya=q.bind(Date.prototype.getUTCSeconds),Za=q.bind(Date.prototype.getUTCMilliseconds),$a=["Sun","Mon","Tue","Wed","Thu","Fri"],_a=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],ab=function(a,b){return Ra(new Date(b,a,0))};J(Date.prototype,{getFullYear:function(){if(!(this&&this instanceof Date))throw new TypeError("this is not a Date object.");var a=Pa(this);return 0>a&&Qa(this)>11?a+1:a},getMonth:function(){if(!(this&&this instanceof Date))throw new TypeError("this is not a Date object.");var a=Pa(this),b=Qa(this);return 0>a&&b>11?0:b},getDate:function(){if(!(this&&this instanceof Date))throw new TypeError("this is not a Date object.");var a=Pa(this),b=Qa(this),c=Ra(this);if(0>a&&b>11){if(12===b)return c;var d=ab(0,a+1);return d-c+1}return c},getUTCFullYear:function(){if(!(this&&this instanceof Date))throw new TypeError("this is not a Date object.");var a=Sa(this);return 0>a&&Ta(this)>11?a+1:a},getUTCMonth:function(){if(!(this&&this instanceof Date))throw new TypeError("this is not a Date object.");var a=Sa(this),b=Ta(this);return 0>a&&b>11?0:b},getUTCDate:function(){if(!(this&&this instanceof Date))throw new TypeError("this is not a Date object.");var a=Sa(this),b=Ta(this),c=Ua(this);if(0>a&&b>11){if(12===b)return c;var d=ab(0,a+1);return d-c+1}return c}},Ka),J(Date.prototype,{toUTCString:function(){if(!(this&&this instanceof Date))throw new TypeError("this is not a Date object.");var a=Va(this),b=Ua(this),c=Ta(this),d=Sa(this),e=Wa(this),f=Xa(this),g=Ya(this);return $a[a]+", "+(10>b?"0"+b:b)+" "+_a[c]+" "+d+" "+(10>e?"0"+e:e)+":"+(10>f?"0"+f:f)+":"+(10>g?"0"+g:g)+" GMT"}},Ka||Na),J(Date.prototype,{toDateString:function(){if(!(this&&this instanceof Date))throw new TypeError("this is not a Date object.");var a=this.getDay(),b=this.getDate(),c=this.getMonth(),d=this.getFullYear();return $a[a]+" "+_a[c]+" "+(10>b?"0"+b:b)+" "+d}},Ka||Ia),(Ka||Ja)&&(Date.prototype.toString=function(){if(!(this&&this instanceof Date))throw new TypeError("this is not a Date object.");var a=this.getDay(),b=this.getDate(),c=this.getMonth(),d=this.getFullYear(),e=this.getHours(),f=this.getMinutes(),g=this.getSeconds(),h=this.getTimezoneOffset(),i=Math.floor(Math.abs(h)/60),j=Math.floor(Math.abs(h)%60);return $a[a]+" "+_a[c]+" "+(10>b?"0"+b:b)+" "+d+" "+(10>e?"0"+e:e)+":"+(10>f?"0"+f:f)+":"+(10>g?"0"+g:g)+" GMT"+(h>0?"-":"+")+(10>i?"0"+i:i)+(10>j?"0"+j:j)},I&&e.defineProperty(Date.prototype,"toString",{configurable:!0,enumerable:!1,writable:!0}));var bb=-621987552e5,cb="-000001",db=Date.prototype.toISOString&&-1===new Date(bb).toISOString().indexOf(cb),eb=Date.prototype.toISOString&&"1969-12-31T23:59:59.999Z"!==new Date(-1).toISOString();J(Date.prototype,{toISOString:function(){if(!isFinite(this))throw new RangeError("Date.prototype.toISOString called on non-finite value.");var a=Sa(this),b=Ta(this);a+=Math.floor(b/12),b=(b%12+12)%12;var c=[b+1,Ua(this),Wa(this),Xa(this),Ya(this)];a=(0>a?"-":a>9999?"+":"")+S("00000"+Math.abs(a),a>=0&&9999>=a?-4:-6);for(var d=0;d=7&&j>jb){var o=Math.floor(j/jb)*jb,p=Math.floor(o/1e3);m+=p,n-=1e3*p}k=1===l&&h(c)===c?new a(b.parse(c)):l>=7?new a(c,d,e,f,g,m,n):l>=6?new a(c,d,e,f,g,m):l>=5?new a(c,d,e,f,g):l>=4?new a(c,d,e,f):l>=3?new a(c,d,e):l>=2?new a(c,d):l>=1?new a(c):new a}else k=a.apply(this,arguments);return K(k)||J(k,{constructor:b},!0),k},c=new RegExp("^(\\d{4}|[+-]\\d{6})(?:-(\\d{2})(?:-(\\d{2})(?:T(\\d{2}):(\\d{2})(?::(\\d{2})(?:(\\.\\d{1,}))?)?(Z|(?:([-+])(\\d{2}):(\\d{2})))?)?)?)?$"),d=[0,31,59,90,120,151,181,212,243,273,304,334,365],e=function(a,b){var c=b>1?1:0;return d[b]+Math.floor((a-1969+c)/4)-Math.floor((a-1901+c)/100)+Math.floor((a-1601+c)/400)+365*(a-1970)},f=function(b){var c=0,d=b;if(kb&&d>jb){var e=Math.floor(d/jb)*jb,f=Math.floor(e/1e3);c+=f,d-=1e3*f}return j(new a(1970,0,1,0,0,c,d))};for(var g in a)O(a,g)&&(b[g]=a[g]);J(b,{now:a.now,UTC:a.UTC},!0),b.prototype=a.prototype,J(b.prototype,{constructor:b},!0);var i=function(b){var d=c.exec(b);if(d){var g,h=j(d[1]),i=j(d[2]||1)-1,k=j(d[3]||1)-1,l=j(d[4]||0),m=j(d[5]||0),n=j(d[6]||0),o=Math.floor(1e3*j(d[7]||0)),p=Boolean(d[4]&&!d[8]),q="-"===d[9]?1:-1,r=j(d[10]||0),s=j(d[11]||0),t=m>0||n>0||o>0;return(t?24:25)>l&&60>m&&60>n&&1e3>o&&i>-1&&12>i&&24>r&&60>s&&k>-1&&k=-864e13&&864e13>=g)?g:NaN}return a.parse.apply(this,arguments)};return J(b,{parse:i}),b}(Date)}Date.now||(Date.now=function(){return(new Date).getTime()});var lb=k.toFixed&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==0xde0b6b3a7640080.toFixed(0)),mb={base:1e7,size:6,data:[0,0,0,0,0,0],multiply:function(a,b){for(var c=-1,d=b;++c=0;)c+=mb.data[b],mb.data[b]=Math.floor(c/a),c=c%a*mb.base},numToString:function(){for(var a=mb.size,b="";--a>=0;)if(""!==b||0===a||0!==mb.data[a]){var c=h(mb.data[a]);""===b?b=c:b+=S("0000000",0,7-c.length)+c}return b},pow:function Gb(a,b,c){return 0===b?c:b%2===1?Gb(a,b-1,c*a):Gb(a*a,b/2,c)},log:function(a){for(var b=0,c=a;c>=4096;)b+=12,c/=4096;for(;c>=2;)b+=1,c/=2;return b}},nb=function(a){var b,c,d,e,f,g,i,k;if(b=j(a),b=L(b)?0:Math.floor(b),0>b||b>20)throw new RangeError("Number.toFixed called with invalid number of decimals");if(c=j(this),L(c))return"NaN";if(-1e21>=c||c>=1e21)return h(c);if(d="",0>c&&(d="-",c=-c),e="0",c>1e-21)if(f=mb.log(c*mb.pow(2,69,1))-69,g=0>f?c*mb.pow(2,-f,1):c/mb.pow(2,f,1),g*=4503599627370496,f=52-f,f>0){for(mb.multiply(0,g),i=b;i>=7;)mb.multiply(1e7,0),i-=7;for(mb.multiply(mb.pow(10,i,1),0),i=f-1;i>=23;)mb.divide(1<<23),i-=23;mb.divide(1<0?(k=e.length,e=b>=k?d+S("0.0000000000000000000",0,b-k+2)+e:d+S(e,0,k-b)+"."+S(e,k-b)):e=d+e,e};J(k,{toFixed:nb},lb);var ob=function(){try{return"1"===1..toPrecision(void 0)}catch(a){return!0}}(),pb=k.toPrecision;J(k,{toPrecision:function(a){return"undefined"==typeof a?pb.call(this):pb.call(this,a)}},ob),2!=="ab".split(/(?:ab)*/).length||4!==".".split(/(.?)(.?)/).length||"t"==="tesst".split(/(s)*/)[1]||4!=="test".split(/(?:)/,-1).length||"".split(/.?/).length||".".split(/()()/).length>1?!function(){var a="undefined"==typeof/()??/.exec("")[1],b=Math.pow(2,32)-1;i.split=function(c,d){var e=String(this);if("undefined"==typeof c&&0===d)return[];if(!A(c))return T(this,c,d);var f,g,h,i,j=[],k=(c.ignoreCase?"i":"")+(c.multiline?"m":"")+(c.unicode?"u":"")+(c.sticky?"y":""),l=0,m=new RegExp(c.source,k+"g");a||(f=new RegExp("^"+m.source+"$(?!\\s)",k));var o="undefined"==typeof d?b:M.ToUint32(d);for(g=m.exec(e);g&&(h=g.index+g[0].length,!(h>l&&(V(j,S(e,l,g.index)),!a&&g.length>1&&g[0].replace(f,function(){for(var a=1;a1&&g.index=o)));)m.lastIndex===g.index&&m.lastIndex++,g=m.exec(e);return l===e.length?(i||!m.test(""))&&V(j,""):V(j,S(e,l)),j.length>o?S(j,0,o):j}}():"0".split(void 0,0).length&&(i.split=function(a,b){return"undefined"==typeof a&&0===b?[]:T(this,a,b)});var qb=i.replace,rb=function(){var a=[];return"x".replace(/x(.)?/g,function(b,c){V(a,c)}),1===a.length&&"undefined"==typeof a[0]}();rb||(i.replace=function(a,c){var d=b(c),e=A(a)&&/\)[*?]/.test(a.source);if(d&&e){var f=function(b){var d=arguments.length,e=a.lastIndex;a.lastIndex=0;var f=a.exec(b)||[];return a.lastIndex=e,V(f,arguments[d-2],arguments[d-1]),c.apply(this,f)};return qb.call(this,a,f)}return qb.call(this,a,c)});var sb=i.substr,tb="".substr&&"b"!=="0b".substr(-1);J(i,{substr:function(a,b){var c=a;return 0>a&&(c=s(this.length+a,0)),sb.call(this,c,b)}},tb);var ub=" \n\f\r \u2028\u2029\ufeff",vb="",wb="["+ub+"]",xb=new RegExp("^"+wb+wb+"*"),yb=new RegExp(wb+wb+"*$"),zb=i.trim&&(ub.trim()||!vb.trim());J(i,{trim:function(){if("undefined"==typeof this||null===this)throw new TypeError("can't convert "+this+" to object");return h(this).replace(xb,"").replace(yb,"")}},zb);var Ab=q.bind(String.prototype.trim),Bb=i.lastIndexOf&&-1!=="abcあい".lastIndexOf("あい",2);J(i,{lastIndexOf:function(a){if("undefined"==typeof this||null===this)throw new TypeError("can't convert "+this+" to object");for(var b=h(this),c=h(a),d=arguments.length>1?j(arguments[1]):NaN,e=L(d)?1/0:M.ToInteger(d),f=t(s(e,0),b.length),g=c.length,i=f+g;i>0;){i=s(0,i-g);var k=U(S(b,i,f+g),c);if(-1!==k)return i+k}return-1}},Bb);var Cb=i.lastIndexOf;if(J(i,{lastIndexOf:function(a){return Cb.apply(this,arguments)}},1!==i.lastIndexOf.length),(8!==parseInt(ub+"08")||22!==parseInt(ub+"0x16"))&&(parseInt=function(a){var b=/^[\-+]?0[xX]/;return function(c,d){var e=Ab(c),f=j(d)||(b.test(e)?16:10);return a(e,f)}}(parseInt)),1/parseFloat("-0")!==-(1/0)&&(parseFloat=function(a){return function(b){var c=Ab(b),d=a(c);return 0===d&&"-"===S(c,0,1)?-0:d}}(parseFloat)),"RangeError: test"!==String(new RangeError("test"))){var Db=function(){if("undefined"==typeof this||null===this)throw new TypeError("can't convert "+this+" to object");var a=this.name;"undefined"==typeof a?a="Error":"string"!=typeof a&&(a=h(a));var b=this.message;return"undefined"==typeof b?b="":"string"!=typeof b&&(b=h(b)),a?b?a+": "+b:a:b};Error.prototype.toString=Db}if(I){var Eb=function(a,b){if(W(a,b)){var c=Object.getOwnPropertyDescriptor(a,b);c.enumerable=!1,Object.defineProperty(a,b,c)}};Eb(Error.prototype,"message"),""!==Error.prototype.message&&(Error.prototype.message=""),Eb(Error.prototype,"name")}if("/a/gim"!==String(/a/gim)){var Fb=function(){var a="/"+this.source+"/";return this.global&&(a+="g"),this.ignoreCase&&(a+="i"),this.multiline&&(a+="m"),a};RegExp.prototype.toString=Fb}}),function(a,b){"use strict";"function"==typeof define&&define.amd?define(b):"object"==typeof exports?module.exports=b():a.returnExports=b()}(this,function(){var a,c,d,e,f=Function.call,g=Object.prototype,h=f.bind(g.hasOwnProperty),i=f.bind(g.propertyIsEnumerable),j=f.bind(g.toString),k=h(g,"__defineGetter__");k&&(a=f.bind(g.__defineGetter__),c=f.bind(g.__defineSetter__),d=f.bind(g.__lookupGetter__),e=f.bind(g.__lookupSetter__)),Object.getPrototypeOf||(Object.getPrototypeOf=function(a){var b=a.__proto__;return b||null===b?b:"[object Function]"===j(a.constructor)?a.constructor.prototype:a instanceof Object?g:null});var l=function(a){try{return a.sentinel=0,0===Object.getOwnPropertyDescriptor(a,"sentinel").value}catch(b){return!1}};if(Object.defineProperty){var m=l({}),n="undefined"==typeof b||l(b.createElement("div"));if(!n||!m)var o=Object.getOwnPropertyDescriptor}if(!Object.getOwnPropertyDescriptor||o){var p="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(a,b){if("object"!=typeof a&&"function"!=typeof a||null===a)throw new TypeError(p+a);if(o)try{return o.call(Object,a,b)}catch(c){}var f;if(!h(a,b))return f;if(f={enumerable:i(a,b),configurable:!0},k){var j=a.__proto__,l=a!==g;l&&(a.__proto__=g);var m=d(a,b),n=e(a,b);if(l&&(a.__proto__=j),m||n)return m&&(f.get=m),n&&(f.set=n),f}return f.value=a[b],f.writable=!0,f}}if(Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(a){return Object.keys(a)}),!Object.create){var q,r=!({__proto__:null}instanceof Object),s=function(){if(!b.domain)return!1;try{return!!new ActiveXObject("htmlfile")}catch(a){return!1}},t=function(){var a,b;return b=new ActiveXObject("htmlfile"),b.write(""),b.close(),a=b.parentWindow.Object.prototype,b=null,a},u=function(){var a,c=b.createElement("iframe"),d=b.body||b.documentElement;return c.style.display="none",d.appendChild(c),c.src="javascript:",a=c.contentWindow.Object.prototype,d.removeChild(c),c=null,a};q=r||"undefined"==typeof b?function(){return{__proto__:null}}:function(){var a=s()?t():u();delete a.constructor,delete a.hasOwnProperty,delete a.propertyIsEnumerable,delete a.isPrototypeOf,delete a.toLocaleString,delete a.toString,delete a.valueOf;var b=function(){};return b.prototype=a,q=function(){return new b},new b},Object.create=function(a,b){var c,d=function(){};if(null===a)c=q();else{if("object"!=typeof a&&"function"!=typeof a)throw new TypeError("Object prototype may only be an Object or null");d.prototype=a,c=new d,c.__proto__=a}return void 0!==b&&Object.defineProperties(c,b),c}}var v=function(a){try{return Object.defineProperty(a,"sentinel",{}),"sentinel"in a}catch(b){return!1}};if(Object.defineProperty){var w=v({}),x="undefined"==typeof b||v(b.createElement("div"));if(!w||!x)var y=Object.defineProperty,z=Object.defineProperties}if(!Object.defineProperty||y){var A="Property description must be an object: ",B="Object.defineProperty called on non-object: ",C="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(b,f,h){if("object"!=typeof b&&"function"!=typeof b||null===b)throw new TypeError(B+b);if("object"!=typeof h&&"function"!=typeof h||null===h)throw new TypeError(A+h);if(y)try{return y.call(Object,b,f,h)}catch(i){}if("value"in h)if(k&&(d(b,f)||e(b,f))){var j=b.__proto__;b.__proto__=g,delete b[f],b[f]=h.value,b.__proto__=j}else b[f]=h.value;else{if(!k&&("get"in h||"set"in h))throw new TypeError(C);"get"in h&&a(b,f,h.get),"set"in h&&c(b,f,h.set)}return b}}(!Object.defineProperties||z)&&(Object.defineProperties=function(a,b){if(z)try{return z.call(Object,a,b)}catch(c){}return Object.keys(b).forEach(function(c){"__proto__"!==c&&Object.defineProperty(a,c,b[c])}),a}),Object.seal||(Object.seal=function(a){if(Object(a)!==a)throw new TypeError("Object.seal can only be called on Objects.");return a}),Object.freeze||(Object.freeze=function(a){if(Object(a)!==a)throw new TypeError("Object.freeze can only be called on Objects.");return a});try{Object.freeze(function(){})}catch(D){Object.freeze=function(a){return function(b){return"function"==typeof b?b:a(b)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(a){if(Object(a)!==a)throw new TypeError("Object.preventExtensions can only be called on Objects.");return a}),Object.isSealed||(Object.isSealed=function(a){if(Object(a)!==a)throw new TypeError("Object.isSealed can only be called on Objects.");return!1}),Object.isFrozen||(Object.isFrozen=function(a){if(Object(a)!==a)throw new TypeError("Object.isFrozen can only be called on Objects.");return!1}),Object.isExtensible||(Object.isExtensible=function(a){if(Object(a)!==a)throw new TypeError("Object.isExtensible can only be called on Objects.");for(var b="";h(a,b);)b+="?";a[b]=!0;var c=h(a,b);return delete a[b],c})})}(window,document);
--------------------------------------------------------------------------------
/WebRoot/player/lang/ar.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("ar",{
2 | "Play": "تشغيل",
3 | "Pause": "ايقاف",
4 | "Current Time": "الوقت الحالي",
5 | "Duration Time": "Dauer",
6 | "Remaining Time": "الوقت المتبقي",
7 | "Stream Type": "نوع التيار",
8 | "LIVE": "مباشر",
9 | "Loaded": "تم التحميل",
10 | "Progress": "التقدم",
11 | "Fullscreen": "ملء الشاشة",
12 | "Non-Fullscreen": "غير ملء الشاشة",
13 | "Mute": "صامت",
14 | "Unmute": "غير الصامت",
15 | "Playback Rate": "معدل التشغيل",
16 | "Subtitles": "الترجمة",
17 | "subtitles off": "ايقاف الترجمة",
18 | "Captions": "التعليقات",
19 | "captions off": "ايقاف التعليقات",
20 | "Chapters": "فصول",
21 | "You aborted the media playback": "لقد ألغيت تشغيل الفيديو",
22 | "A network error caused the media download to fail part-way.": "تسبب خطأ في الشبكة بفشل تحميل الفيديو بالكامل.",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "لا يمكن تحميل الفيديو بسبب فشل في الخادم أو الشبكة ، أو فشل بسبب عدم امكانية قراءة تنسيق الفيديو.",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "تم ايقاف تشغيل الفيديو بسبب مشكلة فساد أو لأن الفيديو المستخدم يستخدم ميزات غير مدعومة من متصفحك.",
25 | "No compatible source was found for this media.": "فشل العثور على أي مصدر متوافق مع هذا الفيديو.",
26 | "Play Video": "تشغيل الفيديو",
27 | "Close": "أغلق",
28 | "Modal Window": "نافذة مشروطة",
29 | "This is a modal window": "هذه نافذة مشروطة",
30 | "This modal can be closed by pressing the Escape key or activating the close button.": "يمكن غلق هذه النافذة المشروطة عن طريق الضغط على زر الخروج أو تفعيل زر الإغلاق",
31 | ", opens captions settings dialog": ", تفتح نافذة خيارات التعليقات",
32 | ", opens subtitles settings dialog": ", تفتح نافذة خيارات الترجمة",
33 | ", selected": ", مختار"
34 | });
--------------------------------------------------------------------------------
/WebRoot/player/lang/ba.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("ba",{
2 | "Play": "Pusti",
3 | "Pause": "Pauza",
4 | "Current Time": "Trenutno vrijeme",
5 | "Duration Time": "Vrijeme trajanja",
6 | "Remaining Time": "Preostalo vrijeme",
7 | "Stream Type": "Način strimovanja",
8 | "LIVE": "UŽIVO",
9 | "Loaded": "Učitan",
10 | "Progress": "Progres",
11 | "Fullscreen": "Puni ekran",
12 | "Non-Fullscreen": "Mali ekran",
13 | "Mute": "Prigušen",
14 | "Unmute": "Ne-prigušen",
15 | "Playback Rate": "Stopa reprodukcije",
16 | "Subtitles": "Podnaslov",
17 | "subtitles off": "Podnaslov deaktiviran",
18 | "Captions": "Titlovi",
19 | "captions off": "Titlovi deaktivirani",
20 | "Chapters": "Poglavlja",
21 | "You aborted the media playback": "Isključili ste reprodukciju videa.",
22 | "A network error caused the media download to fail part-way.": "Video se prestao preuzimati zbog greške na mreži.",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video se ne može reproducirati zbog servera, greške u mreži ili je format ne podržan.",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Reprodukcija videa je zaustavljenja zbog greške u formatu ili zbog verzije vašeg pretraživača.",
25 | "No compatible source was found for this media.": "Nije nađen nijedan kompatibilan izvor ovog videa."
26 | });
--------------------------------------------------------------------------------
/WebRoot/player/lang/bg.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("bg",{
2 | "Play": "Възпроизвеждане",
3 | "Pause": "Пауза",
4 | "Current Time": "Текущо време",
5 | "Duration Time": "Продължителност",
6 | "Remaining Time": "Оставащо време",
7 | "Stream Type": "Тип на потока",
8 | "LIVE": "НА ЖИВО",
9 | "Loaded": "Заредено",
10 | "Progress": "Прогрес",
11 | "Fullscreen": "Цял екран",
12 | "Non-Fullscreen": "Спиране на цял екран",
13 | "Mute": "Без звук",
14 | "Unmute": "Със звук",
15 | "Playback Rate": "Скорост на възпроизвеждане",
16 | "Subtitles": "Субтитри",
17 | "subtitles off": "Спряни субтитри",
18 | "Captions": "Аудио надписи",
19 | "captions off": "Спряни аудио надписи",
20 | "Chapters": "Глави",
21 | "You aborted the media playback": "Спряхте възпроизвеждането на видеото",
22 | "A network error caused the media download to fail part-way.": "Грешка в мрежата провали изтеглянето на видеото.",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Видеото не може да бъде заредено заради проблем със сървъра или мрежата или защото този формат не е поддържан.",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Възпроизвеждането на видеото беше прекъснато заради проблем с файла или защото видеото използва опции които браузърът Ви не поддържа.",
25 | "No compatible source was found for this media.": "Не беше намерен съвместим източник за това видео."
26 | });
--------------------------------------------------------------------------------
/WebRoot/player/lang/ca.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("ca",{
2 | "Play": "Reproducció",
3 | "Pause": "Pausa",
4 | "Current Time": "Temps reproduït",
5 | "Duration Time": "Durada total",
6 | "Remaining Time": "Temps restant",
7 | "Stream Type": "Tipus de seqüència",
8 | "LIVE": "EN DIRECTE",
9 | "Loaded": "Carregat",
10 | "Progress": "Progrés",
11 | "Fullscreen": "Pantalla completa",
12 | "Non-Fullscreen": "Pantalla no completa",
13 | "Mute": "Silencia",
14 | "Unmute": "Amb so",
15 | "Playback Rate": "Velocitat de reproducció",
16 | "Subtitles": "Subtítols",
17 | "subtitles off": "Subtítols desactivats",
18 | "Captions": "Llegendes",
19 | "captions off": "Llegendes desactivades",
20 | "Chapters": "Capítols",
21 | "You aborted the media playback": "Heu interromput la reproducció del vídeo.",
22 | "A network error caused the media download to fail part-way.": "Un error de la xarxa ha interromput la baixada del vídeo.",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "No s'ha pogut carregar el vídeo perquè el servidor o la xarxa han fallat, o bé perquè el seu format no és compatible.",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "La reproducció de vídeo s'ha interrumput per un problema de corrupció de dades o bé perquè el vídeo demanava funcions que el vostre navegador no ofereix.",
25 | "No compatible source was found for this media.": "No s'ha trobat cap font compatible amb el vídeo."
26 | });
--------------------------------------------------------------------------------
/WebRoot/player/lang/cs.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("cs",{
2 | "Play": "Přehrát",
3 | "Pause": "Pauza",
4 | "Current Time": "Aktuální čas",
5 | "Duration Time": "Doba trvání",
6 | "Remaining Time": "Zbývající čas",
7 | "Stream Type": "Stream Type",
8 | "LIVE": "ŽIVĚ",
9 | "Loaded": "Načteno",
10 | "Progress": "Stav",
11 | "Fullscreen": "Celá obrazovka",
12 | "Non-Fullscreen": "Zmenšená obrazovka",
13 | "Mute": "Ztlumit zvuk",
14 | "Unmute": "Přehrát zvuk",
15 | "Playback Rate": "Rychlost přehrávání",
16 | "Subtitles": "Titulky",
17 | "subtitles off": "Titulky vypnuty",
18 | "Captions": "Popisky",
19 | "captions off": "Popisky vypnuty",
20 | "Chapters": "Kapitoly",
21 | "You aborted the media playback": "Přehrávání videa je přerušeno.",
22 | "A network error caused the media download to fail part-way.": "Video nemohlo být načteno, kvůli chybě v síti.",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video nemohlo být načteno, buď kvůli chybě serveru nebo sítě nebo proto, že daný formát není podporován.",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Váš prohlížeč nepodporuje formát videa.",
25 | "No compatible source was found for this media.": "Špatně zadaný zdroj videa."
26 | });
--------------------------------------------------------------------------------
/WebRoot/player/lang/da.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("da",{
2 | "Play": "Afspil",
3 | "Pause": "Pause",
4 | "Current Time": "Aktuel tid",
5 | "Duration Time": "Varighed",
6 | "Remaining Time": "Resterende tid",
7 | "Stream Type": "Stream-type",
8 | "LIVE": "LIVE",
9 | "Loaded": "Indlæst",
10 | "Progress": "Status",
11 | "Fullscreen": "Fuldskærm",
12 | "Non-Fullscreen": "Luk fuldskærm",
13 | "Mute": "Uden lyd",
14 | "Unmute": "Med lyd",
15 | "Playback Rate": "Afspilningsrate",
16 | "Subtitles": "Undertekster",
17 | "subtitles off": "Uden undertekster",
18 | "Captions": "Undertekster for hørehæmmede",
19 | "captions off": "Uden undertekster for hørehæmmede",
20 | "Chapters": "Kapitler",
21 | "You aborted the media playback": "Du afbrød videoafspilningen.",
22 | "A network error caused the media download to fail part-way.": "En netværksfejl fik download af videoen til at fejle.",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Videoen kunne ikke indlæses, enten fordi serveren eller netværket fejlede, eller fordi formatet ikke er understøttet.",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Videoafspilningen blev afbrudt på grund af ødelagte data eller fordi videoen benyttede faciliteter som din browser ikke understøtter.",
25 | "No compatible source was found for this media.": "Fandt ikke en kompatibel kilde for denne media."
26 | });
--------------------------------------------------------------------------------
/WebRoot/player/lang/de.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("de",{
2 | "Play": "Wiedergabe",
3 | "Pause": "Pause",
4 | "Current Time": "Aktueller Zeitpunkt",
5 | "Duration Time": "Dauer",
6 | "Remaining Time": "Verbleibende Zeit",
7 | "Stream Type": "Streamtyp",
8 | "LIVE": "LIVE",
9 | "Loaded": "Geladen",
10 | "Progress": "Status",
11 | "Fullscreen": "Vollbild",
12 | "Non-Fullscreen": "Kein Vollbild",
13 | "Mute": "Ton aus",
14 | "Unmute": "Ton ein",
15 | "Playback Rate": "Wiedergabegeschwindigkeit",
16 | "Subtitles": "Untertitel",
17 | "subtitles off": "Untertitel aus",
18 | "Captions": "Untertitel",
19 | "captions off": "Untertitel aus",
20 | "Chapters": "Kapitel",
21 | "You aborted the media playback": "Sie haben die Videowiedergabe abgebrochen.",
22 | "A network error caused the media download to fail part-way.": "Der Videodownload ist aufgrund eines Netzwerkfehlers fehlgeschlagen.",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Das Video konnte nicht geladen werden, da entweder ein Server- oder Netzwerkfehler auftrat oder das Format nicht unterstützt wird.",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Die Videowiedergabe wurde entweder wegen eines Problems mit einem beschädigten Video oder wegen verwendeten Funktionen, die vom Browser nicht unterstützt werden, abgebrochen.",
25 | "No compatible source was found for this media.": "Für dieses Video wurde keine kompatible Quelle gefunden.",
26 | "Play Video": "Video abspielen",
27 | "Close": "Schließen",
28 | "Modal Window": "Modales Fenster",
29 | "This is a modal window": "Dies ist ein modales Fenster",
30 | "This modal can be closed by pressing the Escape key or activating the close button.": "Durch Drücken der Esc-Taste bzw. Betätigung der Schaltfläche \"Schließen\" wird dieses modale Fenster geschlossen.",
31 | ", opens captions settings dialog": ", öffnet Einstellungen für Untertitel",
32 | ", opens subtitles settings dialog": ", öffnet Einstellungen für Untertitel",
33 | ", selected": " (ausgewählt)"
34 | });
--------------------------------------------------------------------------------
/WebRoot/player/lang/el.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("el",{
2 | "Play": "Aναπαραγωγή",
3 | "Pause": "Παύση",
4 | "Current Time": "Τρέχων χρόνος",
5 | "Duration Time": "Συνολικός χρόνος",
6 | "Remaining Time": "Υπολοιπόμενος χρόνος",
7 | "Stream Type": "Τύπος ροής",
8 | "LIVE": "ΖΩΝΤΑΝΑ",
9 | "Loaded": "Φόρτωση επιτυχής",
10 | "Progress": "Πρόοδος",
11 | "Fullscreen": "Πλήρης οθόνη",
12 | "Non-Fullscreen": "Έξοδος από πλήρη οθόνη",
13 | "Mute": "Σίγαση",
14 | "Unmute": "Kατάργηση σίγασης",
15 | "Playback Rate": "Ρυθμός αναπαραγωγής",
16 | "Subtitles": "Υπότιτλοι",
17 | "subtitles off": "απόκρυψη υπότιτλων",
18 | "Captions": "Λεζάντες",
19 | "captions off": "απόκρυψη λεζάντων",
20 | "Chapters": "Κεφάλαια",
21 | "You aborted the media playback": "Ακυρώσατε την αναπαραγωγή",
22 | "A network error caused the media download to fail part-way.": "Ένα σφάλμα δικτύου προκάλεσε την αποτυχία μεταφόρτωσης του αρχείου προς αναπαραγωγή.",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Το αρχείο προς αναπαραγωγή δεν ήταν δυνατό να φορτωθεί είτε γιατί υπήρξε σφάλμα στον διακομιστή ή το δίκτυο, είτε γιατί ο τύπος του αρχείου δεν υποστηρίζεται.",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Η αναπαραγωγή ακυρώθηκε είτε λόγω κατεστραμμένου αρχείου, είτε γιατί το αρχείο απαιτεί λειτουργίες που δεν υποστηρίζονται από το πρόγραμμα περιήγησης που χρησιμοποιείτε.",
25 | "No compatible source was found for this media.": "Δεν βρέθηκε συμβατή πηγή αναπαραγωγής για το συγκεκριμένο αρχείο.",
26 | "Play video": "Αναπαραγωγή βίντεο",
27 | "Close": "Κλείσιμο",
28 | "Modal Window": "Aναδυόμενο παράθυρο",
29 | "This is a modal window": "Το παρών είναι ένα αναδυόμενο παράθυρο",
30 | "This modal can be closed by pressing the Escape key or activating the close button.": "Αυτό το παράθυρο μπορεί να εξαφανιστεί πατώντας το πλήκτρο Escape ή πατώντας το κουμπί κλεισίματος.",
31 | ", opens captions settings dialog": ", εμφανίζει τις ρυθμίσεις για τις λεζάντες",
32 | ", opens subtitles settings dialog": ", εμφανίζει τις ρυθμίσεις για τους υπότιτλους",
33 | ", selected": ", επιλεγμένο"
34 | });
--------------------------------------------------------------------------------
/WebRoot/player/lang/en.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("en",{
2 | "Play": "Play",
3 | "Pause": "Pause",
4 | "Current Time": "Current Time",
5 | "Duration Time": "Duration Time",
6 | "Remaining Time": "Remaining Time",
7 | "Stream Type": "Stream Type",
8 | "LIVE": "LIVE",
9 | "Loaded": "Loaded",
10 | "Progress": "Progress",
11 | "Fullscreen": "Fullscreen",
12 | "Non-Fullscreen": "Non-Fullscreen",
13 | "Mute": "Mute",
14 | "Unmute": "Unmute",
15 | "Playback Rate": "Playback Rate",
16 | "Subtitles": "Subtitles",
17 | "subtitles off": "subtitles off",
18 | "Captions": "Captions",
19 | "captions off": "captions off",
20 | "Chapters": "Chapters",
21 | "Descriptions": "Descriptions",
22 | "descriptions off": "descriptions off",
23 | "You aborted the media playback": "You aborted the media playback",
24 | "A network error caused the media download to fail part-way.": "A network error caused the media download to fail part-way.",
25 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "The media could not be loaded, either because the server or network failed or because the format is not supported.",
26 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.",
27 | "No compatible source was found for this media.": "No compatible source was found for this media.",
28 | "Play Video": "Play Video",
29 | "Close": "Close",
30 | "Modal Window": "Modal Window",
31 | "This is a modal window": "This is a modal window",
32 | "This modal can be closed by pressing the Escape key or activating the close button.": "This modal can be closed by pressing the Escape key or activating the close button.",
33 | ", opens captions settings dialog": ", opens captions settings dialog",
34 | ", opens subtitles settings dialog": ", opens subtitles settings dialog",
35 | ", opens descriptions settings dialog": ", opens descriptions settings dialog",
36 | ", selected": ", selected"
37 | });
--------------------------------------------------------------------------------
/WebRoot/player/lang/es.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("es",{
2 | "Play": "Reproducción",
3 | "Pause": "Pausa",
4 | "Current Time": "Tiempo reproducido",
5 | "Duration Time": "Duración total",
6 | "Remaining Time": "Tiempo restante",
7 | "Stream Type": "Tipo de secuencia",
8 | "LIVE": "DIRECTO",
9 | "Loaded": "Cargado",
10 | "Progress": "Progreso",
11 | "Fullscreen": "Pantalla completa",
12 | "Non-Fullscreen": "Pantalla no completa",
13 | "Mute": "Silenciar",
14 | "Unmute": "No silenciado",
15 | "Playback Rate": "Velocidad de reproducción",
16 | "Subtitles": "Subtítulos",
17 | "subtitles off": "Subtítulos desactivados",
18 | "Captions": "Subtítulos especiales",
19 | "captions off": "Subtítulos especiales desactivados",
20 | "Chapters": "Capítulos",
21 | "You aborted the media playback": "Ha interrumpido la reproducción del vídeo.",
22 | "A network error caused the media download to fail part-way.": "Un error de red ha interrumpido la descarga del vídeo.",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "No se ha podido cargar el vídeo debido a un fallo de red o del servidor o porque el formato es incompatible.",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "La reproducción de vídeo se ha interrumpido por un problema de corrupción de datos o porque el vídeo precisa funciones que su navegador no ofrece.",
25 | "No compatible source was found for this media.": "No se ha encontrado ninguna fuente compatible con este vídeo."
26 | });
--------------------------------------------------------------------------------
/WebRoot/player/lang/fa.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("fa",{
2 | "Play": "پخش",
3 | "Pause": "وقفه",
4 | "Current Time": "زمان کنونی",
5 | "Duration Time": "مدت زمان",
6 | "Remaining Time": "زمان باقیمانده",
7 | "Stream Type": "نوع استریم",
8 | "LIVE": "زنده",
9 | "Loaded": "فراخوانی شده",
10 | "Progress": "پیشرفت",
11 | "Fullscreen": "تمام صفحه",
12 | "Non-Fullscreen": "نمایش عادی",
13 | "Mute": "بی صدا",
14 | "Unmute": "بهمراه صدا",
15 | "Playback Rate": "سرعت پخش",
16 | "Subtitles": "زیرنویس",
17 | "subtitles off": "بدون زیرنویس",
18 | "Captions": "عنوان",
19 | "captions off": "بدون عنوان",
20 | "Chapters": "فصل",
21 | "You aborted the media playback": "شما پخش را متوقف کردید.",
22 | "A network error caused the media download to fail part-way.": "مشکل در دریافت ویدئو ...",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "فرمت پشتیبانی نمیشود یا خطایی روی داده است.",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "مشکل در دریافت ویدئو ...",
25 | "No compatible source was found for this media.": "هیچ ورودی ای برای این رسانه شناسایی نشد."
26 | });
--------------------------------------------------------------------------------
/WebRoot/player/lang/fi.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("fi",{
2 | "Play": "Toisto",
3 | "Pause": "Tauko",
4 | "Current Time": "Tämänhetkinen aika",
5 | "Duration Time": "Kokonaisaika",
6 | "Remaining Time": "Jäljellä oleva aika",
7 | "Stream Type": "Lähetystyyppi",
8 | "LIVE": "LIVE",
9 | "Loaded": "Ladattu",
10 | "Progress": "Edistyminen",
11 | "Fullscreen": "Koko näyttö",
12 | "Non-Fullscreen": "Koko näyttö pois",
13 | "Mute": "Ääni pois",
14 | "Unmute": "Ääni päällä",
15 | "Playback Rate": "Toistonopeus",
16 | "Subtitles": "Tekstitys",
17 | "subtitles off": "Tekstitys pois",
18 | "Captions": "Tekstitys",
19 | "captions off": "Tekstitys pois",
20 | "Chapters": "Kappaleet",
21 | "You aborted the media playback": "Olet keskeyttänyt videotoiston.",
22 | "A network error caused the media download to fail part-way.": "Verkkovirhe keskeytti videon latauksen.",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Videon lataus ei onnistunut joko palvelin- tai verkkovirheestä tai väärästä formaatista johtuen.",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Videon toisto keskeytyi, koska media on vaurioitunut tai käyttää käyttää toimintoja, joita selaimesi ei tue.",
25 | "No compatible source was found for this media.": "Tälle videolle ei löytynyt yhteensopivaa lähdettä."
26 | });
--------------------------------------------------------------------------------
/WebRoot/player/lang/fr.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("fr",{
2 | "Play": "Lecture",
3 | "Pause": "Pause",
4 | "Current Time": "Temps actuel",
5 | "Duration Time": "Durée",
6 | "Remaining Time": "Temps restant",
7 | "Stream Type": "Type de flux",
8 | "LIVE": "EN DIRECT",
9 | "Loaded": "Chargé",
10 | "Progress": "Progression",
11 | "Fullscreen": "Plein écran",
12 | "Non-Fullscreen": "Fenêtré",
13 | "Mute": "Sourdine",
14 | "Unmute": "Son activé",
15 | "Playback Rate": "Vitesse de lecture",
16 | "Subtitles": "Sous-titres",
17 | "subtitles off": "Sous-titres désactivés",
18 | "Captions": "Sous-titres",
19 | "captions off": "Sous-titres désactivés",
20 | "Chapters": "Chapitres",
21 | "You aborted the media playback": "Vous avez interrompu la lecture de la vidéo.",
22 | "A network error caused the media download to fail part-way.": "Une erreur de réseau a interrompu le téléchargement de la vidéo.",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Cette vidéo n'a pas pu être chargée, soit parce que le serveur ou le réseau a échoué ou parce que le format n'est pas reconnu.",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "La lecture de la vidéo a été interrompue à cause d'un problème de corruption ou parce que la vidéo utilise des fonctionnalités non prises en charge par votre navigateur.",
25 | "No compatible source was found for this media.": "Aucune source compatible n'a été trouvée pour cette vidéo."
26 | });
--------------------------------------------------------------------------------
/WebRoot/player/lang/hr.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("hr",{
2 | "Play": "Pusti",
3 | "Pause": "Pauza",
4 | "Current Time": "Trenutno vrijeme",
5 | "Duration Time": "Vrijeme trajanja",
6 | "Remaining Time": "Preostalo vrijeme",
7 | "Stream Type": "Način strimovanja",
8 | "LIVE": "UŽIVO",
9 | "Loaded": "Učitan",
10 | "Progress": "Progres",
11 | "Fullscreen": "Puni ekran",
12 | "Non-Fullscreen": "Mali ekran",
13 | "Mute": "Prigušen",
14 | "Unmute": "Ne-prigušen",
15 | "Playback Rate": "Stopa reprodukcije",
16 | "Subtitles": "Podnaslov",
17 | "subtitles off": "Podnaslov deaktiviran",
18 | "Captions": "Titlovi",
19 | "captions off": "Titlovi deaktivirani",
20 | "Chapters": "Poglavlja",
21 | "You aborted the media playback": "Isključili ste reprodukciju videa.",
22 | "A network error caused the media download to fail part-way.": "Video se prestao preuzimati zbog greške na mreži.",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video se ne može reproducirati zbog servera, greške u mreži ili je format ne podržan.",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Reprodukcija videa je zaustavljenja zbog greške u formatu ili zbog verzije vašeg pretraživača.",
25 | "No compatible source was found for this media.": "Nije nađen nijedan kompatibilan izvor ovog videa."
26 | });
--------------------------------------------------------------------------------
/WebRoot/player/lang/hu.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("hu",{
2 | "Play": "Lejátszás",
3 | "Pause": "Szünet",
4 | "Current Time": "Aktuális időpont",
5 | "Duration Time": "Hossz",
6 | "Remaining Time": "Hátralévő idő",
7 | "Stream Type": "Adatfolyam típusa",
8 | "LIVE": "ÉLŐ",
9 | "Loaded": "Betöltve",
10 | "Progress": "Állapot",
11 | "Fullscreen": "Teljes képernyő",
12 | "Non-Fullscreen": "Normál méret",
13 | "Mute": "Némítás",
14 | "Unmute": "Némítás kikapcsolva",
15 | "Playback Rate": "Lejátszási sebesség",
16 | "Subtitles": "Feliratok",
17 | "subtitles off": "Feliratok kikapcsolva",
18 | "Captions": "Magyarázó szöveg",
19 | "captions off": "Magyarázó szöveg kikapcsolva",
20 | "Chapters": "Fejezetek",
21 | "You aborted the media playback": "Leállította a lejátszást",
22 | "A network error caused the media download to fail part-way.": "Hálózati hiba miatt a videó részlegesen töltődött le.",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "A videó nem tölthető be hálózati vagy kiszolgálói hiba miatt, vagy a formátuma nem támogatott.",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "A lejátszás adatsérülés miatt leállt, vagy a videó egyes tulajdonságait a böngészője nem támogatja.",
25 | "No compatible source was found for this media.": "Nincs kompatibilis forrás ehhez a videóhoz."
26 | });
--------------------------------------------------------------------------------
/WebRoot/player/lang/it.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("it",{
2 | "Play": "Play",
3 | "Pause": "Pausa",
4 | "Current Time": "Orario attuale",
5 | "Duration Time": "Durata",
6 | "Remaining Time": "Tempo rimanente",
7 | "Stream Type": "Tipo del Streaming",
8 | "LIVE": "LIVE",
9 | "Loaded": "Caricato",
10 | "Progress": "Stato",
11 | "Fullscreen": "Schermo intero",
12 | "Non-Fullscreen": "Chiudi schermo intero",
13 | "Mute": "Muto",
14 | "Unmute": "Audio",
15 | "Playback Rate": "Tasso di riproduzione",
16 | "Subtitles": "Sottotitoli",
17 | "subtitles off": "Senza sottotitoli",
18 | "Captions": "Sottotitoli non udenti",
19 | "captions off": "Senza sottotitoli non udenti",
20 | "Chapters": "Capitolo",
21 | "You aborted the media playback": "La riproduzione del filmato è stata interrotta.",
22 | "A network error caused the media download to fail part-way.": "Il download del filmato è stato interrotto a causa di un problema rete.",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Il filmato non può essere caricato a causa di un errore nel server o nella rete o perché il formato non viene supportato.",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "La riproduzione del filmato è stata interrotta a causa di un file danneggiato o per l’utilizzo di impostazioni non supportate dal browser.",
25 | "No compatible source was found for this media.": "Non ci sono fonti compatibili per questo filmato."
26 | });
--------------------------------------------------------------------------------
/WebRoot/player/lang/ja.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("ja",{
2 | "Play": "再生",
3 | "Pause": "一時停止",
4 | "Current Time": "現在の時間",
5 | "Duration Time": "長さ",
6 | "Remaining Time": "残りの時間",
7 | "Stream Type": "ストリームの種類",
8 | "LIVE": "ライブ",
9 | "Loaded": "ロード済み",
10 | "Progress": "進行状況",
11 | "Fullscreen": "フルスクリーン",
12 | "Non-Fullscreen": "フルスクリーン以外",
13 | "Mute": "ミュート",
14 | "Unmute": "ミュート解除",
15 | "Playback Rate": "再生レート",
16 | "Subtitles": "サブタイトル",
17 | "subtitles off": "サブタイトル オフ",
18 | "Captions": "キャプション",
19 | "captions off": "キャプション オフ",
20 | "Chapters": "チャプター",
21 | "You aborted the media playback": "動画再生を中止しました",
22 | "A network error caused the media download to fail part-way.": "ネットワーク エラーにより動画のダウンロードが途中で失敗しました",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "サーバーまたはネットワークのエラー、またはフォーマットがサポートされていないため、動画をロードできませんでした",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "破損の問題、またはお使いのブラウザがサポートしていない機能が動画に使用されていたため、動画の再生が中止されました",
25 | "No compatible source was found for this media.": "この動画に対して互換性のあるソースが見つかりませんでした"
26 | });
--------------------------------------------------------------------------------
/WebRoot/player/lang/ko.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("ko",{
2 | "Play": "재생",
3 | "Pause": "일시중지",
4 | "Current Time": "현재 시간",
5 | "Duration Time": "지정 기간",
6 | "Remaining Time": "남은 시간",
7 | "Stream Type": "스트리밍 유형",
8 | "LIVE": "라이브",
9 | "Loaded": "로드됨",
10 | "Progress": "진행",
11 | "Fullscreen": "전체 화면",
12 | "Non-Fullscreen": "전체 화면 해제",
13 | "Mute": "음소거",
14 | "Unmute": "음소거 해제",
15 | "Playback Rate": "재생 비율",
16 | "Subtitles": "서브타이틀",
17 | "subtitles off": "서브타이틀 끄기",
18 | "Captions": "자막",
19 | "captions off": "자막 끄기",
20 | "Chapters": "챕터",
21 | "You aborted the media playback": "비디오 재생을 취소했습니다.",
22 | "A network error caused the media download to fail part-way.": "네트워크 오류로 인하여 비디오 일부를 다운로드하지 못 했습니다.",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "비디오를 로드할 수 없습니다. 서버 혹은 네트워크 오류 때문이거나 지원되지 않는 형식 때문일 수 있습니다.",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "비디오 재생이 취소됐습니다. 비디오가 손상되었거나 비디오가 사용하는 기능을 브라우저에서 지원하지 않는 것 같습니다.",
25 | "No compatible source was found for this media.": "비디오에 호환되지 않는 소스가 있습니다."
26 | });
--------------------------------------------------------------------------------
/WebRoot/player/lang/nb.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("nb",{
2 | "Play": "Spill",
3 | "Pause": "Pause",
4 | "Current Time": "Aktuell tid",
5 | "Duration Time": "Varighet",
6 | "Remaining Time": "Gjenstående tid",
7 | "Stream Type": "Type strøm",
8 | "LIVE": "DIREKTE",
9 | "Loaded": "Lastet inn",
10 | "Progress": "Status",
11 | "Fullscreen": "Fullskjerm",
12 | "Non-Fullscreen": "Lukk fullskjerm",
13 | "Mute": "Lyd av",
14 | "Unmute": "Lyd på",
15 | "Playback Rate": "Avspillingsrate",
16 | "Subtitles": "Undertekst på",
17 | "subtitles off": "Undertekst av",
18 | "Captions": "Undertekst for hørselshemmede på",
19 | "captions off": "Undertekst for hørselshemmede av",
20 | "Chapters": "Kapitler",
21 | "You aborted the media playback": "Du avbrøt avspillingen.",
22 | "A network error caused the media download to fail part-way.": "En nettverksfeil avbrøt nedlasting av videoen.",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Videoen kunne ikke lastes ned, på grunn av nettverksfeil eller serverfeil, eller fordi formatet ikke er støttet.",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Videoavspillingen ble avbrudt på grunn av ødelagte data eller fordi videoen ville gjøre noe som nettleseren din ikke har støtte for.",
25 | "No compatible source was found for this media.": "Fant ikke en kompatibel kilde for dette mediainnholdet."
26 | });
--------------------------------------------------------------------------------
/WebRoot/player/lang/nl.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("nl",{
2 | "Play": "Afspelen",
3 | "Pause": "Pauze",
4 | "Current Time": "Huidige tijd",
5 | "Duration Time": "Looptijd",
6 | "Remaining Time": "Resterende tijd",
7 | "Stream Type": "Streamtype",
8 | "LIVE": "LIVE",
9 | "Loaded": "Geladen",
10 | "Progress": "Status",
11 | "Fullscreen": "Volledig scherm",
12 | "Non-Fullscreen": "Geen volledig scherm",
13 | "Mute": "Geluid uit",
14 | "Unmute": "Geluid aan",
15 | "Playback Rate": "Weergavesnelheid",
16 | "Subtitles": "Ondertiteling",
17 | "subtitles off": "Ondertiteling uit",
18 | "Captions": "Ondertiteling",
19 | "captions off": "Ondertiteling uit",
20 | "Chapters": "Hoofdstukken",
21 | "You aborted the media playback": "U hebt de mediaweergave afgebroken.",
22 | "A network error caused the media download to fail part-way.": "De mediadownload is mislukt door een netwerkfout.",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "De media kon niet worden geladen, vanwege een server- of netwerkfout of doordat het formaat niet wordt ondersteund.",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "De mediaweergave is afgebroken vanwege beschadigde data of het mediabestand gebruikt functies die niet door uw browser worden ondersteund.",
25 | "No compatible source was found for this media.": "Voor deze media is geen ondersteunde bron gevonden."
26 | });
--------------------------------------------------------------------------------
/WebRoot/player/lang/nn.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("nn",{
2 | "Play": "Spel",
3 | "Pause": "Pause",
4 | "Current Time": "Aktuell tid",
5 | "Duration Time": "Varigheit",
6 | "Remaining Time": "Tid attende",
7 | "Stream Type": "Type straum",
8 | "LIVE": "DIREKTE",
9 | "Loaded": "Lasta inn",
10 | "Progress": "Status",
11 | "Fullscreen": "Fullskjerm",
12 | "Non-Fullscreen": "Stenga fullskjerm",
13 | "Mute": "Ljod av",
14 | "Unmute": "Ljod på",
15 | "Playback Rate": "Avspelingsrate",
16 | "Subtitles": "Teksting på",
17 | "subtitles off": "Teksting av",
18 | "Captions": "Teksting for høyrselshemma på",
19 | "captions off": "Teksting for høyrselshemma av",
20 | "Chapters": "Kapitel",
21 | "You aborted the media playback": "Du avbraut avspelinga.",
22 | "A network error caused the media download to fail part-way.": "Ein nettverksfeil avbraut nedlasting av videoen.",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Videoen kunne ikkje lastas ned, på grunn av ein nettverksfeil eller serverfeil, eller av di formatet ikkje er stoda.",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Videoavspelinga blei broten på grunn av øydelagde data eller av di videoen ville gjera noe som nettlesaren din ikkje stodar.",
25 | "No compatible source was found for this media.": "Fant ikke en kompatibel kilde for dette mediainnholdet."
26 | });
--------------------------------------------------------------------------------
/WebRoot/player/lang/pl.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("pl",{
2 | "Play": "Odtwarzaj",
3 | "Pause": "Pauza",
4 | "Current Time": "Aktualny czas",
5 | "Duration Time": "Czas trwania",
6 | "Remaining Time": "Pozostały czas",
7 | "Stream Type": "Typ strumienia",
8 | "LIVE": "NA ŻYWO",
9 | "Loaded": "Załadowany",
10 | "Progress": "Status",
11 | "Fullscreen": "Pełny ekran",
12 | "Non-Fullscreen": "Pełny ekran niedostępny",
13 | "Mute": "Wyłącz dźwięk",
14 | "Unmute": "Włącz dźwięk",
15 | "Playback Rate": "Szybkość odtwarzania",
16 | "Subtitles": "Napisy",
17 | "subtitles off": "Napisy wyłączone",
18 | "Captions": "Transkrypcja",
19 | "captions off": "Transkrypcja wyłączona",
20 | "Chapters": "Rozdziały",
21 | "You aborted the media playback": "Odtwarzanie zostało przerwane",
22 | "A network error caused the media download to fail part-way.": "Problemy z siecią spowodowały błąd przy pobieraniu materiału wideo.",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Materiał wideo nie może być załadowany, ponieważ wystąpił problem z siecią lub format nie jest obsługiwany",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Odtwarzanie materiału wideo zostało przerwane z powodu uszkodzonego pliku wideo lub z powodu błędu funkcji, które nie są wspierane przez przeglądarkę.",
25 | "No compatible source was found for this media.": "Dla tego materiału wideo nie znaleziono kompatybilnego źródła.",
26 | "Play video": "Odtwarzaj wideo",
27 | "Close": "Zamknij",
28 | "Modal Window": "Okno Modala",
29 | "This is a modal window": "To jest okno modala",
30 | "This modal can be closed by pressing the Escape key or activating the close button.": "Ten modal możesz zamknąć naciskając przycisk Escape albo wybierając przycisk Zamknij.",
31 | ", opens captions settings dialog": ", otwiera okno dialogowe ustawień transkrypcji",
32 | ", opens subtitles settings dialog": ", otwiera okno dialogowe napisów",
33 | ", selected": ", zaznaczone"
34 | });
--------------------------------------------------------------------------------
/WebRoot/player/lang/pt-BR.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("pt-BR",{
2 | "Play": "Tocar",
3 | "Pause": "Pause",
4 | "Current Time": "Tempo",
5 | "Duration Time": "Duração",
6 | "Remaining Time": "Tempo Restante",
7 | "Stream Type": "Tipo de Stream",
8 | "LIVE": "AO VIVO",
9 | "Loaded": "Carregado",
10 | "Progress": "Progresso",
11 | "Fullscreen": "Tela Cheia",
12 | "Non-Fullscreen": "Tela Normal",
13 | "Mute": "Mudo",
14 | "Unmute": "Habilitar Som",
15 | "Playback Rate": "Velocidade",
16 | "Subtitles": "Legendas",
17 | "subtitles off": "Sem Legendas",
18 | "Captions": "Anotações",
19 | "captions off": "Sem Anotações",
20 | "Chapters": "Capítulos",
21 | "You aborted the media playback": "Você parou a execução de vídeo.",
22 | "A network error caused the media download to fail part-way.": "Um erro na rede fez o vídeo parar parcialmente.",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "O vídeo não pode ser carregado, ou porque houve um problema com sua rede ou pelo formato do vídeo não ser suportado.",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "A Execução foi interrompida por um problema com o vídeo ou por seu navegador não dar suporte ao seu formato.",
25 | "No compatible source was found for this media.": "Não foi encontrada fonte de vídeo compatível."
26 | });
--------------------------------------------------------------------------------
/WebRoot/player/lang/ru.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("ru",{
2 | "Play": "Воспроизвести",
3 | "Pause": "Приостановить",
4 | "Current Time": "Текущее время",
5 | "Duration Time": "Продолжительность",
6 | "Remaining Time": "Оставшееся время",
7 | "Stream Type": "Тип потока",
8 | "LIVE": "ОНЛАЙН",
9 | "Loaded": "Загрузка",
10 | "Progress": "Прогресс",
11 | "Fullscreen": "Полноэкранный режим",
12 | "Non-Fullscreen": "Неполноэкранный режим",
13 | "Mute": "Без звука",
14 | "Unmute": "Со звуком",
15 | "Playback Rate": "Скорость воспроизведения",
16 | "Subtitles": "Субтитры",
17 | "subtitles off": "Субтитры выкл.",
18 | "Captions": "Подписи",
19 | "captions off": "Подписи выкл.",
20 | "Chapters": "Главы",
21 | "You aborted the media playback": "Вы прервали воспроизведение видео",
22 | "A network error caused the media download to fail part-way.": "Ошибка сети вызвала сбой во время загрузки видео.",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Невозможно загрузить видео из-за сетевого или серверного сбоя либо формат не поддерживается.",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Воспроизведение видео было приостановлено из-за повреждения либо в связи с тем, что видео использует функции, неподдерживаемые вашим браузером.",
25 | "No compatible source was found for this media.": "Совместимые источники для этого видео отсутствуют."
26 | });
--------------------------------------------------------------------------------
/WebRoot/player/lang/sr.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("sr",{
2 | "Play": "Pusti",
3 | "Pause": "Pauza",
4 | "Current Time": "Trenutno vrijeme",
5 | "Duration Time": "Vrijeme trajanja",
6 | "Remaining Time": "Preostalo vrijeme",
7 | "Stream Type": "Način strimovanja",
8 | "LIVE": "UŽIVO",
9 | "Loaded": "Učitan",
10 | "Progress": "Progres",
11 | "Fullscreen": "Puni ekran",
12 | "Non-Fullscreen": "Mali ekran",
13 | "Mute": "Prigušen",
14 | "Unmute": "Ne-prigušen",
15 | "Playback Rate": "Stopa reprodukcije",
16 | "Subtitles": "Podnaslov",
17 | "subtitles off": "Podnaslov deaktiviran",
18 | "Captions": "Titlovi",
19 | "captions off": "Titlovi deaktivirani",
20 | "Chapters": "Poglavlja",
21 | "You aborted the media playback": "Isključili ste reprodukciju videa.",
22 | "A network error caused the media download to fail part-way.": "Video se prestao preuzimati zbog greške na mreži.",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video se ne može reproducirati zbog servera, greške u mreži ili je format ne podržan.",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Reprodukcija videa je zaustavljenja zbog greške u formatu ili zbog verzije vašeg pretraživača.",
25 | "No compatible source was found for this media.": "Nije nađen nijedan kompatibilan izvor ovog videa."
26 | });
--------------------------------------------------------------------------------
/WebRoot/player/lang/sv.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("sv",{
2 | "Play": "Spela",
3 | "Pause": "Pausa",
4 | "Current Time": "Aktuell tid",
5 | "Duration Time": "Total tid",
6 | "Remaining Time": "Återstående tid",
7 | "Stream Type": "Strömningstyp",
8 | "LIVE": "LIVE",
9 | "Loaded": "Laddad",
10 | "Progress": "Förlopp",
11 | "Fullscreen": "Fullskärm",
12 | "Non-Fullscreen": "Ej fullskärm",
13 | "Mute": "Ljud av",
14 | "Unmute": "Ljud på",
15 | "Playback Rate": "Uppspelningshastighet",
16 | "Subtitles": "Text på",
17 | "subtitles off": "Text av",
18 | "Captions": "Text på",
19 | "captions off": "Text av",
20 | "Chapters": "Kapitel",
21 | "You aborted the media playback": "Du har avbrutit videouppspelningen.",
22 | "A network error caused the media download to fail part-way.": "Ett nätverksfel gjorde att nedladdningen av videon avbröts.",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Det gick inte att ladda videon, antingen på grund av ett server- eller nätverksfel, eller för att formatet inte stöds.",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Uppspelningen avbröts på grund av att videon är skadad, eller också för att videon använder funktioner som din webbläsare inte stöder.",
25 | "No compatible source was found for this media.": "Det gick inte att hitta någon kompatibel källa för den här videon."
26 | });
--------------------------------------------------------------------------------
/WebRoot/player/lang/tr.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("tr",{
2 | "Play": "Oynat",
3 | "Pause": "Duraklat",
4 | "Current Time": "Süre",
5 | "Duration Time": "Toplam Süre",
6 | "Remaining Time": "Kalan Süre",
7 | "Stream Type": "Yayın Tipi",
8 | "LIVE": "CANLI",
9 | "Loaded": "Yüklendi",
10 | "Progress": "Yükleniyor",
11 | "Fullscreen": "Tam Ekran",
12 | "Non-Fullscreen": "Küçük Ekran",
13 | "Mute": "Ses Kapa",
14 | "Unmute": "Ses Aç",
15 | "Playback Rate": "Oynatma Hızı",
16 | "Subtitles": "Altyazı",
17 | "subtitles off": "Altyazı Kapalı",
18 | "Captions": "Ek Açıklamalar",
19 | "captions off": "Ek Açıklamalar Kapalı",
20 | "Chapters": "Bölümler",
21 | "You aborted the media playback": "Video oynatmayı iptal ettiniz",
22 | "A network error caused the media download to fail part-way.": "Video indirilirken bağlantı sorunu oluştu.",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video oynatılamadı, ağ ya da sunucu hatası veya belirtilen format desteklenmiyor.",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Tarayıcınız desteklemediği için videoda hata oluştu.",
25 | "No compatible source was found for this media.": "Video için kaynak bulunamadı.",
26 | "Play Video": "Videoyu Oynat",
27 | "Close": "Kapat",
28 | "Modal Window": "Modal Penceresi",
29 | "This is a modal window": "Bu bir modal penceresidir",
30 | "This modal can be closed by pressing the Escape key or activating the close button.": "Bu modal ESC tuşuna basarak ya da kapata tıklanarak kapatılabilir.",
31 | ", opens captions settings dialog": ", ek açıklama ayarları menüsünü açar",
32 | ", opens subtitles settings dialog": ", altyazı ayarları menüsünü açar",
33 | ", selected": ", seçildi"
34 | });
--------------------------------------------------------------------------------
/WebRoot/player/lang/uk.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("uk",{
2 | "Play": "Відтворити",
3 | "Pause": "Призупинити",
4 | "Current Time": "Поточний час",
5 | "Duration Time": "Тривалість",
6 | "Remaining Time": "Час, що залишився",
7 | "Stream Type": "Тип потоку",
8 | "LIVE": "НАЖИВО",
9 | "Loaded": "Завантаження",
10 | "Progress": "Прогрес",
11 | "Fullscreen": "Повноекранний режим",
12 | "Non-Fullscreen": "Неповноекранний режим",
13 | "Mute": "Без звуку",
14 | "Unmute": "Зі звуком",
15 | "Playback Rate": "Швидкість відтворення",
16 | "Subtitles": "Субтитри",
17 | "subtitles off": "Без субтитрів",
18 | "Captions": "Підписи",
19 | "captions off": "Без підписів",
20 | "Chapters": "Розділи",
21 | "You aborted the media playback": "Ви припинили відтворення відео",
22 | "A network error caused the media download to fail part-way.": "Помилка мережі викликала збій під час завантаження відео.",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Неможливо завантажити відео через мережевий чи серверний збій або формат не підтримується.",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Відтворення відео було припинено через пошкодження або у зв'язку з тим, що відео використовує функції, які не підтримуються вашим браузером.",
25 | "No compatible source was found for this media.": "Сумісні джерела для цього відео відсутні."
26 | });
--------------------------------------------------------------------------------
/WebRoot/player/lang/vi.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("vi",{
2 | "Play": "Phát",
3 | "Pause": "Tạm dừng",
4 | "Current Time": "Thời gian hiện tại",
5 | "Duration Time": "Độ dài",
6 | "Remaining Time": "Thời gian còn lại",
7 | "Stream Type": "Kiểu Stream",
8 | "LIVE": "TRỰC TIẾP",
9 | "Loaded": "Đã tải",
10 | "Progress": "Tiến trình",
11 | "Fullscreen": "Toàn màn hình",
12 | "Non-Fullscreen": "Thoát toàn màn hình",
13 | "Mute": "Tắt tiếng",
14 | "Unmute": "Bật âm thanh",
15 | "Playback Rate": "Tốc độ phát",
16 | "Subtitles": "Phụ đề",
17 | "subtitles off": "Tắt phụ đề",
18 | "Captions": "Chú thích",
19 | "captions off": "Tắt chú thích",
20 | "Chapters": "Chương",
21 | "You aborted the media playback": "Bạn đã hủy việc phát media.",
22 | "A network error caused the media download to fail part-way.": "Một lỗi mạng dẫn đến việc tải media bị lỗi.",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video không tải được, mạng hay server có lỗi hoặc định dạng không được hỗ trợ.",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Phát media đã bị hủy do một sai lỗi hoặc media sử dụng những tính năng trình duyệt không hỗ trợ.",
25 | "No compatible source was found for this media.": "Không có nguồn tương thích cho media này."
26 | });
--------------------------------------------------------------------------------
/WebRoot/player/lang/zh-CN.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("zh-CN",{
2 | "Play": "播放",
3 | "Pause": "暂停",
4 | "Current Time": "当前时间",
5 | "Duration Time": "时长",
6 | "Remaining Time": "剩余时间",
7 | "Stream Type": "媒体流类型",
8 | "LIVE": "直播",
9 | "Loaded": "加载完毕",
10 | "Progress": "进度",
11 | "Fullscreen": "全屏",
12 | "Non-Fullscreen": "退出全屏",
13 | "Mute": "静音",
14 | "Unmute": "取消静音",
15 | "Playback Rate": "播放码率",
16 | "Subtitles": "字幕",
17 | "subtitles off": "字幕关闭",
18 | "Captions": "内嵌字幕",
19 | "captions off": "内嵌字幕关闭",
20 | "Chapters": "节目段落",
21 | "You aborted the media playback": "视频播放被终止",
22 | "A network error caused the media download to fail part-way.": "网络错误导致视频下载中途失败。",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "视频因格式不支持或者服务器或网络的问题无法加载。",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "由于视频文件损坏或是该视频使用了你的浏览器不支持的功能,播放终止。",
25 | "No compatible source was found for this media.": "无法找到此视频兼容的源。",
26 | "The media is encrypted and we do not have the keys to decrypt it.": "视频已加密,无法解密。"
27 | });
--------------------------------------------------------------------------------
/WebRoot/player/lang/zh-TW.js:
--------------------------------------------------------------------------------
1 | videojs.addLanguage("zh-TW",{
2 | "Play": "播放",
3 | "Pause": "暫停",
4 | "Current Time": "目前時間",
5 | "Duration Time": "總共時間",
6 | "Remaining Time": "剩餘時間",
7 | "Stream Type": "串流類型",
8 | "LIVE": "直播",
9 | "Loaded": "載入完畢",
10 | "Progress": "進度",
11 | "Fullscreen": "全螢幕",
12 | "Non-Fullscreen": "退出全螢幕",
13 | "Mute": "靜音",
14 | "Unmute": "取消靜音",
15 | "Playback Rate": " 播放速率",
16 | "Subtitles": "字幕",
17 | "subtitles off": "關閉字幕",
18 | "Captions": "內嵌字幕",
19 | "captions off": "關閉內嵌字幕",
20 | "Chapters": "章節",
21 | "You aborted the media playback": "影片播放已終止",
22 | "A network error caused the media download to fail part-way.": "網路錯誤導致影片下載失敗。",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "影片因格式不支援或者伺服器或網路的問題無法載入。",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "由於影片檔案損毀或是該影片使用了您的瀏覽器不支援的功能,播放終止。",
25 | "No compatible source was found for this media.": "無法找到相容此影片的來源。",
26 | "The media is encrypted and we do not have the keys to decrypt it.": "影片已加密,無法解密。"
27 | });
--------------------------------------------------------------------------------
/WebRoot/player/video-js.swf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/player/video-js.swf
--------------------------------------------------------------------------------
/WebRoot/player/videojs-ie8.min.js:
--------------------------------------------------------------------------------
1 | !function(a,b){"undefined"==typeof a.HTMLVideoElement&&(b.createElement("video"),b.createElement("audio"),b.createElement("track")),function(a,b){"use strict";"function"==typeof define&&define.amd?define(b):"object"==typeof exports?module.exports=b():a.returnExports=b()}(this,function(){var b,c=Array,d=c.prototype,e=Object,f=e.prototype,g=Function.prototype,h=String,i=h.prototype,j=Number,k=j.prototype,l=d.slice,m=d.splice,n=d.push,o=d.unshift,p=d.concat,q=g.call,r=g.apply,s=Math.max,t=Math.min,u=f.toString,v="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag,w=Function.prototype.toString,x=function(a){try{return w.call(a),!0}catch(b){return!1}},y="[object Function]",z="[object GeneratorFunction]";b=function(a){if("function"!=typeof a)return!1;if(v)return x(a);var b=u.call(a);return b===y||b===z};var A,B=RegExp.prototype.exec,C=function(a){try{return B.call(a),!0}catch(b){return!1}},D="[object RegExp]";A=function(a){return"object"!=typeof a?!1:v?C(a):u.call(a)===D};var E,F=String.prototype.valueOf,G=function(a){try{return F.call(a),!0}catch(b){return!1}},H="[object String]";E=function(a){return"string"==typeof a?!0:"object"!=typeof a?!1:v?G(a):u.call(a)===H};var I=e.defineProperty&&function(){try{var a={};e.defineProperty(a,"x",{enumerable:!1,value:a});for(var b in a)return!1;return a.x===a}catch(c){return!1}}(),J=function(a){var b;return b=I?function(a,b,c,d){!d&&b in a||e.defineProperty(a,b,{configurable:!0,enumerable:!1,writable:!0,value:c})}:function(a,b,c,d){!d&&b in a||(a[b]=c)},function(c,d,e){for(var f in d)a.call(d,f)&&b(c,f,d[f],e)}}(f.hasOwnProperty),K=function(a){var b=typeof a;return null===a||"object"!==b&&"function"!==b},L=j.isNaN||function(a){return a!==a},M={ToInteger:function(a){var b=+a;return L(b)?b=0:0!==b&&b!==1/0&&b!==-(1/0)&&(b=(b>0||-1)*Math.floor(Math.abs(b))),b},ToPrimitive:function(a){var c,d,e;if(K(a))return a;if(d=a.valueOf,b(d)&&(c=d.call(a),K(c)))return c;if(e=a.toString,b(e)&&(c=e.call(a),K(c)))return c;throw new TypeError},ToObject:function(a){if(null==a)throw new TypeError("can't convert "+a+" to object");return e(a)},ToUint32:function(a){return a>>>0}},N=function(){};J(g,{bind:function(a){var c=this;if(!b(c))throw new TypeError("Function.prototype.bind called on incompatible "+c);for(var d,f=l.call(arguments,1),g=function(){if(this instanceof d){var b=c.apply(this,p.call(f,l.call(arguments)));return e(b)===b?b:this}return c.apply(a,p.call(f,l.call(arguments)))},h=s(0,c.length-f.length),i=[],j=0;h>j;j++)n.call(i,"$"+j);return d=Function("binder","return function ("+i.join(",")+"){ return binder.apply(this, arguments); }")(g),c.prototype&&(N.prototype=c.prototype,d.prototype=new N,N.prototype=null),d}});var O=q.bind(f.hasOwnProperty),P=q.bind(f.toString),Q=q.bind(l),R=r.bind(l),S=q.bind(i.slice),T=q.bind(i.split),U=q.bind(i.indexOf),V=q.bind(n),W=q.bind(f.propertyIsEnumerable),X=q.bind(d.sort),Y=c.isArray||function(a){return"[object Array]"===P(a)},Z=1!==[].unshift(0);J(d,{unshift:function(){return o.apply(this,arguments),this.length}},Z),J(c,{isArray:Y});var $=e("a"),_="a"!==$[0]||!(0 in $),aa=function(a){var b=!0,c=!0,d=!1;if(a)try{a.call("foo",function(a,c,d){"object"!=typeof d&&(b=!1)}),a.call([1],function(){"use strict";c="string"==typeof this},"x")}catch(e){d=!0}return!!a&&!d&&b&&c};J(d,{forEach:function(a){var c,d=M.ToObject(this),e=_&&E(this)?T(this,""):d,f=-1,g=M.ToUint32(e.length);if(arguments.length>1&&(c=arguments[1]),!b(a))throw new TypeError("Array.prototype.forEach callback must be a function");for(;++f1&&(d=arguments[1]),!b(a))throw new TypeError("Array.prototype.map callback must be a function");for(var i=0;g>i;i++)i in f&&("undefined"==typeof d?h[i]=a(f[i],i,e):h[i]=a.call(d,f[i],i,e));return h}},!aa(d.map)),J(d,{filter:function(a){var c,d,e=M.ToObject(this),f=_&&E(this)?T(this,""):e,g=M.ToUint32(f.length),h=[];if(arguments.length>1&&(d=arguments[1]),!b(a))throw new TypeError("Array.prototype.filter callback must be a function");for(var i=0;g>i;i++)i in f&&(c=f[i],("undefined"==typeof d?a(c,i,e):a.call(d,c,i,e))&&V(h,c));return h}},!aa(d.filter)),J(d,{every:function(a){var c,d=M.ToObject(this),e=_&&E(this)?T(this,""):d,f=M.ToUint32(e.length);if(arguments.length>1&&(c=arguments[1]),!b(a))throw new TypeError("Array.prototype.every callback must be a function");for(var g=0;f>g;g++)if(g in e&&!("undefined"==typeof c?a(e[g],g,d):a.call(c,e[g],g,d)))return!1;return!0}},!aa(d.every)),J(d,{some:function(a){var c,d=M.ToObject(this),e=_&&E(this)?T(this,""):d,f=M.ToUint32(e.length);if(arguments.length>1&&(c=arguments[1]),!b(a))throw new TypeError("Array.prototype.some callback must be a function");for(var g=0;f>g;g++)if(g in e&&("undefined"==typeof c?a(e[g],g,d):a.call(c,e[g],g,d)))return!0;return!1}},!aa(d.some));var ba=!1;d.reduce&&(ba="object"==typeof d.reduce.call("es5",function(a,b,c,d){return d})),J(d,{reduce:function(a){var c=M.ToObject(this),d=_&&E(this)?T(this,""):c,e=M.ToUint32(d.length);if(!b(a))throw new TypeError("Array.prototype.reduce callback must be a function");if(0===e&&1===arguments.length)throw new TypeError("reduce of empty array with no initial value");var f,g=0;if(arguments.length>=2)f=arguments[1];else for(;;){if(g in d){f=d[g++];break}if(++g>=e)throw new TypeError("reduce of empty array with no initial value")}for(;e>g;g++)g in d&&(f=a(f,d[g],g,c));return f}},!ba);var ca=!1;d.reduceRight&&(ca="object"==typeof d.reduceRight.call("es5",function(a,b,c,d){return d})),J(d,{reduceRight:function(a){var c=M.ToObject(this),d=_&&E(this)?T(this,""):c,e=M.ToUint32(d.length);if(!b(a))throw new TypeError("Array.prototype.reduceRight callback must be a function");if(0===e&&1===arguments.length)throw new TypeError("reduceRight of empty array with no initial value");var f,g=e-1;if(arguments.length>=2)f=arguments[1];else for(;;){if(g in d){f=d[g--];break}if(--g<0)throw new TypeError("reduceRight of empty array with no initial value")}if(0>g)return f;do g in d&&(f=a(f,d[g],g,c));while(g--);return f}},!ca);var da=d.indexOf&&-1!==[0,1].indexOf(1,2);J(d,{indexOf:function(a){var b=_&&E(this)?T(this,""):M.ToObject(this),c=M.ToUint32(b.length);if(0===c)return-1;var d=0;for(arguments.length>1&&(d=M.ToInteger(arguments[1])),d=d>=0?d:s(0,c+d);c>d;d++)if(d in b&&b[d]===a)return d;return-1}},da);var ea=d.lastIndexOf&&-1!==[0,1].lastIndexOf(0,-3);J(d,{lastIndexOf:function(a){var b=_&&E(this)?T(this,""):M.ToObject(this),c=M.ToUint32(b.length);if(0===c)return-1;var d=c-1;for(arguments.length>1&&(d=t(d,M.ToInteger(arguments[1]))),d=d>=0?d:c-Math.abs(d);d>=0;d--)if(d in b&&a===b[d])return d;return-1}},ea);var fa=function(){var a=[1,2],b=a.splice();return 2===a.length&&Y(b)&&0===b.length}();J(d,{splice:function(a,b){return 0===arguments.length?[]:m.apply(this,arguments)}},!fa);var ga=function(){var a={};return d.splice.call(a,0,0,1),1===a.length}();J(d,{splice:function(a,b){if(0===arguments.length)return[];var c=arguments;return this.length=s(M.ToInteger(this.length),0),arguments.length>0&&"number"!=typeof b&&(c=Q(arguments),c.length<2?V(c,this.length-a):c[1]=M.ToInteger(b)),m.apply(this,c)}},!ga);var ha=function(){var a=new c(1e5);return a[8]="x",a.splice(1,1),7===a.indexOf("x")}(),ia=function(){var a=256,b=[];return b[a]="a",b.splice(a+1,0,"b"),"a"===b[a]}();J(d,{splice:function(a,b){for(var c,d=M.ToObject(this),e=[],f=M.ToUint32(d.length),g=M.ToInteger(a),i=0>g?s(f+g,0):t(g,f),j=t(s(M.ToInteger(b),0),f-i),k=0;j>k;)c=h(i+k),O(d,c)&&(e[k]=d[c]),k+=1;var l,m=Q(arguments,2),n=m.length;if(j>n){for(k=i;f-j>k;)c=h(k+j),l=h(k+n),O(d,c)?d[l]=d[c]:delete d[l],k+=1;for(k=f;k>f-j+n;)delete d[k-1],k-=1}else if(n>j)for(k=f-j;k>i;)c=h(k+j-1),l=h(k+n-1),O(d,c)?d[l]=d[c]:delete d[l],k-=1;k=i;for(var o=0;o=0&&!Y(a)&&b(a.callee)},Ea=Ca(arguments)?Ca:Da;J(e,{keys:function(a){var c=b(a),d=Ea(a),e=null!==a&&"object"==typeof a,f=e&&E(a);if(!e&&!c&&!d)throw new TypeError("Object.keys called on a non-object");var g=[],i=ua&&c;if(f&&va||d)for(var j=0;jm;m++){var n=Aa[m];l&&"constructor"===n||!O(a,n)||V(g,n)}return g}});var Fa=e.keys&&function(){return 2===e.keys(arguments).length}(1,2),Ga=e.keys&&function(){var a=e.keys(arguments);return 1!==arguments.length||1!==a.length||1!==a[0]}(1),Ha=e.keys;J(e,{keys:function(a){return Ha(Ea(a)?Q(a):a)}},!Fa||Ga);var Ia,Ja,Ka=0!==new Date(-0xc782b5b342b24).getUTCMonth(),La=new Date(-0x55d318d56a724),Ma=new Date(14496624e5),Na="Mon, 01 Jan -45875 11:59:59 GMT"!==La.toUTCString(),Oa=La.getTimezoneOffset();-720>Oa?(Ia="Tue Jan 02 -45875"!==La.toDateString(),Ja=!/^Thu Dec 10 2015 \d\d:\d\d:\d\d GMT[-\+]\d\d\d\d(?: |$)/.test(Ma.toString())):(Ia="Mon Jan 01 -45875"!==La.toDateString(),Ja=!/^Wed Dec 09 2015 \d\d:\d\d:\d\d GMT[-\+]\d\d\d\d(?: |$)/.test(Ma.toString()));var Pa=q.bind(Date.prototype.getFullYear),Qa=q.bind(Date.prototype.getMonth),Ra=q.bind(Date.prototype.getDate),Sa=q.bind(Date.prototype.getUTCFullYear),Ta=q.bind(Date.prototype.getUTCMonth),Ua=q.bind(Date.prototype.getUTCDate),Va=q.bind(Date.prototype.getUTCDay),Wa=q.bind(Date.prototype.getUTCHours),Xa=q.bind(Date.prototype.getUTCMinutes),Ya=q.bind(Date.prototype.getUTCSeconds),Za=q.bind(Date.prototype.getUTCMilliseconds),$a=["Sun","Mon","Tue","Wed","Thu","Fri"],_a=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],ab=function(a,b){return Ra(new Date(b,a,0))};J(Date.prototype,{getFullYear:function(){if(!(this&&this instanceof Date))throw new TypeError("this is not a Date object.");var a=Pa(this);return 0>a&&Qa(this)>11?a+1:a},getMonth:function(){if(!(this&&this instanceof Date))throw new TypeError("this is not a Date object.");var a=Pa(this),b=Qa(this);return 0>a&&b>11?0:b},getDate:function(){if(!(this&&this instanceof Date))throw new TypeError("this is not a Date object.");var a=Pa(this),b=Qa(this),c=Ra(this);if(0>a&&b>11){if(12===b)return c;var d=ab(0,a+1);return d-c+1}return c},getUTCFullYear:function(){if(!(this&&this instanceof Date))throw new TypeError("this is not a Date object.");var a=Sa(this);return 0>a&&Ta(this)>11?a+1:a},getUTCMonth:function(){if(!(this&&this instanceof Date))throw new TypeError("this is not a Date object.");var a=Sa(this),b=Ta(this);return 0>a&&b>11?0:b},getUTCDate:function(){if(!(this&&this instanceof Date))throw new TypeError("this is not a Date object.");var a=Sa(this),b=Ta(this),c=Ua(this);if(0>a&&b>11){if(12===b)return c;var d=ab(0,a+1);return d-c+1}return c}},Ka),J(Date.prototype,{toUTCString:function(){if(!(this&&this instanceof Date))throw new TypeError("this is not a Date object.");var a=Va(this),b=Ua(this),c=Ta(this),d=Sa(this),e=Wa(this),f=Xa(this),g=Ya(this);return $a[a]+", "+(10>b?"0"+b:b)+" "+_a[c]+" "+d+" "+(10>e?"0"+e:e)+":"+(10>f?"0"+f:f)+":"+(10>g?"0"+g:g)+" GMT"}},Ka||Na),J(Date.prototype,{toDateString:function(){if(!(this&&this instanceof Date))throw new TypeError("this is not a Date object.");var a=this.getDay(),b=this.getDate(),c=this.getMonth(),d=this.getFullYear();return $a[a]+" "+_a[c]+" "+(10>b?"0"+b:b)+" "+d}},Ka||Ia),(Ka||Ja)&&(Date.prototype.toString=function(){if(!(this&&this instanceof Date))throw new TypeError("this is not a Date object.");var a=this.getDay(),b=this.getDate(),c=this.getMonth(),d=this.getFullYear(),e=this.getHours(),f=this.getMinutes(),g=this.getSeconds(),h=this.getTimezoneOffset(),i=Math.floor(Math.abs(h)/60),j=Math.floor(Math.abs(h)%60);return $a[a]+" "+_a[c]+" "+(10>b?"0"+b:b)+" "+d+" "+(10>e?"0"+e:e)+":"+(10>f?"0"+f:f)+":"+(10>g?"0"+g:g)+" GMT"+(h>0?"-":"+")+(10>i?"0"+i:i)+(10>j?"0"+j:j)},I&&e.defineProperty(Date.prototype,"toString",{configurable:!0,enumerable:!1,writable:!0}));var bb=-621987552e5,cb="-000001",db=Date.prototype.toISOString&&-1===new Date(bb).toISOString().indexOf(cb),eb=Date.prototype.toISOString&&"1969-12-31T23:59:59.999Z"!==new Date(-1).toISOString();J(Date.prototype,{toISOString:function(){if(!isFinite(this))throw new RangeError("Date.prototype.toISOString called on non-finite value.");var a=Sa(this),b=Ta(this);a+=Math.floor(b/12),b=(b%12+12)%12;var c=[b+1,Ua(this),Wa(this),Xa(this),Ya(this)];a=(0>a?"-":a>9999?"+":"")+S("00000"+Math.abs(a),a>=0&&9999>=a?-4:-6);for(var d=0;d=7&&j>jb){var o=Math.floor(j/jb)*jb,p=Math.floor(o/1e3);m+=p,n-=1e3*p}k=1===l&&h(c)===c?new a(b.parse(c)):l>=7?new a(c,d,e,f,g,m,n):l>=6?new a(c,d,e,f,g,m):l>=5?new a(c,d,e,f,g):l>=4?new a(c,d,e,f):l>=3?new a(c,d,e):l>=2?new a(c,d):l>=1?new a(c):new a}else k=a.apply(this,arguments);return K(k)||J(k,{constructor:b},!0),k},c=new RegExp("^(\\d{4}|[+-]\\d{6})(?:-(\\d{2})(?:-(\\d{2})(?:T(\\d{2}):(\\d{2})(?::(\\d{2})(?:(\\.\\d{1,}))?)?(Z|(?:([-+])(\\d{2}):(\\d{2})))?)?)?)?$"),d=[0,31,59,90,120,151,181,212,243,273,304,334,365],e=function(a,b){var c=b>1?1:0;return d[b]+Math.floor((a-1969+c)/4)-Math.floor((a-1901+c)/100)+Math.floor((a-1601+c)/400)+365*(a-1970)},f=function(b){var c=0,d=b;if(kb&&d>jb){var e=Math.floor(d/jb)*jb,f=Math.floor(e/1e3);c+=f,d-=1e3*f}return j(new a(1970,0,1,0,0,c,d))};for(var g in a)O(a,g)&&(b[g]=a[g]);J(b,{now:a.now,UTC:a.UTC},!0),b.prototype=a.prototype,J(b.prototype,{constructor:b},!0);var i=function(b){var d=c.exec(b);if(d){var g,h=j(d[1]),i=j(d[2]||1)-1,k=j(d[3]||1)-1,l=j(d[4]||0),m=j(d[5]||0),n=j(d[6]||0),o=Math.floor(1e3*j(d[7]||0)),p=Boolean(d[4]&&!d[8]),q="-"===d[9]?1:-1,r=j(d[10]||0),s=j(d[11]||0),t=m>0||n>0||o>0;return(t?24:25)>l&&60>m&&60>n&&1e3>o&&i>-1&&12>i&&24>r&&60>s&&k>-1&&k=-864e13&&864e13>=g)?g:NaN}return a.parse.apply(this,arguments)};return J(b,{parse:i}),b}(Date)}Date.now||(Date.now=function(){return(new Date).getTime()});var lb=k.toFixed&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==0xde0b6b3a7640080.toFixed(0)),mb={base:1e7,size:6,data:[0,0,0,0,0,0],multiply:function(a,b){for(var c=-1,d=b;++c=0;)c+=mb.data[b],mb.data[b]=Math.floor(c/a),c=c%a*mb.base},numToString:function(){for(var a=mb.size,b="";--a>=0;)if(""!==b||0===a||0!==mb.data[a]){var c=h(mb.data[a]);""===b?b=c:b+=S("0000000",0,7-c.length)+c}return b},pow:function Gb(a,b,c){return 0===b?c:b%2===1?Gb(a,b-1,c*a):Gb(a*a,b/2,c)},log:function(a){for(var b=0,c=a;c>=4096;)b+=12,c/=4096;for(;c>=2;)b+=1,c/=2;return b}},nb=function(a){var b,c,d,e,f,g,i,k;if(b=j(a),b=L(b)?0:Math.floor(b),0>b||b>20)throw new RangeError("Number.toFixed called with invalid number of decimals");if(c=j(this),L(c))return"NaN";if(-1e21>=c||c>=1e21)return h(c);if(d="",0>c&&(d="-",c=-c),e="0",c>1e-21)if(f=mb.log(c*mb.pow(2,69,1))-69,g=0>f?c*mb.pow(2,-f,1):c/mb.pow(2,f,1),g*=4503599627370496,f=52-f,f>0){for(mb.multiply(0,g),i=b;i>=7;)mb.multiply(1e7,0),i-=7;for(mb.multiply(mb.pow(10,i,1),0),i=f-1;i>=23;)mb.divide(1<<23),i-=23;mb.divide(1<0?(k=e.length,e=b>=k?d+S("0.0000000000000000000",0,b-k+2)+e:d+S(e,0,k-b)+"."+S(e,k-b)):e=d+e,e};J(k,{toFixed:nb},lb);var ob=function(){try{return"1"===1..toPrecision(void 0)}catch(a){return!0}}(),pb=k.toPrecision;J(k,{toPrecision:function(a){return"undefined"==typeof a?pb.call(this):pb.call(this,a)}},ob),2!=="ab".split(/(?:ab)*/).length||4!==".".split(/(.?)(.?)/).length||"t"==="tesst".split(/(s)*/)[1]||4!=="test".split(/(?:)/,-1).length||"".split(/.?/).length||".".split(/()()/).length>1?!function(){var a="undefined"==typeof/()??/.exec("")[1],b=Math.pow(2,32)-1;i.split=function(c,d){var e=String(this);if("undefined"==typeof c&&0===d)return[];if(!A(c))return T(this,c,d);var f,g,h,i,j=[],k=(c.ignoreCase?"i":"")+(c.multiline?"m":"")+(c.unicode?"u":"")+(c.sticky?"y":""),l=0,m=new RegExp(c.source,k+"g");a||(f=new RegExp("^"+m.source+"$(?!\\s)",k));var o="undefined"==typeof d?b:M.ToUint32(d);for(g=m.exec(e);g&&(h=g.index+g[0].length,!(h>l&&(V(j,S(e,l,g.index)),!a&&g.length>1&&g[0].replace(f,function(){for(var a=1;a1&&g.index=o)));)m.lastIndex===g.index&&m.lastIndex++,g=m.exec(e);return l===e.length?(i||!m.test(""))&&V(j,""):V(j,S(e,l)),j.length>o?S(j,0,o):j}}():"0".split(void 0,0).length&&(i.split=function(a,b){return"undefined"==typeof a&&0===b?[]:T(this,a,b)});var qb=i.replace,rb=function(){var a=[];return"x".replace(/x(.)?/g,function(b,c){V(a,c)}),1===a.length&&"undefined"==typeof a[0]}();rb||(i.replace=function(a,c){var d=b(c),e=A(a)&&/\)[*?]/.test(a.source);if(d&&e){var f=function(b){var d=arguments.length,e=a.lastIndex;a.lastIndex=0;var f=a.exec(b)||[];return a.lastIndex=e,V(f,arguments[d-2],arguments[d-1]),c.apply(this,f)};return qb.call(this,a,f)}return qb.call(this,a,c)});var sb=i.substr,tb="".substr&&"b"!=="0b".substr(-1);J(i,{substr:function(a,b){var c=a;return 0>a&&(c=s(this.length+a,0)),sb.call(this,c,b)}},tb);var ub=" \n\f\r \u2028\u2029\ufeff",vb="",wb="["+ub+"]",xb=new RegExp("^"+wb+wb+"*"),yb=new RegExp(wb+wb+"*$"),zb=i.trim&&(ub.trim()||!vb.trim());J(i,{trim:function(){if("undefined"==typeof this||null===this)throw new TypeError("can't convert "+this+" to object");return h(this).replace(xb,"").replace(yb,"")}},zb);var Ab=q.bind(String.prototype.trim),Bb=i.lastIndexOf&&-1!=="abcあい".lastIndexOf("あい",2);J(i,{lastIndexOf:function(a){if("undefined"==typeof this||null===this)throw new TypeError("can't convert "+this+" to object");for(var b=h(this),c=h(a),d=arguments.length>1?j(arguments[1]):NaN,e=L(d)?1/0:M.ToInteger(d),f=t(s(e,0),b.length),g=c.length,i=f+g;i>0;){i=s(0,i-g);var k=U(S(b,i,f+g),c);if(-1!==k)return i+k}return-1}},Bb);var Cb=i.lastIndexOf;if(J(i,{lastIndexOf:function(a){return Cb.apply(this,arguments)}},1!==i.lastIndexOf.length),(8!==parseInt(ub+"08")||22!==parseInt(ub+"0x16"))&&(parseInt=function(a){var b=/^[\-+]?0[xX]/;return function(c,d){var e=Ab(c),f=j(d)||(b.test(e)?16:10);return a(e,f)}}(parseInt)),1/parseFloat("-0")!==-(1/0)&&(parseFloat=function(a){return function(b){var c=Ab(b),d=a(c);return 0===d&&"-"===S(c,0,1)?-0:d}}(parseFloat)),"RangeError: test"!==String(new RangeError("test"))){var Db=function(){if("undefined"==typeof this||null===this)throw new TypeError("can't convert "+this+" to object");var a=this.name;"undefined"==typeof a?a="Error":"string"!=typeof a&&(a=h(a));var b=this.message;return"undefined"==typeof b?b="":"string"!=typeof b&&(b=h(b)),a?b?a+": "+b:a:b};Error.prototype.toString=Db}if(I){var Eb=function(a,b){if(W(a,b)){var c=Object.getOwnPropertyDescriptor(a,b);c.enumerable=!1,Object.defineProperty(a,b,c)}};Eb(Error.prototype,"message"),""!==Error.prototype.message&&(Error.prototype.message=""),Eb(Error.prototype,"name")}if("/a/gim"!==String(/a/gim)){var Fb=function(){var a="/"+this.source+"/";return this.global&&(a+="g"),this.ignoreCase&&(a+="i"),this.multiline&&(a+="m"),a};RegExp.prototype.toString=Fb}}),function(a,b){"use strict";"function"==typeof define&&define.amd?define(b):"object"==typeof exports?module.exports=b():a.returnExports=b()}(this,function(){var a,c,d,e,f=Function.call,g=Object.prototype,h=f.bind(g.hasOwnProperty),i=f.bind(g.propertyIsEnumerable),j=f.bind(g.toString),k=h(g,"__defineGetter__");k&&(a=f.bind(g.__defineGetter__),c=f.bind(g.__defineSetter__),d=f.bind(g.__lookupGetter__),e=f.bind(g.__lookupSetter__)),Object.getPrototypeOf||(Object.getPrototypeOf=function(a){var b=a.__proto__;return b||null===b?b:"[object Function]"===j(a.constructor)?a.constructor.prototype:a instanceof Object?g:null});var l=function(a){try{return a.sentinel=0,0===Object.getOwnPropertyDescriptor(a,"sentinel").value}catch(b){return!1}};if(Object.defineProperty){var m=l({}),n="undefined"==typeof b||l(b.createElement("div"));if(!n||!m)var o=Object.getOwnPropertyDescriptor}if(!Object.getOwnPropertyDescriptor||o){var p="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(a,b){if("object"!=typeof a&&"function"!=typeof a||null===a)throw new TypeError(p+a);if(o)try{return o.call(Object,a,b)}catch(c){}var f;if(!h(a,b))return f;if(f={enumerable:i(a,b),configurable:!0},k){var j=a.__proto__,l=a!==g;l&&(a.__proto__=g);var m=d(a,b),n=e(a,b);if(l&&(a.__proto__=j),m||n)return m&&(f.get=m),n&&(f.set=n),f}return f.value=a[b],f.writable=!0,f}}if(Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(a){return Object.keys(a)}),!Object.create){var q,r=!({__proto__:null}instanceof Object),s=function(){if(!b.domain)return!1;try{return!!new ActiveXObject("htmlfile")}catch(a){return!1}},t=function(){var a,b;return b=new ActiveXObject("htmlfile"),b.write(""),b.close(),a=b.parentWindow.Object.prototype,b=null,a},u=function(){var a,c=b.createElement("iframe"),d=b.body||b.documentElement;return c.style.display="none",d.appendChild(c),c.src="javascript:",a=c.contentWindow.Object.prototype,d.removeChild(c),c=null,a};q=r||"undefined"==typeof b?function(){return{__proto__:null}}:function(){var a=s()?t():u();delete a.constructor,delete a.hasOwnProperty,delete a.propertyIsEnumerable,delete a.isPrototypeOf,delete a.toLocaleString,delete a.toString,delete a.valueOf;var b=function(){};return b.prototype=a,q=function(){return new b},new b},Object.create=function(a,b){var c,d=function(){};if(null===a)c=q();else{if("object"!=typeof a&&"function"!=typeof a)throw new TypeError("Object prototype may only be an Object or null");d.prototype=a,c=new d,c.__proto__=a}return void 0!==b&&Object.defineProperties(c,b),c}}var v=function(a){try{return Object.defineProperty(a,"sentinel",{}),"sentinel"in a}catch(b){return!1}};if(Object.defineProperty){var w=v({}),x="undefined"==typeof b||v(b.createElement("div"));if(!w||!x)var y=Object.defineProperty,z=Object.defineProperties}if(!Object.defineProperty||y){var A="Property description must be an object: ",B="Object.defineProperty called on non-object: ",C="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(b,f,h){if("object"!=typeof b&&"function"!=typeof b||null===b)throw new TypeError(B+b);if("object"!=typeof h&&"function"!=typeof h||null===h)throw new TypeError(A+h);if(y)try{return y.call(Object,b,f,h)}catch(i){}if("value"in h)if(k&&(d(b,f)||e(b,f))){var j=b.__proto__;b.__proto__=g,delete b[f],b[f]=h.value,b.__proto__=j}else b[f]=h.value;else{if(!k&&("get"in h||"set"in h))throw new TypeError(C);"get"in h&&a(b,f,h.get),"set"in h&&c(b,f,h.set)}return b}}(!Object.defineProperties||z)&&(Object.defineProperties=function(a,b){if(z)try{return z.call(Object,a,b)}catch(c){}return Object.keys(b).forEach(function(c){"__proto__"!==c&&Object.defineProperty(a,c,b[c])}),a}),Object.seal||(Object.seal=function(a){if(Object(a)!==a)throw new TypeError("Object.seal can only be called on Objects.");return a}),Object.freeze||(Object.freeze=function(a){if(Object(a)!==a)throw new TypeError("Object.freeze can only be called on Objects.");return a});try{Object.freeze(function(){})}catch(D){Object.freeze=function(a){return function(b){return"function"==typeof b?b:a(b)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(a){if(Object(a)!==a)throw new TypeError("Object.preventExtensions can only be called on Objects.");return a}),Object.isSealed||(Object.isSealed=function(a){if(Object(a)!==a)throw new TypeError("Object.isSealed can only be called on Objects.");return!1}),Object.isFrozen||(Object.isFrozen=function(a){if(Object(a)!==a)throw new TypeError("Object.isFrozen can only be called on Objects.");return!1}),Object.isExtensible||(Object.isExtensible=function(a){if(Object(a)!==a)throw new TypeError("Object.isExtensible can only be called on Objects.");for(var b="";h(a,b);)b+="?";a[b]=!0;var c=h(a,b);return delete a[b],c})})}(window,document);
--------------------------------------------------------------------------------
/classes/cc/eguid/livepush/PushManager.java:
--------------------------------------------------------------------------------
1 | /**
2 | * 文件名:PushManager.java
3 | * 描述:用于处理push相关操作的接口
4 | * 修改人:eguid
5 | * 修改时间:2016年6月24日
6 | * 修改内容:
7 | */
8 | package cc.eguid.livepush;
9 |
10 | import java.util.Map;
11 | import java.util.Set;
12 |
13 | /**
14 | * 用于提供push操作的增删查服务
15 | * @author eguid
16 | * @version 2016年6月24日
17 | * @see PushManager
18 | * @since jdk1.7
19 | */
20 |
21 | public interface PushManager
22 | {
23 | /**
24 | * 发布一个流到服务器
25 | * @param map
26 | * @return pushId(当前发布流的标识,方便操作该push)
27 | */
28 | public String push(Mapmap);
29 | /**
30 | * 通过应用名删除某个push
31 | * @param pushId
32 | */
33 | public boolean closePush(String appName);
34 | /**
35 | * 查看全部当前正在运行的应用名称
36 | * @param pushId
37 | */
38 | public Set viewAppName();
39 | /**
40 | * 应用是否已经存在
41 | * @param appName
42 | * @return true:存在;false:不存在
43 | */
44 | public boolean isHave(String appName);
45 | }
46 |
--------------------------------------------------------------------------------
/classes/cc/eguid/livepush/PushManagerImpl.java:
--------------------------------------------------------------------------------
1 | /**
2 | * 文件名:PushMangerImpl.java 描述:实现push管理器的接口功能 修改人:eguid 修改时间:2016年6月29日 修改内容:增加管理处理器和应用名关系
3 | */
4 | package cc.eguid.livepush;
5 |
6 | import java.util.Map;
7 | import java.util.Set;
8 | import java.util.concurrent.ConcurrentMap;
9 |
10 | import cc.eguid.livepush.conf.ConfUtil;
11 | import cc.eguid.livepush.dao.HandlerDao;
12 | import cc.eguid.livepush.dao.HandlerDaoImpl;
13 | import cc.eguid.livepush.handler.OutHandler;
14 | import cc.eguid.livepush.handler.PushHandler;
15 | import cc.eguid.livepush.handler.PushHandlerImpl;
16 |
17 | /**
18 | * 实现push管理器的push,delete,view服务
19 | *
20 | * @author eguid
21 | * @version 2016年6月24日
22 | * @see PushMangerImpl
23 | * @since jdk1.7
24 | */
25 |
26 | public class PushManagerImpl implements PushManager {
27 | /**
28 | * 配置文件
29 | */
30 | private ConfUtil confUtil = new ConfUtil();
31 |
32 | public PushManagerImpl() {
33 | confUtil.isHave();
34 | }
35 |
36 | /**
37 | * 引用push处理器
38 | */
39 | private PushHandler pusher = new PushHandlerImpl();
40 |
41 | /**
42 | * 管理处理器的主进程Process及两个输出线程的关系
43 | */
44 | private HandlerDao hd = new HandlerDaoImpl();
45 |
46 | public synchronized void setPusher(PushHandler pusher) {
47 | this.pusher = pusher;
48 | }
49 |
50 | public synchronized void setHd(HandlerDao hd) {
51 | this.hd = hd;
52 | }
53 |
54 | @Override
55 | public synchronized String push(Map parammap) {
56 | String appName = null;
57 | ConcurrentMap resultMap = null;
58 | try {
59 | // ffmpeg环境是否配置正确
60 | if (!confUtil.isHave()) {
61 | return null;
62 | }
63 | // 参数是否符合要求
64 | if (parammap == null || parammap.isEmpty() || !parammap.containsKey("appName")) {
65 | return null;
66 | }
67 | appName = (String) parammap.get("appName");
68 | if (appName != null && "".equals(appName.trim())) {
69 | return null;
70 | }
71 | parammap.put("ffmpegPath", confUtil.getPath());
72 | resultMap = pusher.push(parammap);
73 | // 处理器和输出线程对应关系
74 | hd.set(appName, resultMap);
75 | } catch (Exception e) {
76 | // 暂时先写这样,后期加日志
77 | System.err.println("重大错误:参数不符合要求或运行失败" + e.getMessage());
78 | return null;
79 | }
80 | return appName;
81 |
82 | }
83 |
84 | @Override
85 | public synchronized boolean closePush(String appName) {
86 | if (hd.isHave(appName)) {
87 | ConcurrentMap map = hd.get(appName);
88 | // 关闭两个线程
89 | ((OutHandler) map.get("error")).destroy();
90 | // ((OutHandler)map.get("info")).destroy();
91 | // 暂时先这样写,后期加日志
92 | System.out.println("停止命令-----end commond");
93 | // 关闭命令主进程
94 | ((Process) map.get("process")).destroy();
95 | // 删除处理器与线程对应关系表
96 | hd.delete(appName);
97 | return true;
98 | }
99 | return false;
100 | }
101 |
102 | @Override
103 | public synchronized Set viewAppName() {
104 | return hd.getAllAppName();
105 | }
106 |
107 | @Override
108 | public synchronized boolean isHave(String appName) {
109 | hd.isHave(appName);
110 | return false;
111 |
112 | }
113 | }
114 |
--------------------------------------------------------------------------------
/classes/cc/eguid/livepush/Readme:
--------------------------------------------------------------------------------
1 | livePush0.2.1使用说明:
2 | (重要:使用前必须保证ffmpeg环境包在该项目的WEB-INF\classes\cc\eguid\livepush\ffmpeg\目录中)
3 | 1、对象创建
4 | PushManager pusher = new PushManagerImpl();
5 |
6 | 2、参数说明及设置
7 | 2.1、参数说明
8 | name:应用名;
9 | input:接收地址;
10 | output:推送地址;
11 | codec:视频编码;
12 | fmt:视频格式;
13 | fps:视频帧率;
14 | rs:视频分辨率;
15 | twoPart:0-推一个元码流;1-推一个自定义推流;2-推两个流(一个是自定义,一个是元码)
16 | 2.2、参数使用
17 | Map map = new HashMap();
18 | map.put("appName", "testwanglaing123");
19 | map.put("input","rtsp://admin:admin@192.168.2.236:37779/cam/realmonitor?channel=1&subtype=0");
20 | map.put("output", "rtmp://192.168.30.21/live/");
21 | map.put("codec","h264");
22 | map.put("fmt", "flv");
23 | map.put("fps", "25");
24 | map.put("rs", "640x360");
25 | map.put("twoPart","2");
26 |
27 | 3、调用方法
28 | 3.1、发布方法
29 | id push(map)
30 | pusher.push(map);
31 |
32 | 3.2、关闭发布方法
33 | void closePush(appName)
34 | pusher.closePush(appName);
35 |
36 | 3.3、查看所有正在push的列表
37 | Set viewAppName()
38 | pusher.viewAppName();
39 |
40 | 3.4、检测是否存在某个push
41 | boolean isHave(String appName)
42 | pusher.isHave(appName);
--------------------------------------------------------------------------------
/classes/cc/eguid/livepush/conf/ConfUtil.java:
--------------------------------------------------------------------------------
1 | /**
2 | * 文件名:ConfUtil.java 描述:读取配置文件属性 修改人:eguid 修改时间:2016年7月8日 修改内容:
3 | */
4 | package cc.eguid.livepush.conf;
5 |
6 | import java.io.File;
7 |
8 | /**
9 | * 读取配置文件
10 | *
11 | * @author eguid
12 | * @version 2016年7月8日
13 | * @see ConfUtil
14 | * @since jdk1.7
15 | */
16 |
17 | public class ConfUtil
18 | {
19 | private volatile static boolean isHave=false;
20 | private volatile static String ffmpegPath=null;
21 | public ConfUtil()
22 | {
23 | super();
24 | initConfInfo();
25 | }
26 |
27 | /**
28 | * 从配置文件中初始化参数
29 | */
30 | private void initConfInfo()
31 | {
32 |
33 | String path = getClass().getResource("../").getPath() + "ffmpeg/ffmpeg.exe";
34 | System.out.print("预加载FFMPEG配置:"+path);
35 | File ffmpeg =new File(path);
36 | ffmpegPath=ffmpeg.getPath();
37 | if (isHave=ffmpeg.isFile())
38 | {
39 | System.out.println("加载ffmpeg成功!");
40 | }
41 | else
42 | {
43 | System.out.println("加载ffmpeg失败!");
44 | }
45 | }
46 |
47 | /**
48 | *判断ffmpeg环境配置
49 | * @return true:配置成功;false:配置失败
50 | */
51 | public boolean isHave()
52 | {
53 | return isHave;
54 | }
55 | /**
56 | * 获取ffmpeg环境调用地址
57 | * 添加方法功能描述
58 | * @return
59 | */
60 | public String getPath()
61 | {
62 | return ffmpegPath;
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/classes/cc/eguid/livepush/dao/HandlerDao.java:
--------------------------------------------------------------------------------
1 | /**
2 | * 文件名:HandlerDao.java
3 | * 描述:管理所有命令行处理器的缓存
4 | * 修改人:eguid
5 | * 修改时间:2016年6月27日
6 | * 修改内容:
7 | */
8 | package cc.eguid.livepush.dao;
9 |
10 | import java.util.Set;
11 | import java.util.concurrent.ConcurrentMap;
12 |
13 | /**
14 | * 命令行执行处理器缓存,方便管理处理器的开启和关闭
15 | * @author eguid
16 | * @version 2016年6月27日
17 | * @see HandlerDao
18 | * @since jdk1.7
19 | */
20 |
21 | public interface HandlerDao
22 | {
23 | /**
24 | * 获取某个处理器
25 | * @param pushId
26 | * @return
27 | */
28 | public ConcurrentMap get(String pushId);
29 | /**
30 | * 存放一个处理器
31 | * @param handlerMap
32 | */
33 | public void set(String key, ConcurrentMap resultMap);
34 | /**
35 | * 获取全部处理器
36 | * @return
37 | */
38 | public ConcurrentMap> getAll();
39 | /**
40 | * 获取全部处理器名称
41 | * @return
42 | */
43 | public Set getAllAppName();
44 | /**
45 | * 删除某个处理器
46 | * @param pushId
47 | */
48 | public void delete(String appName);
49 | /**
50 | * 是否存在key
51 | */
52 | public boolean isHave(String appName);
53 | }
54 |
--------------------------------------------------------------------------------
/classes/cc/eguid/livepush/dao/HandlerDaoImpl.java:
--------------------------------------------------------------------------------
1 | /**
2 | * 文件名:HandlerDaoImpl.java 描述:命令行执行处理器缓存的简单实现 修改人:eguid 修改时间:2016年6月27日 修改内容:
3 | */
4 | package cc.eguid.livepush.dao;
5 |
6 | import java.util.Set;
7 | import java.util.concurrent.ConcurrentHashMap;
8 | import java.util.concurrent.ConcurrentMap;
9 |
10 |
11 | /**
12 | * 处理器的缓存简单实现
13 | * @author eguid
14 | * @version 2016年6月27日
15 | * @see HandlerDaoImpl
16 | * @since jdk1.7
17 | */
18 |
19 | public class HandlerDaoImpl implements HandlerDao
20 | {
21 | /**
22 | * 存放process
23 | */
24 | private static ConcurrentMap> handlerMap = new ConcurrentHashMap>(20);
25 |
26 | @Override
27 | public ConcurrentMap get(String pushId)
28 | {
29 | if(handlerMap.containsKey(pushId))
30 | {
31 | return handlerMap.get(pushId);
32 | }
33 | return null;
34 | }
35 |
36 | @Override
37 | public ConcurrentMap> getAll()
38 | {
39 | return handlerMap;
40 | }
41 |
42 | @Override
43 | public void delete(String pushId)
44 | {
45 | if (pushId != null)
46 | {
47 | handlerMap.remove(pushId);
48 | }
49 | }
50 |
51 | @Override
52 | public void set(String key, ConcurrentMap map)
53 | {
54 | if (key != null)
55 | {
56 | handlerMap.put(key, map);
57 | }
58 | }
59 |
60 | @Override
61 | public boolean isHave(String pushId)
62 | {
63 | return handlerMap.containsKey(pushId);
64 | }
65 |
66 | @Override
67 | public Set getAllAppName()
68 | {
69 | return handlerMap.keySet();
70 |
71 | }
72 |
73 | }
74 |
--------------------------------------------------------------------------------
/classes/cc/eguid/livepush/ffmpeg/avcodec-57.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/classes/cc/eguid/livepush/ffmpeg/avcodec-57.dll
--------------------------------------------------------------------------------
/classes/cc/eguid/livepush/ffmpeg/avdevice-57.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/classes/cc/eguid/livepush/ffmpeg/avdevice-57.dll
--------------------------------------------------------------------------------
/classes/cc/eguid/livepush/ffmpeg/avfilter-6.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/classes/cc/eguid/livepush/ffmpeg/avfilter-6.dll
--------------------------------------------------------------------------------
/classes/cc/eguid/livepush/ffmpeg/avformat-57.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/classes/cc/eguid/livepush/ffmpeg/avformat-57.dll
--------------------------------------------------------------------------------
/classes/cc/eguid/livepush/ffmpeg/avutil-55.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/classes/cc/eguid/livepush/ffmpeg/avutil-55.dll
--------------------------------------------------------------------------------
/classes/cc/eguid/livepush/ffmpeg/ffmpeg.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/classes/cc/eguid/livepush/ffmpeg/ffmpeg.exe
--------------------------------------------------------------------------------
/classes/cc/eguid/livepush/ffmpeg/ffplay.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/classes/cc/eguid/livepush/ffmpeg/ffplay.exe
--------------------------------------------------------------------------------
/classes/cc/eguid/livepush/ffmpeg/ffprobe.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/classes/cc/eguid/livepush/ffmpeg/ffprobe.exe
--------------------------------------------------------------------------------
/classes/cc/eguid/livepush/ffmpeg/postproc-54.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/classes/cc/eguid/livepush/ffmpeg/postproc-54.dll
--------------------------------------------------------------------------------
/classes/cc/eguid/livepush/ffmpeg/swresample-2.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/classes/cc/eguid/livepush/ffmpeg/swresample-2.dll
--------------------------------------------------------------------------------
/classes/cc/eguid/livepush/ffmpeg/swscale-4.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/classes/cc/eguid/livepush/ffmpeg/swscale-4.dll
--------------------------------------------------------------------------------
/classes/cc/eguid/livepush/handler/OutHandler.java:
--------------------------------------------------------------------------------
1 | /**
2 | * 文件名:OutHandler.java 描述:输出命令行主进程消息 修改人:eguid 修改时间:2016年6月27日 修改内容:
3 | */
4 | package cc.eguid.livepush.handler;
5 |
6 | import java.io.BufferedReader;
7 | import java.io.IOException;
8 | import java.io.InputStream;
9 | import java.io.InputStreamReader;
10 |
11 | /**
12 | * 用于输出命令行主进程的消息线程(必须开启,否则命令行主进程无法正常执行) 重要:该类重写了destroy方法,用于安全的关闭该线程
13 | *
14 | * @author eguid
15 | * @version 2016年6月27日
16 | * @see OutHandler
17 | * @since jdk1.7
18 | */
19 |
20 | public class OutHandler extends Thread {
21 | /**
22 | * 控制状态
23 | */
24 | private volatile boolean desstatus = true;
25 |
26 | /**
27 | * 读取输出流
28 | */
29 | private BufferedReader br = null;
30 |
31 | /**
32 | * 输出类型
33 | */
34 | private String type = null;
35 |
36 | public OutHandler(InputStream is, String type) {
37 | br = new BufferedReader(new InputStreamReader(is));
38 | this.type = type;
39 | }
40 |
41 | /**
42 | * 重写线程销毁方法,安全的关闭线程
43 | */
44 | @Override
45 | public void destroy() {
46 | setDesStatus(false);
47 | }
48 |
49 | public void setDesStatus(boolean desStatus) {
50 | this.desstatus = desStatus;
51 | }
52 |
53 | /**
54 | * 执行输出线程
55 | */
56 | @Override
57 | public void run() {
58 | String msg = null;
59 | int index = 0;
60 | int errorIndex = 0;
61 | int status = 10;
62 | try {
63 | System.out.println(type + "开始推流!");
64 | while (desstatus && (msg = br.readLine()) != null) {
65 | if (msg.indexOf("[rtsp") != -1) {
66 | System.out.println("接收" + status + "个数据包" + msg);
67 | System.out.println(type + ",网络异常丢包,丢包次数:" + errorIndex++ + ",消息体:" + msg);
68 | status = 10;
69 | index = 0;
70 | }
71 |
72 | if (index % status == 0) {
73 | System.out.println("接收" + status + "个数据包" + msg);
74 | status *= 2;
75 | }
76 | index++;
77 | }
78 | } catch (IOException e) {
79 | System.out.println("发生内部异常错误,自动关闭[" + this.getId() + "]线程");
80 | destroy();
81 | } finally {
82 | if (this.isAlive()) {
83 | destroy();
84 | }
85 | }
86 | }
87 | }
88 |
--------------------------------------------------------------------------------
/classes/cc/eguid/livepush/handler/PushHandler.java:
--------------------------------------------------------------------------------
1 | /**
2 | * 文件名:PushHandler.java
3 | * 描述:push操作处理器接口
4 | * 修改人:eguid
5 | * 修改时间:2016年6月24日
6 | * 修改内容:
7 | */
8 | package cc.eguid.livepush.handler;
9 |
10 | import java.io.IOException;
11 | import java.util.Map;
12 | import java.util.concurrent.ConcurrentMap;
13 |
14 | /**
15 | * 用于提供处理push操作的服务接口
16 | * @author eguid
17 | * @version 2016年6月24日
18 | * @see PushHandler
19 | * @since jdk1.7
20 | */
21 |
22 | public interface PushHandler
23 | {
24 | /**
25 | * 处理push操作(包含一个主进程和两个输出线程)
26 | * @param parammap
27 | * 格式:
28 | * name:应用名;input:接收地址;output:推送地址;fmt:视频格式;fps:视频帧率;rs:视频分辨率;disableAudio:是否开启音频
29 | * @return map(进程,消息(info,error))
30 | * @throws IOException
31 | *
32 | */
33 | public ConcurrentMap push(Map parammap)throws Exception;
34 | }
35 |
--------------------------------------------------------------------------------
/classes/cc/eguid/livepush/handler/PushHandlerImpl.java:
--------------------------------------------------------------------------------
1 | /**
2 | * 文件名:PushHandlerImpl.java 描述: 修改人:eguid 修改时间:2016年6月24日 修改内容:
3 | */
4 | package cc.eguid.livepush.handler;
5 |
6 | import java.util.Map;
7 | import java.util.concurrent.ConcurrentHashMap;
8 | import java.util.concurrent.ConcurrentMap;
9 |
10 | /**
11 | * 提供解析参数生成ffmpeg命令并处理push操作
12 | *
13 | * @author eguid
14 | * @version 2016年6月24日
15 | * @see PushHandlerImpl
16 | * @since jdk1.7
17 | */
18 |
19 | public class PushHandlerImpl implements PushHandler {
20 |
21 | @Override
22 | public ConcurrentMap push(Map paramMap) throws Exception {
23 | ConcurrentMap resultMap = null;
24 | Process proc =null;
25 | OutHandler errorGobbler=null;
26 | try{
27 | // 从map里面取数据,组装成命令
28 | String comm = getComm4Map(paramMap);
29 | if(comm==null)
30 | {
31 | throw new Exception();
32 | }
33 | // 执行命令行
34 | System.out.println("执行命令:" + comm);
35 | proc = Runtime.getRuntime().exec(comm);
36 |
37 | errorGobbler = new OutHandler(proc.getErrorStream(), (String) paramMap.get("appName"));
38 | errorGobbler.start();
39 |
40 | // 返回参数
41 | resultMap = new ConcurrentHashMap();
42 | // resultMap.put("info", outputGobbler);
43 | resultMap.put("error", errorGobbler);
44 | resultMap.put("process", proc);
45 | }catch(Exception e){
46 | if(proc!=null){
47 | proc.destroy();
48 | }
49 | if(errorGobbler!=null){
50 | errorGobbler.destroy();
51 | }
52 | throw e;
53 | }
54 | return resultMap;
55 | }
56 |
57 | /*
58 | * "ffmpeg -i "+
59 | * "rtsp://admin:admin@192.168.2.236:37779/cam/realmonitor?channel=1&subtype=0 "
60 | * + " -f flv -r 25 -s 640x360 -an" + " rtmp://192.168.30.21/live/test"
61 | * 推送流格式:
62 | * name:应用名;input:接收地址;output:推送地址;fmt:视频格式;fps:视频帧率;rs:视频分辨率
63 | * 是否开启音频
64 | */
65 | /**
66 | * 通过解析参数生成可执行的命令行字符串;
67 | * name:应用名;input:接收地址;output:推送地址;fmt:视频格式;fps:视频帧率;rs:视频分辨率
68 | * "ffmpeg -i rtsp://admin:admin@192.168.2.236:37779/cam/realmonitor?channel=1&subtype=0 -f flv -r 25 -s 640x360 -an rtmp://192.168.30.21/live/test"
69 | * @param paramMap
70 | * @throws Exception
71 | * @return 命令行字符串
72 | */
73 | protected String getComm4Map(Map paramMap) throws Exception{
74 | try{
75 | if (paramMap.containsKey("ffmpegPath")) {
76 | String ffmpegPath = (String) paramMap.get("ffmpegPath");
77 | // -i:输入流地址或者文件绝对地址
78 | StringBuilder comm = new StringBuilder(ffmpegPath + " -i ");
79 | // 是否有必输项:输入地址,输出地址,应用名,twoPart:0-推一个元码流;1-推一个自定义推流;2-推两个流(一个是自定义,一个是元码)
80 | if (paramMap.containsKey("input") && paramMap.containsKey("output") && paramMap.containsKey("appName")&& paramMap.containsKey("twoPart")) {
81 | String input = (String) paramMap.get("input");
82 | String output = (String) paramMap.get("output");
83 | String appName = (String) paramMap.get("appName");
84 | String twoPart = (String) paramMap.get("twoPart");
85 | String codec=(String) paramMap.get("codec");
86 | //默认h264解码
87 | codec=(codec==null?"h264":(String) paramMap.get("codec"));
88 | // 输入地址
89 | comm.append(input);
90 | // 当twoPart为0时,只推一个元码流
91 | if ("0".equals(twoPart)) {
92 | comm.append(" -vcodec "+codec+" -f flv -an "+output + appName);
93 | }else{
94 | // -f :转换格式,默认flv
95 | if (paramMap.containsKey("fmt")) {
96 | String fmt = (String) paramMap.get("fmt");
97 | comm.append(" -f " + fmt);
98 | }
99 | // -r :帧率,默认25;-g :帧间隔
100 | if (paramMap.containsKey("fps")) {
101 | String fps = (String) paramMap.get("fps");
102 | comm.append(" -r " + fps);
103 | comm.append(" -g " + fps);
104 | }
105 | // -s 分辨率 默认是原分辨率
106 | if (paramMap.containsKey("rs")) {
107 | String rs = (String) paramMap.get("rs");
108 | comm.append(" -s " + rs);
109 | }
110 | // 输出地址+发布的应用名
111 | comm.append(" -an "+output + appName);
112 | // 当twoPart为2时推两个流,一个自定义流,一个元码流
113 | if ("2".equals(twoPart)) {
114 | // 一个视频源,可以有多个输出,第二个输出为拷贝源视频输出,不改变视频的各项参数并且命名为应用名+HD
115 | comm.append(" -vcodec copy -f flv -an ").append(output +appName+ "HD");
116 | }
117 | }
118 | return comm.toString();
119 | }
120 | }
121 | }catch(Exception e){
122 | throw e;
123 | }
124 | return null;
125 | }
126 | }
127 |
--------------------------------------------------------------------------------
/classes/cn/njlingdong/cameraLive/controller/CameraLiveController.java:
--------------------------------------------------------------------------------
1 | /**
2 | * 文件名:CameraLiveController.java 描述:提供实时直播推送服务 修改人:eguid 修改时间:2016年6月30日 修改内容:
3 | */
4 | package cn.njlingdong.cameraLive.controller;
5 |
6 |
7 | import javax.annotation.Resource;
8 |
9 | import org.springframework.stereotype.Controller;
10 | import org.springframework.web.bind.annotation.PathVariable;
11 | import org.springframework.web.bind.annotation.RequestMapping;
12 | import org.springframework.web.bind.annotation.RequestMethod;
13 | import org.springframework.web.bind.annotation.ResponseBody;
14 |
15 | import cn.njlingdong.cameraLive.entity.LiveInfoEntity;
16 | import cn.njlingdong.cameraLive.entity.ResultData;
17 | import cn.njlingdong.cameraLive.service.CameraLiveService;
18 |
19 |
20 | /**
21 | * 提供REST形式的实时直播推送,查看和关闭服务
22 | *
23 | * @author eguid
24 | * @version 2016年6月30日
25 | * @see CameraLiveController
26 | * @since jdk1.7
27 | */
28 | @Controller
29 | @RequestMapping("/live")
30 | public class CameraLiveController
31 | {
32 | @Resource(name = "cameraLiveService")
33 | private CameraLiveService cls;
34 |
35 | public void setCls(CameraLiveService cls)
36 | {
37 | this.cls = cls;
38 | }
39 |
40 | @ResponseBody
41 | @RequestMapping(value = "/push/{appName}",method = RequestMethod.POST)
42 | public ResultData open( @PathVariable("appName")String appName,LiveInfoEntity liveInfo )
43 | {
44 | return cls.add(liveInfo);
45 | }
46 |
47 | @ResponseBody
48 | @RequestMapping(value = "/close/{appName}", method = RequestMethod.DELETE)
49 | public ResultData close(@PathVariable("appName") String appName)
50 | {
51 | return cls.remove(appName);
52 | }
53 |
54 | @ResponseBody
55 | @RequestMapping(value = "/view/{appName}", method = RequestMethod.GET)
56 | public ResultData view(@PathVariable("appName") String appName)
57 | {
58 | return cls.view(appName);
59 | }
60 | @ResponseBody
61 | @RequestMapping(value = "/viewAll", method = RequestMethod.GET)
62 | public ResultData view()
63 | {
64 | return cls.viewAll();
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/classes/cn/njlingdong/cameraLive/entity/LiveInfoEntity.java:
--------------------------------------------------------------------------------
1 | /**
2 | * 文件名:LiveInfoEntity.java 描述:发布视频信息 修改人:eguid 修改时间:2016年6月30日 修改内容:jdk1.7
3 | */
4 | package cn.njlingdong.cameraLive.entity;
5 |
6 | import java.io.Serializable;
7 |
8 | /**
9 | * 发布视频信息
10 | *
11 | * @author eguid
12 | * @version 2016年6月30日
13 | * @see LiveInfoEntity
14 | * @since jdk1.7
15 | */
16 | public class LiveInfoEntity implements Serializable {
17 | private static final long serialVersionUID = -2657813061488195041L;
18 |
19 | public LiveInfoEntity() {
20 | super();
21 | }
22 |
23 | public LiveInfoEntity(String appName, String input, String output, String fmt, String fps, String rs,
24 | String disableAudio) {
25 | super();
26 | this.appName = appName;
27 | this.input = input;
28 | this.output = output;
29 | this.fmt = fmt;
30 | this.fps = fps;
31 | this.rs = rs;
32 | this.disableAudio = disableAudio;
33 | }
34 |
35 | /**
36 | * 应用名
37 | */
38 | private String appName;
39 |
40 | /**
41 | * 视频源地址,可以是实时流地址也可以是文件路径
42 | */
43 | private String input;
44 |
45 | /**
46 | * 实时流输出地址,这个默认是固定的rtmp服务器发布地址
47 | */
48 | private String output;
49 |
50 | /**
51 | * 视频格式,默认flv
52 | */
53 | private String fmt;
54 |
55 | /**
56 | * 帧率,最好是25-60
57 | */
58 | private String fps;
59 |
60 | /**
61 | * 分辨率,例如:640x360
62 | */
63 | private String rs;
64 |
65 | /**
66 | * 是否关闭音频
67 | */
68 | private String disableAudio;
69 |
70 | /**
71 | * @return the appName
72 | */
73 | public String getAppName() {
74 | return appName;
75 | }
76 |
77 | /**
78 | * @param appName
79 | * the appName to set
80 | */
81 | public void setAppName(String appName) {
82 | this.appName = appName;
83 | }
84 |
85 | /**
86 | * @return the input
87 | */
88 | public String getInput() {
89 | return input;
90 | }
91 |
92 | /**
93 | * @param input
94 | * the input to set
95 | */
96 | public void setInput(String input) {
97 | this.input = input;
98 | }
99 |
100 | /**
101 | * @return the output
102 | */
103 | public String getOutput() {
104 | return output;
105 | }
106 |
107 | /**
108 | * @param output
109 | * the output to set
110 | */
111 | public void setOutput(String output) {
112 | this.output = output;
113 | }
114 |
115 | /**
116 | * @return the fmt
117 | */
118 | public String getFmt() {
119 | return fmt;
120 | }
121 |
122 | /**
123 | * @param fmt
124 | * the fmt to set
125 | */
126 | public void setFmt(String fmt) {
127 | this.fmt = fmt;
128 | }
129 |
130 | /**
131 | * @return the fps
132 | */
133 | public String getFps() {
134 | return fps;
135 | }
136 |
137 | /**
138 | * @param fps
139 | * the fps to set
140 | */
141 | public void setFps(String fps) {
142 | this.fps = fps;
143 | }
144 |
145 | /**
146 | * @return the rs
147 | */
148 | public String getRs() {
149 | return rs;
150 | }
151 |
152 | /**
153 | * @param rs
154 | * the rs to set
155 | */
156 | public void setRs(String rs) {
157 | this.rs = rs;
158 | }
159 |
160 | /**
161 | * @return the disableAudio
162 | */
163 | public String getDisableAudio() {
164 | return disableAudio;
165 | }
166 |
167 | /**
168 | * @param disableAudio
169 | * the disableAudio to set
170 | */
171 | public void setDisableAudio(String disableAudio) {
172 | this.disableAudio = disableAudio;
173 | }
174 |
175 | /*
176 | * (non-Javadoc)
177 | *
178 | * @see java.lang.Object#toString()
179 | */
180 | @Override
181 | public String toString() {
182 | return "LiveInfoEntity [appName=" + appName + ", input=" + input + ", output=" + output + ", fmt=" + fmt
183 | + ", fps=" + fps + ", rs=" + rs + ", disableAudio=" + disableAudio + "]";
184 | }
185 |
186 | }
187 |
--------------------------------------------------------------------------------
/classes/cn/njlingdong/cameraLive/entity/ResultData.java:
--------------------------------------------------------------------------------
1 | /**
2 | * 文件名:ResultData.java
3 | * 描述:响应JSON结果集
4 | * 修改人:eguid
5 | * 修改时间:2016年6月30日
6 | * 修改内容:
7 | */
8 | package cn.njlingdong.cameraLive.entity;
9 |
10 | import java.io.Serializable;
11 |
12 | /**
13 | * 响应JSON结果集
14 | *
15 | * @author eguid
16 | * @version 2016年6月30日
17 | * @see ResultData
18 | * @since
19 | */
20 |
21 | public class ResultData implements Serializable {
22 | private static final long serialVersionUID = 7219235230800863548L;
23 | private String status;
24 | private String msg;
25 | private Object data;
26 |
27 | public String getStatus() {
28 | return status;
29 | }
30 |
31 | public void setStatus(String status) {
32 | this.status = status;
33 | }
34 |
35 | public String getMsg() {
36 | return msg;
37 | }
38 |
39 | public void setMsg(String msg) {
40 | this.msg = msg;
41 | }
42 |
43 | public Object getData() {
44 | return data;
45 | }
46 |
47 | public void setData(Object data) {
48 | this.data = data;
49 | }
50 |
51 | @Override
52 | public String toString() {
53 | return "ResultData [status=" + status + ", msg=" + msg + ", data=" + data + "]";
54 | }
55 |
56 | }
57 |
--------------------------------------------------------------------------------
/classes/cn/njlingdong/cameraLive/service/CameraLiveService.java:
--------------------------------------------------------------------------------
1 | /**
2 | * 文件名:CamaraLiveService.java
3 | * 描述:提供直播流管理的接口化服务
4 | * 修改人:eguid
5 | * 修改时间:2016年6月30日
6 | * 修改内容:
7 | */
8 | package cn.njlingdong.cameraLive.service;
9 |
10 | import cn.njlingdong.cameraLive.entity.LiveInfoEntity;
11 | import cn.njlingdong.cameraLive.entity.ResultData;
12 |
13 | /**
14 | * 管理直播流查看、发布和关闭
15 | *
16 | * @author eguid
17 | * @version 2016年6月30日
18 | * @see CamaraLiveService
19 | * @since jdk1.7
20 | */
21 |
22 | public interface CameraLiveService
23 | {
24 | /**
25 | * 创建一个直播流应用
26 | * @param liveInfo
27 | * @return appName(当前应用名)
28 | */
29 | public ResultData add(LiveInfoEntity liveInfo);
30 |
31 | /**
32 | * 关闭直播流应用
33 | * @param appName
34 | */
35 | public ResultData remove(String appName);
36 |
37 | /**
38 | * 查看当前所有正在运行的直播流应用
39 | * @return appName列表
40 | */
41 | public ResultData viewAll();
42 | /**
43 | * 查看应用详细
44 | * @return appName列表
45 | */
46 | public ResultData view(String appName);
47 | }
48 |
--------------------------------------------------------------------------------
/classes/cn/njlingdong/cameraLive/service/CameraLiveServiceImpl.java:
--------------------------------------------------------------------------------
1 | /**
2 | * 文件名:CameraLiveServiceImpl.java
3 | * 描述:实现监控实时视频发布
4 | * 修改人:eguid
5 | * 修改时间:2016年6月30日
6 | * 修改内容:
7 | */
8 | package cn.njlingdong.cameraLive.service;
9 |
10 | import java.util.ArrayList;
11 | import java.util.HashMap;
12 | import java.util.List;
13 | import java.util.Map;
14 | import java.util.concurrent.ConcurrentHashMap;
15 | import java.util.concurrent.ConcurrentMap;
16 |
17 | import org.springframework.stereotype.Service;
18 |
19 | import cc.eguid.livepush.PushManager;
20 | import cc.eguid.livepush.PushManagerImpl;
21 | import cn.njlingdong.cameraLive.entity.LiveInfoEntity;
22 | import cn.njlingdong.cameraLive.entity.ResultData;
23 | import cn.njlingdong.cameraLive.util.ResultDataUtil;
24 |
25 | /**
26 | * 实现实时监控视频发布
27 | *
28 | * @author eguid
29 | * @version 2016年6月30日
30 | * @see CameraLiveServiceImpl
31 | * @since jdk1.7
32 | */
33 | @Service("cameraLiveService")
34 | public class CameraLiveServiceImpl implements CameraLiveService
35 | {
36 | /**
37 | * 引用push管理器,用于push直播流到rtmp服务器
38 | */
39 | private static PushManager pusher = new PushManagerImpl();
40 |
41 | // 简单存放发布视频的信息
42 | private static ConcurrentMap AllLiveInfo = new ConcurrentHashMap();
43 |
44 | public static void setPusher(PushManager pusher)
45 | {
46 | CameraLiveServiceImpl.pusher = pusher;
47 | }
48 |
49 | @Override
50 | public ResultData add(LiveInfoEntity liveInfo)
51 | {
52 | ResultData result = new ResultData();
53 | String appName = null;
54 | if (liveInfo != null && liveInfo.getAppName() != null && liveInfo.getInput() != null
55 | && liveInfo.getOutput() != null)
56 | {
57 | if (ResultDataUtil.checkStringNoCN(liveInfo.getAppName())
58 | && ResultDataUtil.checkURLNoCN(liveInfo.getInput())
59 | && ResultDataUtil.checkURLNoCN(liveInfo.getOutput()))
60 | {
61 | if (AllLiveInfo.containsKey(liveInfo.getAppName()))
62 | {
63 | ResultDataUtil.setData(result, "2", "发布应用失败:该应用已存在", appName);
64 | }
65 | else
66 | {
67 | Map map = getMap4LiveInfo(liveInfo);
68 | //开启推送处理器
69 | appName = pusher.push(map);
70 | // 存放信息
71 | AllLiveInfo.put(appName, liveInfo);
72 | ResultDataUtil.setData(result, "0", "成功发布应用", map);
73 | }
74 | }
75 | else
76 | {
77 | ResultDataUtil.setData(result, "3", "发布应用失败:应用非地址禁止使用特殊符号,空格,中文字符;地址可以包含/:@.?&=特殊字符", appName);
78 | }
79 | }
80 | else
81 | {
82 | ResultDataUtil.setData(result, "1", "发布应用失败", appName);
83 | }
84 | return result;
85 | }
86 |
87 | /**
88 | * 解析参数
89 | *
90 | * @param liveInfo
91 | * @return
92 | */
93 | private Map getMap4LiveInfo(LiveInfoEntity liveInfo)
94 | {
95 | String appName = liveInfo.getAppName();
96 | String input = liveInfo.getInput();
97 | String output = liveInfo.getOutput();
98 | String fmt = liveInfo.getFmt();
99 | String fps = liveInfo.getFps();
100 | String rs = liveInfo.getRs();
101 | String disableAudio = liveInfo.getDisableAudio();
102 |
103 | Map map = new HashMap(20);
104 | map.put("appName", appName);
105 | // 输入输出暂时固定
106 | map.put("input", input);
107 | map.put("output", output);
108 | if (fmt != null)
109 | {
110 | map.put("fmt", fmt);
111 | }
112 | if (fps != null)
113 | {
114 | map.put("fps", fps);
115 | }
116 | if (rs != null)
117 | {
118 | map.put("rs", rs);
119 | }
120 | if (disableAudio != null)
121 | {
122 | map.put("disableAudio", disableAudio);
123 | }
124 | return map;
125 | }
126 |
127 | @Override
128 | public ResultData remove(String appName)
129 | {
130 | ResultData result = new ResultData();
131 | if (appName != null && AllLiveInfo.containsKey(appName))
132 | {
133 | pusher.closePush(appName);
134 | AllLiveInfo.remove(appName);
135 | ResultDataUtil.setData(result, "0", "删除成功", appName);
136 | }
137 | else
138 | {
139 | ResultDataUtil.setData(result, "2", "非法操作或删除失败", appName);
140 | }
141 | return result;
142 | }
143 |
144 | @Override
145 | public ResultData viewAll()
146 | {
147 | ResultData result = new ResultData();
148 | if (AllLiveInfo != null && !AllLiveInfo.isEmpty())
149 | {
150 | ResultDataUtil.setData(result, "0", "获取全部信息成功", getSet());
151 | }
152 | else
153 | {
154 | ResultDataUtil.setData(result, "1", "当前没有发布新的应用", null);
155 | }
156 | return result;
157 | }
158 |
159 | private List getSet()
160 | {
161 | List list = new ArrayList();
162 | if (!AllLiveInfo.isEmpty())
163 | {
164 | for (String key : AllLiveInfo.keySet())
165 | {
166 | list.add(AllLiveInfo.get(key));
167 | }
168 | }
169 | return list;
170 |
171 | }
172 |
173 | @Override
174 | public ResultData view(String appName)
175 | {
176 | ResultData result = new ResultData();
177 | if (appName != null && AllLiveInfo.containsKey(appName))
178 | {
179 | LiveInfoEntity liveInfo=AllLiveInfo.get(appName);
180 | ResultDataUtil.setData(result, "0", "获取详细信息成功",liveInfo);
181 | }
182 | else
183 | {
184 | ResultDataUtil.setData(result, "1", "获取失败", appName);
185 | }
186 | return result;
187 | }
188 | }
189 |
--------------------------------------------------------------------------------
/classes/cn/njlingdong/cameraLive/util/ResultDataUtil.java:
--------------------------------------------------------------------------------
1 | /**
2 | * 文件名:ResultDataUtil.java
3 | * 描述:提供方便操作的工具方法
4 | * 修改人:eguid
5 | * 修改时间:2016年6月30日
6 | * 修改内容:
7 | */
8 | package cn.njlingdong.cameraLive.util;
9 |
10 | import cn.njlingdong.cameraLive.entity.ResultData;
11 |
12 | /**
13 | * 方便操作的工具类
14 | * @author eguid
15 | * @version 2016年6月30日
16 | * @see ResultDataUtil
17 | * @since jdk1.7
18 | */
19 |
20 | public class ResultDataUtil
21 | {
22 | public static void setData(ResultData result,String status,String msg,Object data)
23 | {
24 | if(status!=null)
25 | result.setStatus(status);
26 | if(msg!=null)
27 | result.setMsg(msg);
28 | if(data!=null)
29 | result.setData(data);
30 | }
31 | /**
32 | * 检查字符串不能包含中文字符
33 | * @return true:是;false:否
34 | */
35 | public static boolean checkStringNoCN(String element)
36 | {
37 | String regex="[a-zA-Z0-9]+";
38 | return element.matches(regex);
39 | }
40 | /**
41 | * 检查字符串是否是链接地址
42 | * @param element
43 | * @return true:是 ;false:否
44 | */
45 | public static boolean checkURLNoCN(String element)
46 | {
47 | String regex="[a-zA-Z0-9/@:.?%&=]+";
48 | return element.matches(regex);
49 | }
50 | /**
51 | * 去除字符串两端空格
52 | * @param str
53 | */
54 | public static void trim(String ...str)
55 | {
56 | for(String s:str)
57 | {
58 | s=s.trim();
59 | }
60 |
61 | }
62 | /**
63 | * 测试
64 | * @param args
65 | */
66 | public static void main(String [] args)
67 | {
68 | System.err.println(checkURLNoCN("rtsp://admin:admin@192.168.2.236:37779/cam/realmonitor?channel=1&subtype=0"));
69 | }
70 | }
71 |
--------------------------------------------------------------------------------