使用 FFmpeg 生成 ts 切片并使用 AES-128 加密

前言

最近有个需求,需要将服务器视频资源进行加密提供给客户端播放,防止用户盗用视频。

常用的加密方式

m3u8切片加密(本文使用)

各种在线播放视频的网站广泛使用的技术,切片同样是使用AES加密算法。

优点:各种浏览器,手机,小程序都能兼容,通用性很好。
缺点:由于是公开的算法,还原也十分简单,有很多影音嗅探工具能直接下载还原,加密效果很弱,防小白可以,聊胜于无。
防翻录:无

文件流加密

采用异或或者AES等文件流加密方式,对文件数据进行处理。播放时动态解密相应的数据到内存再播放。

优点:加密和解密速度都很快。
缺点:必须使用专用的播放器才能解密,加密强度较弱,专业破解人员可写工具瞬间提取。
防翻录:通过播放器,APP实现

视频逐帧转码加密

加密强度最高但同时也是技术实现最麻烦的一种。软件需要读取源视频内部编码,逐帧把视频编码转为私有视频编码,通常是基于H264来改写为私有协议(即非标准H264算法)。

优点:由于采用私有视频编码协议,除非熟知视频内部编码规则,否则绝无破解或提取的可能,安全性极高。但这种加密方式对开发者技术要求较高,比较少公司使用。
缺点:必须使用专用的播放器才能解密,加密过程类似于视频转码,需要消耗比较长的加密时间。
防翻录:通过播放器,APP实现

环境要求

VLC播放器

openssl

ffmpeg

原理

核心原理其实就是讲解了一个视频源从正常的mp4格式如何变为加密后的m3u8文件+ts文件+key秘钥文件,之后使用vlc播放。

实验

使用 OpenSSL 生成密钥
openssl rand 16 > [密钥存放位置]

例如: openssl rand 16 > D:\openssl_key\encrypt.key

生成IV
openssl rand -hex 16

会生成一串字符串,后面会用到

本次案例生成的字符串: 10c27a9e3fa363dfe4c44b59b67304b3

编写keyinfo文件
http://localhost:8000/encrypt.key
D:\openssl_key\encrypt.key
10c27a9e3fa363dfe4c44b59b67304b3

一共有三段信息

第一段:解密文件路径,必须是URI,用来解密视频文件

第二段:是加密文件路径

第三段:之前生成的IV

FFmpeg 将视频切片且加密
ffmpeg -y -i D:\openssl_key\test.mp4 -c:v libx264 -c:a copy -f hls -hls_time 180 -hls_list_size 0 -hls_key_info_file D:\openssl_key\enc.keyinfo -hls_playlist_type vod -hls_segment_filename D:\openssl_key\file%d.ts D:\openssl_key\playlist.m3u8

命令参数解释

命令参数 解释
-y 不经过确认,输出时直接覆盖同名文件。
-c 指定编码器
-c copy 直接复制,不经过重新编码(这样比较快)
-i 指定输入文件
-title 设置标题
-author 设置作者
-copyright 设置版权
-f 强制设置输入输出的文件格式,默认情况下ffmpeg会根据文件后缀名判断文件格式
-hls_key_info_file keyinfo文件路径
-hls_time 每段文件的时间长度(单位:秒)
-hls_list_size 0 索引播放列表的最大列数 默认5,0 为不限制
-hls_playlist_type vod 表示当前的视频流并不是一个直播流,而是点播流
-hls_segment_filename 输出 ts和m3u8 文件路径中间空格 ,例如:D:\openssl_key\ file%d.ts D:\openssl_key\playlist.m3u8

%d:表示一位数字,从0开始。

最终执行结果

使用 FFmpeg 生成 ts 切片并使用 AES-128 加密_第1张图片

最后生成的文件

gGlBng.png

m3u8 文件
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:183
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-KEY:METHOD=AES-128,URI="http://localhost:8000/encrypt.key",IV=0x10c27a9e3fa363dfe4c44b59b67304b3
#EXTINF:182.625000,
file0.ts
#EXTINF:31.958333,
file1.ts
#EXT-X-ENDLIST

文件内容解析

#EXTM3U                    M3U8文件头,必须放在第一行;
#EXT-X-MEDIA-SEQUENCE      第一个TS分片的序列号,一般情况下是0,但是在直播场景下,这个序列号标识直播段的起始位置; #EXT-X-MEDIA-SEQUENCE:0
#EXT-X-TARGETDURATION      每个分片TS的最大的时长;   
#EXT-X-TARGETDURATION:10     每个分片的最大时长是 10s
#EXT-X-ALLOW-CACHE         是否允许cache;          
#EXT-X-ALLOW-CACHE:YES      
#EXT-X-ALLOW-CACHE:NO    默认情况下是YES
#EXT-X-ENDLIST             M3U8文件结束符;
#EXTINF                    extra info,分片TS的信息,如时长,带宽等;一般情况下是    
#EXTINF:,[] 后面可以跟着其他的信息,逗号之前是当前分片的ts时长,分片时长 移动要小于 
#EXT-X-TARGETDURATION 定义的值;
#EXT-X-VERSION             M3U8版本号
#EXT-X-DISCONTINUITY       该标签表明其前一个切片与下一个切片之间存在中断。下面会详解
#EXT-X-PLAYLIST-TYPE       表明流媒体类型;
#EXT-X-KEY                 是否加密解析,    
#EXT-X-KEY:METHOD=AES-128,URI="https://priv.example.com/key.php?r=52"    加密方式是AES-128,秘钥需要请求   https://priv.example.com/key.php?r=52  ,请求回来存储在本地;
</code></pre> 
  <h4>总结</h4> 
  <p>本篇文章简单的介绍了如何使用FFmpeg 将视频生成 ts 切片并使用 AES-128 加密。</p> 
  <p>windows 安装openssl</p> 
  <p>windows 安装 ffmpeg</p> 
 </div> 
