├── .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 |

136 |

以下的操作对flash播放器和html5播放器都有效

137 |

138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 |

149 |

150 | 播放新参数地址: 151 | 152 |
153 |

154 |

155 | 167 | 168 | 169 | -------------------------------------------------------------------------------- /WebRoot/ckplayer/ckplayer/ckplayer.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/ckplayer/ckplayer/ckplayer.swf -------------------------------------------------------------------------------- /WebRoot/ckplayer/ckplayer/ckplayer.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 280 | -------------------------------------------------------------------------------- /WebRoot/ckplayer/ckplayer/language.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 73 | -------------------------------------------------------------------------------- /WebRoot/ckplayer/ckplayer/style.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/ckplayer/ckplayer/style.swf -------------------------------------------------------------------------------- /WebRoot/ckplayer/crossdomain.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /WebRoot/ckplayer/js/offlights.js: -------------------------------------------------------------------------------- 1 | /* 2 | 该文件是从网上收集的方法,用来做开关灯的,相对于原来的程序做了一些改变,兼容了IE10 3 | */ 4 | var Offlights = { 5 | create: function() { 6 | return function() { 7 | this.initialize.apply(this, arguments) 8 | } 9 | } 10 | } 11 | var OverLay = Offlights.create(); 12 | OverLay.prototype = { 13 | initialize: function(options) { 14 | this.SetOptions(options); 15 | this.browser = (function(ua){ 16 | var a=new Object(); 17 | var b = { 18 | msie: /msie/.test(ua) && !/opera/.test(ua), 19 | opera: /opera/.test(ua), 20 | safari: /webkit/.test(ua) && !/chrome/.test(ua), 21 | firefox: /firefox/.test(ua), 22 | chrome: /chrome/.test(ua) 23 | }; 24 | var vMark = ""; 25 | for (var i in b) { 26 | if (b[i]) { vMark = "safari" == i ? "version" : i; break; } 27 | } 28 | b.version = vMark && RegExp("(?:" + vMark + ")[\\/: ]([\\d.]+)").test(ua) ? RegExp.$1 : "0"; 29 | b.ie = b.msie; 30 | b.ie6 = b.msie && parseInt(b.version, 10) == 6; 31 | b.ie7 = b.msie && parseInt(b.version, 10) == 7; 32 | b.ie8 = b.msie && parseInt(b.version, 10) == 8; 33 | a.B=vMark; 34 | a.V=b.version; 35 | return a; 36 | })(window.navigator.userAgent.toLowerCase()); 37 | this.isIE = this.browser['B']=='msie' ? true : false; 38 | this.isIE6 = (this.isIE && this.browser['V']==6)?true:false; 39 | this._K_ = function(id) {return "string" == typeof id ? document.getElementById(id) : id}; 40 | this.Lay = this._K_(this.options.Lay) || document.body.insertBefore(document.createElement("div"), document.body.childNodes[0]); 41 | this.Color = this.options.Color; 42 | this.Opacity = parseInt(this.options.Opacity); 43 | this.zIndex = parseInt(this.options.zIndex); 44 | with(this.Lay.style) { 45 | display = "none"; 46 | zIndex = this.zIndex; 47 | left = top = 0; 48 | position = "fixed"; 49 | width = height = "100%" 50 | } 51 | if (this.isIE6) { 52 | this.Lay.style.position = "absolute"; 53 | this._resize = this.Bind(this, 54 | function() { 55 | this.Lay.style.width = Math.max(document.documentElement.scrollWidth, document.documentElement.clientWidth) + "px"; 56 | this.Lay.style.height = Math.max(document.documentElement.scrollHeight, document.documentElement.clientHeight) + "px" 57 | }); 58 | this.Lay.innerHTML = '' 59 | } 60 | }, 61 | Bind:function(object, fun) { 62 | return function() { 63 | return fun.apply(object, arguments) 64 | } 65 | }, 66 | Extend :function(destination, source) { 67 | for (var property in source) { 68 | destination[property] = source[property] 69 | } 70 | }, 71 | SetOptions: function(options) { 72 | this.options = { 73 | Lay: null, 74 | Color: "#000", 75 | Opacity: 100, 76 | zIndex: 50 77 | }; 78 | this.Extend(this.options, options || {}) 79 | }, 80 | Show: function() { 81 | if (this.isIE6) { 82 | this._resize(); 83 | window.attachEvent("onresize", this._resize) 84 | } 85 | with(this.Lay.style) { 86 | this.isIE ? filter = "alpha(opacity:" + this.Opacity + ")": opacity = this.Opacity / 100; 87 | backgroundColor = this.Color; 88 | display = "block" 89 | } 90 | }, 91 | Close: function() { 92 | this.Lay.style.display = "none"; 93 | if (this.isIE6) { 94 | window.detachEvent("onresize", this._resize) 95 | } 96 | } 97 | }; 98 | var LightBox = Offlights.create(); 99 | LightBox.prototype = { 100 | initialize: function(options) { 101 | this.OverLay = new OverLay(options); 102 | }, 103 | Show: function(options) { 104 | this.OverLay.Show(); 105 | }, 106 | Close: function() { 107 | this.OverLay.Close(); 108 | } 109 | }; 110 | -------------------------------------------------------------------------------- /WebRoot/css/index.css: -------------------------------------------------------------------------------- 1 | * { 2 | margin: 0; 3 | padding: 0; 4 | list-sytle: none; 5 | } 6 | 7 | h2 { 8 | text-align: center; 9 | } 10 | 11 | .main { 12 | background-color: #fcfcfc; 13 | font-size: 18px; 14 | position: absolute; 15 | top:5%; 16 | left:100px; 17 | border: solid 1px ##fdfdfd; 18 | width: 1100px; 19 | min-height: 500px; 20 | margin: auto; 21 | } 22 | 23 | .videos { 24 | margin-top: 2%; 25 | margin-left: 4%; 26 | } 27 | 28 | input { 29 | font-size: 18px; 30 | } 31 | 32 | .managerPanel { 33 | border: solid 1px #eef; 34 | background-color: #f8f8f8; 35 | position:absolute; 36 | left: 64%; 37 | top:0; 38 | width: 320px; 39 | height: 360px; 40 | margin-top: 2%; 41 | margin-left: 3%; 42 | } 43 | .panelTitle{ 44 | font-size:20px; 45 | text-align:center; 46 | padding:5px 0px 5px 0px; 47 | border-bottom:dotted 2px #eee; 48 | } 49 | .panelChild{ 50 | margin-top:4px; 51 | margin-left:30px; 52 | } 53 | 54 | .videoParam{ 55 | width:150px; 56 | text-align:left; 57 | } 58 | 59 | .panelButtons input{ 60 | width:100px; 61 | height:30px; 62 | margin-top:5px; 63 | margin-right:45px; 64 | } 65 | .videoParam { 66 | margin: 5px; 67 | } 68 | .videoManager{ 69 | border-collapse:none; 70 | } 71 | .videoDetail { 72 | background-color: #f7f7f7; 73 | margin: 30px auto; 74 | width: 1020px; 75 | min-height: 200px; 76 | border: solid 1px #eef; 77 | } 78 | .detailTitle{ 79 | padding:5px 0px 5px 0px; 80 | text-align:center; 81 | border-bottom:dotted 2px #eee; 82 | } 83 | .appManager{ 84 | margin-left:10px; 85 | height:50px; 86 | } 87 | .appManager td 88 | { 89 | text-align:center; 90 | width:80px; 91 | border-bottom:dotted 1px #eee; 92 | } 93 | .appManager th{ 94 | text-align:center; 95 | width:80px; 96 | border-bottom:dotted 1px #eee; 97 | } 98 | .appManager 99 | thead .list-input{ 100 | width:350px; 101 | } 102 | thead .list-output{ 103 | width:150px; 104 | } 105 | .list-input{ 106 | width:350px; 107 | font-size:10px; 108 | } 109 | .list-output{ 110 | width:200px; 111 | font-size:10px; 112 | } 113 | .closeVideoOnTable,.playVideoOnTable 114 | { 115 | width:50px; 116 | } 117 | .closeVideo,.playVideo{ 118 | width:50px; 119 | font-size:16px; 120 | } 121 | -------------------------------------------------------------------------------- /WebRoot/editplayer.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | playVideo 5 | 6 | 7 | 8 | 9 | 10 | 11 | 14 | 61 | 62 | 63 | 103 | 104 | 105 |
106 | 107 |
108 |
109 | 110 | 114 |
115 | 116 | 117 | 136 | 137 | 138 | 139 | -------------------------------------------------------------------------------- /WebRoot/img/eguidlogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eguid/livePush_Demo/977504434ab1cff5ad310db24c819e77eb2a4ce8/WebRoot/img/eguidlogo.png -------------------------------------------------------------------------------- /WebRoot/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 实时监控视频应用管理系统 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |

实时监控视频应用发布管理系统

17 |
18 |
19 | 20 | 25 |
26 | 27 |
28 |

发布一个视频应用

29 |
30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 |
38 |
39 |
40 | 41 |
42 |

当前运行的应用列表

43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 |
应用名视频源播放地址格式帧率分辨率音频
xxxrtsp://admin:admin@192.168.2.236:37779/cam/realmonitor?channel=1&subtype=0rtmp://192.168.30.21/live/text1flv25640x360true
应用名rtsp://admin:admin@192.168.2.236:37779/cam/realmonitor?channel=1&subtype=0rtmp://192.168.30.21/live/text1flv25640x360true
51 |
52 |
53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /WebRoot/js/liveService.js: -------------------------------------------------------------------------------- 1 | /* 2 | * 页面操作(发布,播放,删除,查看发布列表,查看发布信息) 3 | * 编写:wangliang 4 | */ 5 | //封装JsonAjax方法(请求类型,url,参数,成功方法) 6 | function JsonAjax(urltype,urlLink,paramData,sucessMethod){ 7 | $.ajax({ 8 | type:urltype, 9 | url:urlLink, 10 | data:paramData, 11 | dataType:"json", 12 | success:function(data){ 13 | sucessMethod(data); 14 | }, 15 | error:function(){ 16 | alert("服务器未开启或页面错误,请联系管理员"); 17 | } 18 | }); 19 | } 20 | //增强型ajax方法:增加一个回调参数方便回调方法调用;通过回调参数,回调方法就可以在调用方法后续无法处理的业务的时候处理后续动作,比如生成列表 21 | function EchoJsonAjax(urltype,urlLink,paramData,sucessMethod,async,index){ 22 | $.ajax({ 23 | type:urltype, 24 | url:urlLink, 25 | async:async, 26 | data:paramData, 27 | dataType:"json", 28 | contentType:"application/json,;charset=UTF-8", 29 | success:function(data){ 30 | //把回调参数给回调方法 31 | sucessMethod(data,index); 32 | }, 33 | error:function(){ 34 | alert("服务器未开启或页面错误,请联系管理员"); 35 | } 36 | }); 37 | } 38 | /* 39 | * --------------------发布应用事件----------------------- 40 | */ 41 | /** 42 | * 发布一个应用方法 43 | */ 44 | function pushApp(newMethod){ 45 | //自定义成功方法 46 | var appName=$("#p-appName").val(); 47 | var input=$("#p-input").val(); 48 | var output=$("#p-output").val(); 49 | var fmt=$("#p-fmt").val(); 50 | var fps=$("#p-fps").val(); 51 | var rs=$("#p-rs").val(); 52 | var disableAudio=$("#p-disableAudio").val(); 53 | if(isNull(appName)||isNull(input)||isNull(output)||isNull(fmt)||isNull(fps)||isNull(rs)||isNull(disableAudio)){ 54 | alert("发布失败,必须填写全部参数!"); 55 | return ; 56 | } 57 | var param=$("#appForm").serializeArray(); 58 | if(window.confirm("确定发布名称为:’"+appName+" ‘的实时应用?(提示:发布后该实时流(在不关闭的情况下)会一直保持推送状态)")){ 59 | if(newMethod){ 60 | JsonAjax("POST","live/push/"+appName,param,newMethod); 61 | }else{ 62 | JsonAjax("POST","live/push/"+appName,param,sucessPushApp); 63 | } 64 | } 65 | } 66 | //是否为空 67 | function isNull(element){ 68 | return element==null||new String(element).trim()==""; 69 | } 70 | /** 71 | * 成功返回方法:成功发布应用后更新应用列表 72 | * @param element 73 | */ 74 | function sucessPushApp(resultData){ 75 | if(resultData){ 76 | if(resultData.status==0){ 77 | //显示列表 78 | viewAll(); 79 | } 80 | //不管是否发布成功都要显示结果信息 81 | alert(resultData.msg); 82 | }else{ 83 | alert("服务器抽风了,请稍后再试!"); 84 | } 85 | } 86 | /* 87 | * -----------------关闭应用事件--------------- 88 | */ 89 | /** 90 | * 通过应用名关闭应用 91 | * @param element 92 | */ 93 | function closeApp(element){ 94 | var appName=$(element).parent().parent().data("appName"); 95 | if(window.confirm("停止这个实时应用?(提示:实时应用无法暂停,停止即删除)")){ 96 | EchoJsonAjax("DELETE","live/close/"+appName,"",sucessCloseApp,true,element); 97 | } 98 | } 99 | /** 100 | * 成功返回方法:成功关闭应用事件 101 | * @param resultData 102 | * @param index 103 | */ 104 | function sucessCloseApp(resultData,index){ 105 | if(resultData){ 106 | if(resultData.status==0){ 107 | //删除应用后刷新列表 108 | viewAll(); 109 | } 110 | alert(resultData.msg); 111 | }else{ 112 | alert("服务器抽风了 - -!"); 113 | } 114 | } 115 | /* 116 | * ----------------------查看应用详细事件------------------- 117 | */ 118 | /** 119 | * 查看应用详细信息 120 | * @param element:点击事件的按钮元素 121 | * @param sucessMethod:成功返回的方法 122 | * @param index:appName,该参数如果可用,element参数将自动失效 123 | * 124 | */ 125 | function view(element,sucessMethod,index){ 126 | var appName=index?index:$(element).parent().parent().data("appName"); 127 | JsonAjax("GET","live/view/"+appName,"",sucessMethod); 128 | } 129 | //成功获取应用详细(暂时不用) 130 | function sucessvViewApp(resultData,element){ 131 | 132 | } 133 | /* 134 | * --------------列表查询事件------------ 135 | */ 136 | /** 137 | * 查看当前全部应用方法 138 | */ 139 | function viewAll(){ 140 | JsonAjax("GET","live/viewAll","",sucessViewAllAppList); 141 | } 142 | /** 143 | * 成功返回方法:成功获取参数后把所有应用形成列表 144 | * @param resultData 145 | */ 146 | function sucessViewAllAppList(resultData){ 147 | if(resultData||resultData.status==0){ 148 | //每次生成要先把原数据删除再生成 149 | $("#appList").empty(); 150 | var listData=resultData.data; 151 | if(listData&&listData.length>0){ 152 | for(var i=0;i'+ 155 | listData[i].input+''+ 156 | listData[i].output+''+ 157 | listData[i].fmt+''+ 158 | listData[i].fps+''+ 159 | listData[i].rs+''+ 160 | listData[i].disableAudio+''+ 161 | ''+ 162 | ''; 163 | $(elementHTML).appendTo($("#appList")).data("appName",listData[i].appName); 164 | } 165 | }else{ 166 | alert(resultData.msg); 167 | //查询列表失败清空列表 168 | $("#appList").empty(); 169 | } 170 | }else{ 171 | alert("服务器抽风了 - -!"); 172 | //查询列表失败清空列表 173 | $("#appList").empty(); 174 | } 175 | } 176 | /* 177 | * -----------------发布并播放事件---------------- 178 | */ 179 | /** 180 | * 发布并播放方法 181 | */ 182 | function pushAndPlay(){ 183 | pushApp(sucesspushAndPlay); 184 | } 185 | /** 186 | * 成功返回方法:发布后播放器播放发布的应用 187 | */ 188 | function sucesspushAndPlay(resultData) 189 | { 190 | if(resultData){ 191 | if(resultData.status==0){ 192 | //显示列表 193 | viewAll(); 194 | var appName=resultData.data.appName; 195 | view(null,sucessPlayFromView,appName); 196 | } 197 | //不管是否发布成功都要显示结果信息 198 | alert(resultData.msg); 199 | }else{ 200 | alert("服务器抽风了,请稍后再试!"); 201 | } 202 | } 203 | /* 204 | * ----------------播放事件---------------- 205 | */ 206 | /** 207 | * 播放应用 208 | * @param element 209 | */ 210 | function playFromList(element){ 211 | if(window.confirm("播放这个实时应用?(提示:这将会关闭正在播放的应用)")){ 212 | view(element,sucessPlayFromView); 213 | } 214 | } 215 | /** 216 | * 成功获取应用播放地址并播放 217 | * @param resultData 218 | */ 219 | function sucessPlayFromView(resultData){ 220 | if(resultData){ 221 | if(resultData.status==0){ 222 | var playUrl=resultData.data.output+resultData.data.appName; 223 | //修改播放地址并播放 224 | writeAddressAndPlay(player,playUrl) 225 | }else{ 226 | alert(resultData.msg); 227 | } 228 | }else{ 229 | alert("服务器抽风了 - -!"); 230 | } 231 | } 232 | -------------------------------------------------------------------------------- /WebRoot/js/play.js: -------------------------------------------------------------------------------- 1 | 2 | //播放器实例 3 | var player = videojs('videoPlayer'); 4 | 5 | //播放器初始化操作面板清晰度菜单 6 | function playerInitVideo() { 7 | $videoPanelMenu = $(".vjs-fullscreen-control"); 8 | $videoPanelMenu.before(''); 14 | } 15 | //加载页面进行播放器初始化 16 | player.ready(function() { 17 | playerInitVideo(); 18 | //player.play(); 19 | //setsrc(player,"rtmp://192.168.30.21/live/test3","rtmp/flv"); 20 | }); 21 | 22 | //通过id获取DOM 23 | function get(index) { 24 | return document.getElementById(index); 25 | } 26 | //修改播放地址并播放 27 | function writeAddressAndPlay(index,url,type) { 28 | //播放器操作 29 | setsrc(index, url, type?type:"rtmp/flv"); 30 | play(index); 31 | } 32 | //高清标清切换就是应用名加减HD 33 | function changeUrl(video) { 34 | var index = $(video).text(); 35 | //获取当前播放的url 36 | var CurrentUrl = getCurrentAddr(player); 37 | $(".vjs-menu-item").removeClass("vjs-selected"); 38 | $(video).addClass("vjs-selected"); 39 | if (index == "高清") { 40 | if (CurrentUrl.indexOf("HD") == -1) { 41 | CurrentUrl = CurrentUrl + "HD"; 42 | } else { 43 | return; 44 | } 45 | } else { 46 | if (CurrentUrl.indexOf("HD") != -1) { 47 | CurrentUrl = CurrentUrl.replace("HD", ""); 48 | } else { 49 | return; 50 | } 51 | } 52 | //修改地址并播放 53 | writeAddressAndPlay(player, CurrentUrl); 54 | } 55 | -------------------------------------------------------------------------------- /WebRoot/js/videojsAPI.js: -------------------------------------------------------------------------------- 1 | /* 2 | * 根据videoJS官方文档编写的播放器常用操作 3 | */ 4 | 5 | //获取当前类型 6 | function getCurrentType(idnex) { 7 | return idnex.currentType(); 8 | } 9 | //获取当前播放地址 10 | function getCurrentAddr(index) { 11 | return index.currentSrc(); 12 | } 13 | //获取当前播放时间 14 | function getCurrentTime(index) { 15 | return index.currentTime(); 16 | } 17 | //获取当前网络状态 18 | function networkState(index) { 19 | return index.networkState(); 20 | } 21 | //修改播放地址 22 | function setsrc(index, url, type) { 23 | index.src({ 24 | type : type, 25 | src : url 26 | }); 27 | } 28 | //重载播放器 29 | function reset(index) { 30 | index.reset(); 31 | index.load(); 32 | } 33 | //播放 34 | function play(index) { 35 | index.play(); 36 | } 37 | //暂停 38 | function pause(index) { 39 | index.pause(); 40 | } -------------------------------------------------------------------------------- /WebRoot/play.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | play.html 5 | 6 | 7 | 8 | 54 | 59 | 60 | 61 |

视频一

62 | 63 | 64 | 65 |

视频二

66 | 67 | 68 | 69 |

视频三

70 | 71 | 72 | 73 |

视频四

74 | 75 | 76 | 77 |
78 |
79 | 83 |
84 |
85 | 89 |
90 |
91 | 95 |
96 |
97 | 101 |
102 |
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 | --------------------------------------------------------------------------------