</div>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1608734925383565312"></div>
                    <script type="text/javascript" src="/views/front/js/chanyan.js"></script>
                    <!-- 文章页-底部 动态广告位 -->
                    <div class="youdao-fixed-ad" id="detail_ad_bottom"></div>
                </div>
                <div class="col-md-3">
                    <div class="row" id="ad">
                        <!-- 文章页-右侧1 动态广告位 -->
                        <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_1"> </div>
                        </div>
                        <!-- 文章页-右侧2 动态广告位 -->
                        <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_2"></div>
                        </div>
                        <!-- 文章页-右侧3 动态广告位 -->
                        <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_3"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container">
        <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(FFmpeg,ffmpeg)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1883004843853934592.htm"
                           title="群晖通过docker安装emby server实现硬件转码" target="_blank">群晖通过docker安装emby server实现硬件转码</a>
                        <span class="text-muted">阿舒带你学编程</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a>
                        <div>群晖通过docker安装embyserver实现硬件转码白群晖DS918+现在套件中心安装docker和FFMPEG这两个套件。前者为了安装emby和其他很多应用,后者用来解码。emby镜像:emby/embyserver:latest但是如果想实现硬件解码,不能用群晖的docker来启动容器,而应该通过ssh登录到群晖上,然后sudo-i切换到root用户,再通过下面的命令:dockerrun-</div>
                    </li>
                    <li><a href="/article/1882955798280204288.htm"
                           title="Mac 安装iOS集成FFmpeg详细步骤" target="_blank">Mac 安装iOS集成FFmpeg详细步骤</a>
                        <span class="text-muted">郑州iOS</span>
<a class="tag" taget="_blank" href="/search/iOS/1.htm">iOS</a><a class="tag" taget="_blank" href="/search/%E5%B8%B8%E7%94%A8%E6%96%B9%E6%B3%95/1.htm">常用方法</a><a class="tag" taget="_blank" href="/search/ios%E9%9B%86%E6%88%90FFmpeg/1.htm">ios集成FFmpeg</a>
                        <div>Mac安装iOS集成FFmpeg详细步骤一、Mac安装FFmpeg1.下载FFmpeg安装文件下载地址(https://github.com/kewlbear/FFmpeg-iOS-build-script)2.解压里面包含三个文件uild-ffmpeg.sh为我们需要的3.打开终端切换至该文件所在目录执行./uild-ffmpeg.sh中间会提示需要其他相关东西yasm不必特意安装根据提示操作回</div>
                    </li>
                    <li><a href="/article/1882955672065208320.htm"
                           title="FFmpeg iOS 集成" target="_blank">FFmpeg iOS 集成</a>
                        <span class="text-muted">ihsdwj</span>
<a class="tag" taget="_blank" href="/search/iOS/1.htm">iOS</a><a class="tag" taget="_blank" href="/search/FFmpeg/1.htm">FFmpeg</a><a class="tag" taget="_blank" href="/search/iOS/1.htm">iOS</a><a class="tag" taget="_blank" href="/search/%E9%9F%B3%E8%A7%86%E9%A2%91%E8%A7%A3%E7%A0%81/1.htm">音视频解码</a>
                        <div>一、FFmpeg简介它包含可供应用程序使用的libavcodec,libavutil,libavformat,libavfilter,libavdevice,libswscale和libswresample。以及ffmpeg,ffplay和ffprobe可供最终用户用于转码和播放。适用于开发人员的FFmpeg库libavutil是一个包含用于简化编程的函数的库,包括随机数生成器,数据结构,数学例程</div>
                    </li>
                    <li><a href="/article/1882951380180725760.htm"
                           title="ios集成ffmpeg" target="_blank">ios集成ffmpeg</a>
                        <span class="text-muted">BulBulBox CEO</span>
<a class="tag" taget="_blank" href="/search/%E7%A7%BB%E5%8A%A8%E5%BC%80%E5%8F%91/1.htm">移动开发</a><a class="tag" taget="_blank" href="/search/ios/1.htm">ios</a><a class="tag" taget="_blank" href="/search/%E9%9F%B3%E8%A7%86%E9%A2%91/1.htm">音视频</a>
                        <div>首先ffmpeg应用了ios框架的库,所以使用ffmpeg的项目需要添加这些库,有可能还会出现libFDRDecode.dylib找不到的问题,缺啥补啥的原则</div>
                    </li>
                    <li><a href="/article/1882639933458411520.htm"
                           title="vue视频流播放,支持多种视频格式,如rmvb、mkv" target="_blank">vue视频流播放,支持多种视频格式,如rmvb、mkv</a>
                        <span class="text-muted">BigData-0</span>
<a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a>
                        <div>先将视频转码为tsffmpeg-iC:\test\3.rmvb-codec:copy-start_number0-hls_time10-hls_list_size0-fhlsC:\test\a\output.m3u8后端配置接口importorg.springframework.core.io.Resource;importorg.springframework.core.io.UrlResour</div>
                    </li>
                    <li><a href="/article/1882467159255347200.htm"
                           title="VideoFileClip 获取视频报错、" target="_blank">VideoFileClip 获取视频报错、</a>
                        <span class="text-muted">Tomorrow'sThinker</span>
<a class="tag" taget="_blank" href="/search/%E9%9F%B3%E8%A7%86%E9%A2%91/1.htm">音视频</a><a class="tag" taget="_blank" href="/search/moviepy/1.htm">moviepy</a>
                        <div>报错内容:OSError:MoviePyerror:failedtoreadthedurationoffile/mnt/data/test/monitor/videos/new_video/1652063723941.mkv.Herearethefileinfosreturnedbyffmpeg:ffmpegversion4.2.2-statichttps://johnvansickle.com/</div>
                    </li>
                    <li><a href="/article/1882311205285064704.htm"
                           title="25.FFmpeg学习笔记 - 用libavfilter转换原始音频格式2" target="_blank">25.FFmpeg学习笔记 - 用libavfilter转换原始音频格式2</a>
                        <span class="text-muted">whoyouare888</span>
<a class="tag" taget="_blank" href="/search/FFmpeg/1.htm">FFmpeg</a>
                        <div>本文用libavfilter的另一种方法来转换原始音频格式,见代码。#include#include#include#include#include"libavutil/channel_layout.h"#include"libavutil/md5.h"#include"libavutil/mem.h"#include"libavutil/opt.h"#include"libavutil/samp</div>
                    </li>
                    <li><a href="/article/1882305908592144384.htm"
                           title="android+ffmpeg库使用教程,适用于Android的ffmpeg(使用教程:“ ffmpeg和Android.mk”)..." target="_blank">android+ffmpeg库使用教程,适用于Android的ffmpeg(使用教程:“ ffmpeg和Android.mk”)...</a>
                        <span class="text-muted">OF COURSE想当然</span>

                        <div>我正在尝试为Android编译ffmpeg。我已经找到了关于该主题的几篇文章,但似乎都没有。如果尝试构建ffmpeg,它会发布在[1]上。是否有人使用这些教程成功编译了ffmpeg?我不确定如何实现步骤4到5。STEP4:配置...步骤5:CD到您的NDK根目录,键入makeTARGET_ARCH=armAPP=ffmpeg-org在我看来,按照第5步的教程中的说明构建类似的应用程序需要一些先前的</div>
                    </li>
                    <li><a href="/article/1882305150241009664.htm"
                           title="Android Studio中使用FFmpeg动态库" target="_blank">Android Studio中使用FFmpeg动态库</a>
                        <span class="text-muted">Getnway</span>
<a class="tag" taget="_blank" href="/search/Android/1.htm">Android</a><a class="tag" taget="_blank" href="/search/FFmpeg/1.htm">FFmpeg</a><a class="tag" taget="_blank" href="/search/NDK/1.htm">NDK</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/studio/1.htm">studio</a><a class="tag" taget="_blank" href="/search/%E5%8A%A8%E6%80%81%E5%BA%93/1.htm">动态库</a>
                        <div>使用FFmpeg动态库本文借鉴最简单的基于FFmpeg的移动端例子:AndroidHelloWorld,并介绍在AndroidStudio中的实现。项目地址:https://github.com/Getnway/FFmpegDemo本文介绍的是用NDK编译动态库,并在AndroidStudio中调用的步骤。准备项目需要有FFmpeg的动态库,如下文件(版本可以不同)。FFmpeg动态库编译参考Li</div>
                    </li>
                    <li><a href="/article/1882305024034402304.htm"
                           title="ffmpeg学习六:avcodec_open2函数源码分析" target="_blank">ffmpeg学习六:avcodec_open2函数源码分析</a>
                        <span class="text-muted">阳光玻璃杯</span>
<a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a><a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a><a class="tag" taget="_blank" href="/search/%E6%BA%90%E7%A0%81/1.htm">源码</a><a class="tag" taget="_blank" href="/search/codec/1.htm">codec</a><a class="tag" taget="_blank" href="/search/open/1.htm">open</a>
                        <div>上一节我们尝试分析了avformat_open_input函数的源码,这个函数的虽然比较复杂,但是它基本是围绕着创建和初始化一些数据结构来展开的,比如,avformat_open_input函数会创建和初始化AVFormatContext,AVClass,AVOption,URLContext,URLProtocol,AVInputFormat,AVStream等数据结构,这些数据结构的关系如下:</div>
                    </li>
                    <li><a href="/article/1882299983475044352.htm"
                           title="Android 使用FFmpeg静态库" target="_blank">Android 使用FFmpeg静态库</a>
                        <span class="text-muted">萌猫闯世界</span>
<a class="tag" taget="_blank" href="/search/FFmpeg/1.htm">FFmpeg</a><a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a>
                        <div>FFmpeg编译生成.a静态库译环境:Linux环境(Ubuntu14.04,x86_64)NDK版本(android-ndk-r17c)FFmpeg版本(ffmpeg-4.0.1):编写编译脚本:#!/bin/bashNDK=/home/qcg/android-ndk-r20bTOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64API=21fu</div>
                    </li>
                    <li><a href="/article/1882294190746955776.htm"
                           title="VS环境下调用ffmpeg库" target="_blank">VS环境下调用ffmpeg库</a>
                        <span class="text-muted">daqinzl</span>
<a class="tag" taget="_blank" href="/search/visual/1.htm">visual</a><a class="tag" taget="_blank" href="/search/studio/1.htm">studio</a><a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a>
                        <div>参考链接https://blog.csdn.net/lizhong2008/article/details/136692070</div>
                    </li>
                    <li><a href="/article/1882283476271558656.htm"
                           title="关于av_get_channel_layout_nb_channels函数" target="_blank">关于av_get_channel_layout_nb_channels函数</a>
                        <span class="text-muted">FancySuMMer11</span>
<a class="tag" taget="_blank" href="/search/qt/1.htm">qt</a><a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a>
                        <div>问题:ffmpeg5.1使用av_get_channel_layout_nb_channels函数时报错。过程:经过检查,发现对应头文件内已经不包含该函数。遂查找资料,发现在ffmpeg5.1之后该函数被废弃,具体而言,新增了AVChannelLayout。av_get_channel_layout_nb_channels(),useAVChannelLayout.nb_channelsinste</div>
                    </li>
                    <li><a href="/article/1882201505612754944.htm"
                           title="基于 FFMPEG 的视频编码(libavcodec ,致敬雷霄骅)" target="_blank">基于 FFMPEG 的视频编码(libavcodec ,致敬雷霄骅)</a>
                        <span class="text-muted">liyuanbhu</span>
<a class="tag" taget="_blank" href="/search/Qt/1.htm">Qt</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E6%8A%80%E6%9C%AF/1.htm">编程技术</a><a class="tag" taget="_blank" href="/search/%E9%9F%B3%E8%A7%86%E9%A2%91/1.htm">音视频</a><a class="tag" taget="_blank" href="/search/qt/1.htm">qt</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>基于FFMPEG的视频编码(libavcodec,致敬雷霄骅)本文参考了雷博士的博客:最简单的基于FFmpeg的视频编码器-更新版(YUV编码为HEVC(H.265))还参考了另一篇博客:Qt与FFmpeg联合开发指南(三)——编码(1):代码流程演示在为了代码简洁,代码中还用到了Qt。先不讲解具体的实现代码。大家先看看我封装后的类的使用方法。下面是一个简单的例子。这个例子先生成了一些QImage</div>
                    </li>
                    <li><a href="/article/1882198226359087104.htm"
                           title="利用ffmpeg将视频转为m3u8并加密" target="_blank">利用ffmpeg将视频转为m3u8并加密</a>
                        <span class="text-muted">daqinzl</span>
<a class="tag" taget="_blank" href="/search/%E6%B5%81%E5%AA%92%E4%BD%93/1.htm">流媒体</a><a class="tag" taget="_blank" href="/search/%E8%A7%86%E9%A2%91%E9%9F%B3%E9%A2%91/1.htm">视频音频</a><a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a><a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a><a class="tag" taget="_blank" href="/search/m3u8/1.htm">m3u8</a><a class="tag" taget="_blank" href="/search/%E5%8A%A0%E5%AF%86/1.htm">加密</a><a class="tag" taget="_blank" href="/search/%E8%A7%A3%E5%AF%86/1.htm">解密</a><a class="tag" taget="_blank" href="/search/openssl/1.htm">openssl</a>
                        <div>参考链接https://openatomworkshop.csdn.net/67457b7e3a01316874d8a2aa.html</div>
                    </li>
                    <li><a href="/article/1882197846329978880.htm"
                           title="【CicadaPlayer】ffmpeg内部头文件引用出错" target="_blank">【CicadaPlayer】ffmpeg内部头文件引用出错</a>
                        <span class="text-muted">等风来不如迎风去</span>
<a class="tag" taget="_blank" href="/search/%E5%AA%92%E4%BD%93%E6%92%AD%E6%94%BE%E5%99%A8%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0/1.htm">媒体播放器设计与实现</a><a class="tag" taget="_blank" href="/search/%E9%9F%B3%E8%A7%86%E9%A2%91/1.htm">音视频</a>
                        <div>头文件引用出现的问题3>G:\LLPP\RTCPLAYER\CicadaPlayerNBS\3rdparty\4.0\code\ffmpeg\libavcodec\x86\mathops.h(38,13</div>
                    </li>
                    <li><a href="/article/1882197719896879104.htm"
                           title="FFMPEG: [ 知识点 ] >对libavcodec依赖的模块--持续更新" target="_blank">FFMPEG: [ 知识点 ] >对libavcodec依赖的模块--持续更新</a>
                        <span class="text-muted">总是春</span>
<a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a><a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a>
                        <div>依赖libavcodec:h264_mp4toannexb_bsfaac_parserh264_parser</div>
                    </li>
                    <li><a href="/article/1882188640797388800.htm"
                           title="FFmpeg 头文件完美翻译之 libavcodec 模块" target="_blank">FFmpeg 头文件完美翻译之 libavcodec 模块</a>
                        <span class="text-muted">Leon_Chenl</span>
<a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a><a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a><a class="tag" taget="_blank" href="/search/libavcodec/1.htm">libavcodec</a><a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/%E9%9F%B3%E8%A7%86%E9%A2%91/1.htm">音视频</a><a class="tag" taget="_blank" href="/search/%E8%A7%86%E9%A2%91%E7%BC%96%E8%A7%A3%E7%A0%81/1.htm">视频编解码</a>
                        <div>前言众所周知,FFmpeg的代码开发上手难度较高,源于官方提供的文档很少有包含代码教程相关的。要想熟练掌握FFmpeg的代码库开发,需要借助它的头文件,FFmpeg把很多代码库教程都写在头文件里面。因此,熟读头文件的内容很重要,为此,我对FFmpeg6.x版本的头文件进行了翻译,方便大家阅读理解。相信我,通读一遍头文件的注释后,你的FFmpeg的代码库开发技能将更上一层。本文适用于有FFmpeg代</div>
                    </li>
                    <li><a href="/article/1882010320390647808.htm"
                           title="使用 Python结合ffmpeg 实现单线程和多线程推流" target="_blank">使用 Python结合ffmpeg 实现单线程和多线程推流</a>
                        <span class="text-muted">浪浪山小白兔</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a><a class="tag" taget="_blank" href="/search/opencv/1.htm">opencv</a>
                        <div>一、引言在本文中,我们将详细介绍如何使用Python进行视频的推流操作。我们将通过两个不同的实现方式,即单线程推流和多线程推流,来展示如何利用cv2(OpenCV)和subprocess等库将视频帧推送到指定的RTMP地址。这两种方式都涉及到从摄像头读取视频帧,以及使用ffmpeg命令行工具将视频帧进行编码和推流的过程。二、单线程推流以下是单线程推流的代码:importcv2ascvimports</div>
                    </li>
                    <li><a href="/article/1882008805252853760.htm"
                           title="RK3568笔记七十六:使用V4L2框架录制MP4视频保存到本地" target="_blank">RK3568笔记七十六:使用V4L2框架录制MP4视频保存到本地</a>
                        <span class="text-muted">殷忆枫</span>
<a class="tag" taget="_blank" href="/search/RK3568%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/1.htm">RK3568学习笔记</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a>
                        <div>若该文为原创文章,转载请注明原文出处。录制MP4使用的是ffmpeg,如何编译自行处理。使用的是正点原子的RK3568测试,其他板子自行调试。一、程序功能介绍说明:程序参考FFMPEG提供的例子程序muxing.c进行修改。功能介绍:程序里目前有一个子线程和一个主线程,子线程通过linux标准的V4L2框架读取摄像头数据(NV12);然后把NV12数据转换为YUV420P格式(H264必须使用该格</div>
                    </li>
                    <li><a href="/article/1882003380268756992.htm"
                           title="pythonAI算法中使用ffmpeg推流记录" target="_blank">pythonAI算法中使用ffmpeg推流记录</a>
                        <span class="text-muted">脱僵的的野码</span>
<a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a>
                        <div>首先呢需求是这样的需要在远端播放检测的画面这个事情解决的思路1.用的网络摄像头,将摄像头的流推到rtmp1流地址2.项目中的输入流就是rtmp1的地址视频流3.开始对视频各种检测,检测后将帧的frame推到rtmp24.随便找个播放器去播放rtmp2的流期间遇到了一些问题就是推上去的流在远端播放就直接裂开了大概4秒一卡顿,后来发现是ffmpg-r参数默认值是25我的frame推上去的流fps才11</div>
                    </li>
                    <li><a href="/article/1881990138121220096.htm"
                           title="算法项目实时推流" target="_blank">算法项目实时推流</a>
                        <span class="text-muted">zk_ken</span>
<a class="tag" taget="_blank" href="/search/php/1.htm">php</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>1、搭建流媒体服务器下载mediamtx2、视频流直推ffmpeg-stream_loop-1-iDJI_20250109112715_0002_W.MP4-r30-c:vlibx264-presetultrafast-fflvrtmp://192.168.100.20:1935/live/test_chengdu13、硬件加速如果硬件支持,可以使用硬件加速编码器(如h264_nvenc、h264</div>
                    </li>
                    <li><a href="/article/1881976704726003712.htm"
                           title="飞腾平台FFmpeg安装使用指南" target="_blank">飞腾平台FFmpeg安装使用指南</a>
                        <span class="text-muted"></span>

                        <div>【写在前面】飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力,聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域,包含了应用使能套件、软件仓库、软件支持、软件适配认证四大板块,旨在共享尖端技术,为开发者提供一个涵盖多领域的开发平台和工具套件。点击这里开始你的技术升级之旅吧本文分享至飞腾开发者平台《飞腾平台FFmpeg安装使</div>
                    </li>
                    <li><a href="/article/1881544189263540224.htm"
                           title="pythonffmpeg 推流_Python实现推流直播" target="_blank">pythonffmpeg 推流_Python实现推流直播</a>
                        <span class="text-muted">简单心理</span>
<a class="tag" taget="_blank" href="/search/pythonffmpeg/1.htm">pythonffmpeg</a><a class="tag" taget="_blank" href="/search/%E6%8E%A8%E6%B5%81/1.htm">推流</a>
                        <div>教程https://codingchaozhang.blog.csdn.net/article/details/102732555?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_rele</div>
                    </li>
                    <li><a href="/article/1881520338697777152.htm"
                           title="如何使用python下载B站视频并使用ffmpeg进行合流操作" target="_blank">如何使用python下载B站视频并使用ffmpeg进行合流操作</a>
                        <span class="text-muted">Zombie_man</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E9%9F%B3%E8%A7%86%E9%A2%91/1.htm">音视频</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a>
                        <div>需要了解的工具:先看看我发的第一期专栏,里面有关开发者模式的介绍,一些相关的请求库与解析库。本期专栏将不再赘诉。下载ffmpeg。下载官网链接:https://ffmpeg.org/download.html。注意:如果想要在cmd中使用,需要先配置环境变量有关于此的介绍与使用详细可以看此链接:https://zhuanlan.zhihu.com/p/356411237本期将导入subproces</div>
                    </li>
                    <li><a href="/article/1881335145995235328.htm"
                           title="FFmpeg 元数据" target="_blank">FFmpeg 元数据</a>
                        <span class="text-muted">yerennuo</span>
<a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a><a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a>
                        <div>文章目录元数据代码实例,查看元数据元数据在处理音视频文件时,了解其元数据信息是非常重要的。元数据是描述文件内容和属性的数据,包括了诸如标题、作者、时长、分辨率等信息。使用ACDictonaryAPI,可以查看元数据或者将元数据写入到AVFormatContext,AVStream,AVChapter和AVProgram结构体中,元数据保存在它们Metadata字段中。元数据是由一个键值对组成的。与</div>
                    </li>
                    <li><a href="/article/1881330473934843904.htm"
                           title="RV1126+FFMPEG推流项目(9)AI和AENC模块绑定,并且开启线程采集" target="_blank">RV1126+FFMPEG推流项目(9)AI和AENC模块绑定,并且开启线程采集</a>
                        <span class="text-muted">学习嵌入式的小羊~</span>
<a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a><a class="tag" taget="_blank" href="/search/%E9%9F%B3%E8%A7%86%E9%A2%91/1.htm">音视频</a>
                        <div>前面两篇已经交代AI和AENC模块的配置,这篇就让这两个模块绑定起来,绑定的原因是,Aenc从Ai模块拿到采集的原始数据进行编码。使用RK_MPI_SYS_Bind把AI节点和AENC进行绑定,其中enModId是模块ID号选择的是RK_ID_AI、s32ChnId是通道号,通道号则从容器AENC容器获取。开启AENC线程采集每一帧视频编码数据并存储到音频队列。绑定的函数是有rv1126通过的,R</div>
                    </li>
                    <li><a href="/article/1881330347505938432.htm"
                           title="RV1126+FFMPEG推流项目(1)总体框架讲解" target="_blank">RV1126+FFMPEG推流项目(1)总体框架讲解</a>
                        <span class="text-muted">学习嵌入式的小羊~</span>
<a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a><a class="tag" taget="_blank" href="/search/%E9%9F%B3%E8%A7%86%E9%A2%91/1.htm">音视频</a>
                        <div>音视频推流项目的讲解项目介绍本项目通过RV1126采集摄像头和麦克风数据,采用H.264/H.265视频编码技术和AAC音频编码技术进行压缩和合成复合流,然后推送到流媒体服务器。项目框图下图展示了整个项目的总体流程图,核心部分包括:暂时无法在飞书文档外展示此内容2.1视频采集与编码使用RV1126的API对CMOS摄像头进行采集,并进行H.264/H.265编码。编码后的视频数据存放到视频编码队列</div>
                    </li>
                    <li><a href="/article/1881329589477765120.htm"
                           title="06FFMPEG的AVCodecContext结构体分析" target="_blank">06FFMPEG的AVCodecContext结构体分析</a>
                        <span class="text-muted">Mango酱</span>
<a class="tag" taget="_blank" href="/search/FFMPEG/1.htm">FFMPEG</a><a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a><a class="tag" taget="_blank" href="/search/%E8%A7%86%E9%A2%91%E5%A4%84%E7%90%86/1.htm">视频处理</a>
                        <div>06FFMPEG的AVCodecContext结构体分析概述:该结构体位于libavcodec库中的avcodec.h中。1AVCodecContext编解码上下文结构体位于libavcodec库里。AVFormatContext,AVInputFormat,AVOutputFormat,AVStream均位于libavformat库里。最长的结构体,将近两千行。但是新版本avformat58.d</div>
                    </li>
                    <li><a href="/article/1881318616469663744.htm"
                           title="通过ShiftMediaProject生成ffmpeg的DLL和Lib的简要说明" target="_blank">通过ShiftMediaProject生成ffmpeg的DLL和Lib的简要说明</a>
                        <span class="text-muted">jyl_sh</span>
<a class="tag" taget="_blank" href="/search/webkit%E5%AD%A6%E4%B9%A0/1.htm">webkit学习</a><a class="tag" taget="_blank" href="/search/C%2FC%2B%2B/1.htm">C/C++</a><a class="tag" taget="_blank" href="/search/%E5%9B%BE%E5%BD%A2%E5%8C%96%E7%BC%96%E7%A8%8B/1.htm">图形化编程</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a><a class="tag" taget="_blank" href="/search/%E8%A7%86%E9%A2%91%E6%8E%A5%E5%8F%A3/1.htm">视频接口</a><a class="tag" taget="_blank" href="/search/chrome/1.htm">chrome</a><a class="tag" taget="_blank" href="/search/webkit/1.htm">webkit</a>
                        <div>这是将FFmpeg构建为msvcDLL和lib文件的一个小步骤说明文档。项目包含静态库文件的发布和调试版本(调试/发布)以及动态共享dll文件(DebugDLL/ReleaseDLL)。选择符合您要求的项目配置。注意:FFmpeg需要C99支持才能编译。只有VisualStudio2013或更新的版本才需要C99的功能不支持旧版本。需要VisualStudio2013或更新版本。如果使用旧的不受支</div>
                    </li>
                                <li><a href="/article/3.htm"
                                       title="枚举的构造函数中抛出异常会怎样" target="_blank">枚举的构造函数中抛出异常会怎样</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/enum/1.htm">enum</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E4%BE%8B/1.htm">单例</a>
                                    <div>首先从使用enum实现单例说起。 
 
为什么要用enum来实现单例? 
这篇文章( 
http://javarevisited.blogspot.sg/2012/07/why-enum-singleton-are-better-in-java.html)阐述了三个理由: 
1.enum单例简单、容易,只需几行代码: 
 

public enum Singleton {
	INSTANCE;</div>
                                </li>
                                <li><a href="/article/130.htm"
                                       title="CMake 教程" target="_blank">CMake 教程</a>
                                    <span class="text-muted">aigo</span>
<a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a>
                                    <div>转自:http://xiang.lf.blog.163.com/blog/static/127733322201481114456136/ 
  
CMake是一个跨平台的程序构建工具,比如起自己编写Makefile方便很多。 
介绍:http://baike.baidu.com/view/1126160.htm 
本文件不介绍CMake的基本语法,下面是篇不错的入门教程: 
http:</div>
                                </li>
                                <li><a href="/article/257.htm"
                                       title="cvc-complex-type.2.3: Element 'beans' cannot have character" target="_blank">cvc-complex-type.2.3: Element 'beans' cannot have character</a>
                                    <span class="text-muted">Cb123456</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/Webgis/1.htm">Webgis</a>
                                    <div>  cvc-complex-type.2.3: Element 'beans' cannot have character 
    Line 33 in XML document from ServletContext resource [/WEB-INF/backend-servlet.xml] is i</div>
                                </li>
                                <li><a href="/article/384.htm"
                                       title="jquery实例:随页面滚动条滚动而自动加载内容" target="_blank">jquery实例:随页面滚动条滚动而自动加载内容</a>
                                    <span class="text-muted">120153216</span>
<a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a>
                                    <div><script language="javascript">
$(function (){
	var i = 4;$(window).bind("scroll", function (event){
		//滚动条到网页头部的 高度,兼容ie,ff,chrome
		var top = document.documentElement.s</div>
                                </li>
                                <li><a href="/article/511.htm"
                                       title="将数据库中的数据转换成dbs文件" target="_blank">将数据库中的数据转换成dbs文件</a>
                                    <span class="text-muted">何必如此</span>
<a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/dbs/1.htm">dbs</a>
                                    <div>旗正规则引擎通过数据库配置器(DataBuilder)来管理数据库,无论是Oracle,还是其他主流的数据都支持,操作方式是一样的。旗正规则引擎的数据库配置器是用于编辑数据库结构信息以及管理数据库表数据,并且可以执行SQL 语句,主要功能如下。 
1)数据库生成表结构信息: 
        主要生成数据库配置文件(.conf文</div>
                                </li>
                                <li><a href="/article/638.htm"
                                       title="在IBATIS中配置SQL语句的IN方式" target="_blank">在IBATIS中配置SQL语句的IN方式</a>
                                    <span class="text-muted">357029540</span>
<a class="tag" taget="_blank" href="/search/ibatis/1.htm">ibatis</a>
                                    <div>在使用IBATIS进行SQL语句配置查询时,我们一定会遇到通过IN查询的地方,在使用IN查询时我们可以有两种方式进行配置参数:String和List。具体使用方式如下: 
 
1.String:定义一个String的参数userIds,把这个参数传入IBATIS的sql配置文件,sql语句就可以这样写: 
 
 
 
<select id="getForms" param</div>
                                </li>
                                <li><a href="/article/765.htm"
                                       title="Spring3 MVC 笔记(一)" target="_blank">Spring3 MVC 笔记(一)</a>
                                    <span class="text-muted">7454103</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/mvc/1.htm">mvc</a><a class="tag" taget="_blank" href="/search/bean/1.htm">bean</a><a class="tag" taget="_blank" href="/search/REST/1.htm">REST</a><a class="tag" taget="_blank" href="/search/JSF/1.htm">JSF</a>
                                    <div>    
     自从 MVC 这个概念提出来之后 struts1.X  struts2.X   jsf 。。。。。 
这个view 层的技术一个接一个! 都用过!不敢说哪个绝对的强悍! 
要看业务,和整体的设计! 
 
     最近公司要求开发个新系统!</div>
                                </li>
                                <li><a href="/article/892.htm"
                                       title="Timer与Spring Quartz 定时执行程序" target="_blank">Timer与Spring Quartz 定时执行程序</a>
                                    <span class="text-muted">darkranger</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/bean/1.htm">bean</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/quartz/1.htm">quartz</a>
                                    <div>有时候需要定时触发某一项任务。其实在jdk1.3,java sdk就通过java.util.Timer提供相应的功能。一个简单的例子说明如何使用,很简单: 1、第一步,我们需要建立一项任务,我们的任务需要继承java.util.TimerTask package com.test; import java.text.SimpleDateFormat; import java.util.Date; </div>
                                </li>
                                <li><a href="/article/1019.htm"
                                       title="大端小端转换,le32_to_cpu 和cpu_to_le32" target="_blank">大端小端转换,le32_to_cpu 和cpu_to_le32</a>
                                    <span class="text-muted">aijuans</span>
<a class="tag" taget="_blank" href="/search/C%E8%AF%AD%E8%A8%80%E7%9B%B8%E5%85%B3/1.htm">C语言相关</a>
                                    <div>大端小端转换,le32_to_cpu 和cpu_to_le32   字节序  
http://oss.org.cn/kernel-book/ldd3/ch11s04.html 
        小心不要假设字节序. PC 存储多字节值是低字节为先(小端为先, 因此是小端), 一些高级的平台以另一种方式(大端)</div>
                                </li>
                                <li><a href="/article/1146.htm"
                                       title="Nginx负载均衡配置实例详解" target="_blank">Nginx负载均衡配置实例详解</a>
                                    <span class="text-muted">avords</span>

                                    <div>[导读] 负载均衡是我们大流量网站要做的一个东西,下面我来给大家介绍在Nginx服务器上进行负载均衡配置方法,希望对有需要的同学有所帮助哦。负载均衡先来简单了解一下什么是负载均衡,单从字面上的意思来理解就可以解  负载均衡是我们大流量网站要做的一个东西,下面我来给大家介绍在Nginx服务器上进行负载均衡配置方法,希望对有需要的同学有所帮助哦。 
负载均衡 
先来简单了解一下什么是负载均衡</div>
                                </li>
                                <li><a href="/article/1273.htm"
                                       title="乱说的" target="_blank">乱说的</a>
                                    <span class="text-muted">houxinyou</span>
<a class="tag" taget="_blank" href="/search/%E6%A1%86%E6%9E%B6/1.htm">框架</a><a class="tag" taget="_blank" href="/search/%E6%95%8F%E6%8D%B7%E5%BC%80%E5%8F%91/1.htm">敏捷开发</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95/1.htm">软件测试</a>
                                    <div>从很久以前,大家就研究框架,开发方法,软件工程,好多!反正我是搞不明白!   
这两天看好多人研究敏捷模型,瀑布模型!也没太搞明白.    
不过感觉和程序开发语言差不多,   
瀑布就是顺序,敏捷就是循环.    
瀑布就是需求、分析、设计、编码、测试一步一步走下来。而敏捷就是按摸块或者说迭代做个循环,第个循环中也一样是需求、分析、设计、编码、测试一步一步走下来。   
  
也可以把软件开发理</div>
                                </li>
                                <li><a href="/article/1400.htm"
                                       title="欣赏的价值——一个小故事" target="_blank">欣赏的价值——一个小故事</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/%E6%9C%89%E6%95%88%E8%BE%85%E5%AF%BC/1.htm">有效辅导</a><a class="tag" taget="_blank" href="/search/%E6%AC%A3%E8%B5%8F/1.htm">欣赏</a><a class="tag" taget="_blank" href="/search/%E6%AC%A3%E8%B5%8F%E7%9A%84%E4%BB%B7%E5%80%BC/1.htm">欣赏的价值</a>
                                    <div>  第一次参加家长会,幼儿园的老师说:"您的儿子有多动症,在板凳上连三分钟都坐不了,你最好带他去医院看一看。"  回家的路上,儿子问她老师都说了些什么,她鼻子一酸,差点流下泪来。因为全班30位小朋友,惟有他表现最差;惟有对他,老师表现出不屑,然而她还在告诉她的儿子:"老师表扬你了,说宝宝原来在板凳上坐不了一分钟,现在能坐三分钟。其他妈妈都非常羡慕妈妈,因为全班只有宝宝</div>
                                </li>
                                <li><a href="/article/1527.htm"
                                       title="包冲突问题的解决方法" target="_blank">包冲突问题的解决方法</a>
                                    <span class="text-muted">bingyingao</span>
<a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a><a class="tag" taget="_blank" href="/search/exclusions/1.htm">exclusions</a><a class="tag" taget="_blank" href="/search/%E5%8C%85%E5%86%B2%E7%AA%81/1.htm">包冲突</a>
                                    <div>包冲突是开发过程中很常见的问题: 
其表现有: 
1.明明在eclipse中能够索引到某个类,运行时却报出找不到类。 
2.明明在eclipse中能够索引到某个类的方法,运行时却报出找不到方法。 
3.类及方法都有,以正确编译成了.class文件,在本机跑的好好的,发到测试或者正式环境就 
抛如下异常: 
 
java.lang.NoClassDefFoundError: Could not in</div>
                                </li>
                                <li><a href="/article/1654.htm"
                                       title="【Spark七十五】Spark Streaming整合Flume-NG三之接入log4j" target="_blank">【Spark七十五】Spark Streaming整合Flume-NG三之接入log4j</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/Stream/1.htm">Stream</a>
                                    <div>先来一段废话: 
实际工作中,业务系统的日志基本上是使用Log4j写入到日志文件中的,问题的关键之处在于业务日志的格式混乱,这给对日志文件中的日志进行统计分析带来了极大的困难,或者说,基本上无法进行分析,每个人写日志的习惯不同,导致日志行的格式五花八门,最后只能通过grep来查找特定的关键词缩小范围,但是在集群环境下,每个机器去grep一遍,分析一遍,这个效率如何可想之二,大好光阴都浪费在这上面了</div>
                                </li>
                                <li><a href="/article/1781.htm"
                                       title="sudoku solver in Haskell" target="_blank">sudoku solver in Haskell</a>
                                    <span class="text-muted">bookjovi</span>
<a class="tag" taget="_blank" href="/search/sudoku/1.htm">sudoku</a><a class="tag" taget="_blank" href="/search/haskell/1.htm">haskell</a>
                                    <div>这几天没太多的事做,想着用函数式语言来写点实用的程序,像fib和prime之类的就不想提了(就一行代码的事),写什么程序呢?在网上闲逛时发现sudoku游戏,sudoku十几年前就知道了,学生生涯时也想过用C/Java来实现个智能求解,但到最后往往没写成,主要是用C/Java写的话会很麻烦。 
  
现在写程序,本人总是有一种思维惯性,总是想把程序写的更紧凑,更精致,代码行数最少,所以现</div>
                                </li>
                                <li><a href="/article/1908.htm"
                                       title="java apache ftpClient" target="_blank">java apache ftpClient</a>
                                    <span class="text-muted">bro_feng</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>最近使用apache的ftpclient插件实现ftp下载,遇见几个问题,做如下总结。 
1. 上传阻塞,一连串的上传,其中一个就阻塞了,或是用storeFile上传时返回false。查了点资料,说是FTP有主动模式和被动模式。将传出模式修改为被动模式ftp.enterLocalPassiveMode();然后就好了。 
 
看了网上相关介绍,对主动模式和被动模式区别还是比较的模糊,不太了解被动模</div>
                                </li>
                                <li><a href="/article/2035.htm"
                                       title="读《研磨设计模式》-代码笔记-工厂方法模式" target="_blank">读《研磨设计模式》-代码笔记-工厂方法模式</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a>
                                    <div>声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/ 
 
 
 
 


package design.pattern;

/*
 * 工厂方法模式:使一个类的实例化延迟到子类
 * 某次,我在工作不知不觉中就用到了工厂方法模式(称为模板方法模式更恰当。2012-10-29):
 * 有很多不同的产品,它</div>
                                </li>
                                <li><a href="/article/2162.htm"
                                       title="面试记录语" target="_blank">面试记录语</a>
                                    <span class="text-muted">chenyu19891124</span>
<a class="tag" taget="_blank" href="/search/%E6%8B%9B%E8%81%98/1.htm">招聘</a>
                                    <div>或许真的在一个平台上成长成什么样,都必须靠自己去努力。有了好的平台让自己展示,就该好好努力。今天是自己单独一次去面试别人,感觉有点小紧张,说话有点打结。在面试完后写面试情况表,下笔真的好难,尤其是要对面试人的情况说明真的好难。 
今天面试的是自己同事的同事,现在的这个同事要离职了,介绍了我现在这位同事以前的同事来面试。今天这位求职者面试的是配置管理,期初看了简历觉得应该很适合做配置管理,但是今天面</div>
                                </li>
                                <li><a href="/article/2289.htm"
                                       title="Fire Workflow 1.0正式版终于发布了" target="_blank">Fire Workflow 1.0正式版终于发布了</a>
                                    <span class="text-muted">comsci</span>
<a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/workflow/1.htm">workflow</a><a class="tag" taget="_blank" href="/search/Google/1.htm">Google</a>
                                    <div>Fire Workflow 是国内另外一款开源工作流,作者是著名的非也同志,哈哈.... 
 官方网站是 http://www.fireflow.org 
 
 经过大家努力,Fire Workflow 1.0正式版终于发布了 
 
 正式版主要变化: 
1、增加IWorkItem.jumpToEx(...)方法,取消了当前环节和目标环节必须在同一条执行线的限制,使得自由流更加自由 
2、增加IT</div>
                                </li>
                                <li><a href="/article/2416.htm"
                                       title="Python向脚本传参" target="_blank">Python向脚本传参</a>
                                    <span class="text-muted">daizj</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E8%84%9A%E6%9C%AC/1.htm">脚本</a><a class="tag" taget="_blank" href="/search/%E4%BC%A0%E5%8F%82/1.htm">传参</a>
                                    <div>如果想对python脚本传参数,python中对应的argc, argv(c语言的命令行参数)是什么呢? 
需要模块:sys 
参数个数:len(sys.argv) 
脚本名:    sys.argv[0] 
参数1:     sys.argv[1] 
参数2:     sys.argv[</div>
                                </li>
                                <li><a href="/article/2543.htm"
                                       title="管理用户分组的命令gpasswd" target="_blank">管理用户分组的命令gpasswd</a>
                                    <span class="text-muted">dongwei_6688</span>
<a class="tag" taget="_blank" href="/search/passwd/1.htm">passwd</a>
                                    <div>NAME:  gpasswd - administer the /etc/group file 
SYNOPSIS: 
 gpasswd group 
 gpasswd -a user group 
 gpasswd -d user group 
 gpasswd -R group 
 gpasswd -r group 
 gpasswd [-A user,...] [-M user,...] g</div>
                                </li>
                                <li><a href="/article/2670.htm"
                                       title="郝斌老师数据结构课程笔记" target="_blank">郝斌老师数据结构课程笔记</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/1.htm">数据结构与算法</a>
                                    <div><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<</div>
                                </li>
                                <li><a href="/article/2797.htm"
                                       title="yii2 cgridview加上选择框进行操作" target="_blank">yii2 cgridview加上选择框进行操作</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/GridView/1.htm">GridView</a>
                                    <div>页面代码
<?=Html::beginForm(['controller/bulk'],'post');?>
<?=Html::dropDownList('action','',[''=>'Mark selected as: ','c'=>'Confirmed','nc'=>'No Confirmed'],['class'=>'dropdown',])</div>
                                </li>
                                <li><a href="/article/2924.htm"
                                       title="linux mysql" target="_blank">linux mysql</a>
                                    <span class="text-muted">fypop</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                                    <div>enquiry mysql version in centos linux 
yum list installed | grep mysql 
yum -y remove mysql-libs.x86_64 
enquiry mysql version in yum repositoryyum list | grep mysql oryum -y list mysql* 
install mysq</div>
                                </li>
                                <li><a href="/article/3051.htm"
                                       title="Scramble String" target="_blank">Scramble String</a>
                                    <span class="text-muted">hcx2013</span>
<a class="tag" taget="_blank" href="/search/String/1.htm">String</a>
                                    <div>Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrings recursively. 
Below is one possible representation of s1 = "great":</div>
                                </li>
                                <li><a href="/article/3178.htm"
                                       title="跟我学Shiro目录贴" target="_blank">跟我学Shiro目录贴</a>
                                    <span class="text-muted">jinnianshilongnian</span>
<a class="tag" taget="_blank" href="/search/%E8%B7%9F%E6%88%91%E5%AD%A6shiro/1.htm">跟我学shiro</a>
                                    <div>历经三个月左右时间,《跟我学Shiro》系列教程已经完结,暂时没有需要补充的内容,因此生成PDF版供大家下载。最近项目比较紧,没有时间解答一些疑问,暂时无法回复一些问题,很抱歉,不过可以加群(334194438/348194195)一起讨论问题。 
  
  
----广告-----------------------------------------------------</div>
                                </li>
                                <li><a href="/article/3305.htm"
                                       title="nginx日志切割并使用flume-ng收集日志" target="_blank">nginx日志切割并使用flume-ng收集日志</a>
                                    <span class="text-muted">liyonghui160com</span>

                                    <div>  
   nginx的日志文件没有rotate功能。如果你不处理,日志文件将变得越来越大,还好我们可以写一个nginx日志切割脚本来自动切割日志文件。第一步就是重命名日志文件,不用担心重命名后nginx找不到日志文件而丢失日志。在你未重新打开原名字的日志文件前,nginx还是会向你重命名的文件写日志,linux是靠文件描述符而不是文件名定位文件。第二步向nginx主</div>
                                </li>
                                <li><a href="/article/3432.htm"
                                       title="Oracle死锁解决方法" target="_blank">Oracle死锁解决方法</a>
                                    <span class="text-muted">pda158</span>
<a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a>
                                    <div> select p.spid,c.object_name,b.session_id,b.oracle_username,b.os_user_name from v$process p,v$session a, v$locked_object b,all_objects c where p.addr=a.paddr and a.process=b.process and c.object_id=b.</div>
                                </li>
                                <li><a href="/article/3559.htm"
                                       title="java之List排序" target="_blank">java之List排序</a>
                                    <span class="text-muted">shiguanghui</span>
<a class="tag" taget="_blank" href="/search/list%E6%8E%92%E5%BA%8F/1.htm">list排序</a>
                                    <div>   在Java Collection Framework中定义的List实现有Vector,ArrayList和LinkedList。这些集合提供了对对象组的索引访问。他们提供了元素的添加与删除支持。然而,它们并没有内置的元素排序支持。   你能够使用java.util.Collections类中的sort()方法对List元素进行排序。你既可以给方法传递</div>
                                </li>
                                <li><a href="/article/3686.htm"
                                       title="servlet单例多线程" target="_blank">servlet单例多线程</a>
                                    <span class="text-muted">utopialxw</span>
<a class="tag" taget="_blank" href="/search/%E5%8D%95%E4%BE%8B/1.htm">单例</a><a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">多线程</a><a class="tag" taget="_blank" href="/search/servlet/1.htm">servlet</a>
                                    <div>转自http://www.cnblogs.com/yjhrem/articles/3160864.html 
和   http://blog.chinaunix.net/uid-7374279-id-3687149.html 
Servlet 单例多线程 
Servlet如何处理多个请求访问?Servlet容器默认是采用单实例多线程的方式处理多个请求的:1.当web服务器启动的</div>
                                </li>
                </ul>
            </div>
        </div>
    </div>

<div>
    <div class="container">
        <div class="indexes">
            <strong>按字母分类:</strong>
            <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a
                href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a
                href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a
                href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a
                href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a
                href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a
                href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a
                href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a
                href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a>
        </div>
    </div>
</div>
<footer id="footer" class="mb30 mt30">
    <div class="container">
        <div class="footBglm">
            <a target="_blank" href="/">首页</a> -
            <a target="_blank" href="/custom/about.htm">关于我们</a> -
            <a target="_blank" href="/search/Java/1.htm">站内搜索</a> -
            <a target="_blank" href="/sitemap.txt">Sitemap</a> -
            <a target="_blank" href="/custom/delete.htm">侵权投诉</a>
        </div>
        <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.
<!--            <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>-->
        </div>
    </div>
</footer>
<!-- 代码高亮 -->
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script>
<link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/>
<script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script>





</body>

</html>