`
pypy
  • 浏览: 91894 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

lighttpd对flv视频文件的拖动一种变形

阅读更多
当前流行的视频网站,关于视频的在线拖动观看技术的小试,

1.flv文件
  flv视频文件,想大家都比较清楚,只要从关键帧的位置切开,并加上"FLV\x1\x1\0\0\0\x9\0\0\0\x9"公共头标志信息,后对任何支持flv视频文件dencoder的播放器都是可以正常播放的
  
  "FLV\x1\x1\0\0\0\x9\0\0\0\x9" + keyframe(body)

2.lighttpd中的mod_flv_streaming.c模块 (重点)

  http://www.lighttpd.net/
 
  http://blog.lighttpd.net/articles/2006/03/09/flv-streaming-with-lighttpd

  这里通过http的get方法,向服务器请求指定的视频片段

  形如: http://youserver.com/flv/abcdefg.flv?start=12345

  mod_flv_streaming.c默认的方式是,从start(文件的物理位置offset)的开始,默认到文件结束。
 
   相关服务器代码如下:

for (k = 0; k < p->conf.extensions->used; k++) {
		data_string *ds = (data_string *)p->conf.extensions->data[k];
		int ct_len = ds->value->used - 1;

		if (ct_len > s_len) continue;
		if (ds->value->used == 0) continue;

		if (0 == strncmp(con->physical.path->ptr + s_len - ct_len, ds->value->ptr, ct_len)) {
			data_string *get_param;
			stat_cache_entry *sce = NULL;
			buffer *b;
			int start;
			char *err = NULL;
			/* if there is a start=[0-9]+ in the header use it as start,
			 * otherwise send the full file */

			array_reset(p->get_params);
			buffer_copy_string_buffer(p->query_str, con->uri.query);
			split_get_params(p->get_params, p->query_str);
/*这个是重点,获得客户端的播放器通过get方法传来的start(文件拖动的开始位置offset)*/
			if (NULL == (get_param = (data_string *)array_get_element(p->get_params, "start"))) {
				return HANDLER_GO_ON;
			}

			/* too short */
			if (get_param->value->used < 2) return HANDLER_GO_ON;

			/* check if it is a number */
			start = strtol(get_param->value->ptr, &err, 10);
			if (*err != '\0') {
				return HANDLER_GO_ON;
			}

			if (start <= 0) return HANDLER_GO_ON;

			/* check if start is > filesize */
			if (HANDLER_GO_ON != stat_cache_get_entry(srv, con, con->physical.path, &sce)) {
				return HANDLER_GO_ON;
			}

			if (start > sce->st.st_size) {
				return HANDLER_GO_ON;
			}

			/* we are safe now, let's build a flv header */
			b = chunkqueue_get_append_buffer(con->write_queue);
                        
                        /*准备发送给客户端播放器的flv公共头信息13字节*/
			buffer_copy_string_len(b, CONST_STR_LEN("FLV\x1\x1\0\0\0\x9\0\0\0\x9"));
                        
                        /*发送seek到的拖动关键桢的位置keyframe, 并计算出从拖动点到该视频文件结束的长度*/
			http_chunk_append_file(srv, con, con->physical.path, start, sce->st.st_size - start);
                       /* http相关信息的填充*/
			response_header_overwrite(srv, con, CONST_STR_LEN("Content-Type"), CONST_STR_LEN("video/x-flv"));

			con->file_finished = 1;
                       /*done, 处理拖动完成*/
			return HANDLER_FINISHED


3 对客户端的播放器而言,服务器对flv文件的拖动支持是透明的,
  只要播放器安照合法的get方法向服务器请求,即可得到可以播放的视频片段,
  但是这里的start=xxxx,一定是flv视频文件的关键桢位置,否则不能播放
  一般而言,对flv视频文件可以使用
  yamdi
  http://yamdi.sourceforge.net/
  加上metadata信息,即可完美支持拖动,
  播放器可以再第一次请求视频文件的时候获得该视频的metadata信息(即包含关键桢,时间,等等与视频相关的信息)

4.以上讨论的,都是lighttpd-mod_flv_streaming.c默认的对flv的拖动支持,
  其实可以,做一些简单的扩展,
  可以增加end参数,即是增加拖动的结束参数,
  假设,很多用户并不会观看视频到结束,
  每次请求N字节
  http://youserver.com/flv/abcdefg.flv?start=23456&end=23456+N
  播放器可以增加这样的功能,
  a.先请求某一段视频
  b.当当前视频片段没有播放完毕之前,不会去请求下一个片段,
    只有当当前视频片段在即将播放结束的时候,再去请求下一个片段,
    这样,当用户,看了前面的某一片段后,突然关闭该播放页,以至于不会白白浪费掉那已经download到本地,但是并没有观看的视频,节余带宽

  粗略代码实现如下:


if (NULL != (get_param = (data_string *)array_get_element(p->get_params, "start"))) 
{

    /* too short */
    if (get_param->value->used < 2) 
					return HANDLER_GO_ON;

			    /* check if it is a number */
			    start = strtol(get_param->value->ptr, &err, 10);
			    if (*err != '\0') 
				{
				    return HANDLER_GO_ON;
			    }
			    
			    /* check if tflvbegin is >= 0 */
			    if (start < 0) 
					return HANDLER_GO_ON;

			    /* check if start is > filesize */
			    if (start > sce->st.st_size) 
				{
				    return HANDLER_GO_ON;
			    }
			}
			else 
			{
				return HANDLER_GO_ON;
			}
                        
			/* if there is a start=[0-9]+ in the header use it as end,
			 * otherwise send the full file */
/*这里重点,仿照lighttpd如何获得get方法的中的start,同理获得end参数, 并做一些必要的合法性检查*/
			if (NULL != (get_param = (data_string *)array_get_element(p->get_params, "end"))) 
			{
			    /* too short */
			    if (get_param->value->used < 2) 
					return HANDLER_GO_ON;

			    /* check if it is a number */
			    end = strtol(get_param->value->ptr, &err, 10);
			    if (*err != '\0') 
				{
				    return HANDLER_GO_ON;
			    }

			    /*参数检查,必须*/
			    /* check if end is > 0 
			     * check if start < end 
			     * make sure star > 0 
			     * */
			    if (end <= 0 || start >= end) 
					return HANDLER_GO_ON;

			    /* check if end is > filesize */
			    if (end > sce->st.st_size) 
				{
					//return HANDLER_GO_ON;
					tflvend = sce->st.st_size; /* path tflvend is not right */
			    }
			}
			else 
			{
				return HANDLER_GO_ON;
			
    
   }

/* we are safe now, let's build a flv header */
			b = chunkqueue_get_append_buffer(con->write_queue);
                        
                        /*准备发送给客户端播放器的flv公共头信息13字节*/
			buffer_copy_string_len(b, CONST_STR_LEN("FLV\x1\x1\0\0\0\x9\0\0\0\x9"));

                      /*这个是重点,以前默认的是发送的数据长度是用 fileseize-start, 现在要用end替代filesize, 即是 end-start*/
			http_chunk_append_file(srv, con, con->physical.path, start, end - start);
			response_header_overwrite(srv, con, CONST_STR_LEN("Content-Type"), CONST_STR_LEN("video/x-flv"));
			con->file_finished = 1;
			return HANDLER_FINISHED



-------------------------------------
gamil:bychyahoo@gmail.com
2
0
分享到:
评论
3 楼 pypy 2009-11-01  
yanglaoshi5891 写道
对于http://youserver.com/flv/abcdefg.flv?start=23456这种形式,为什么我连接时总是报错了?服务端是用的供应商的,也说已经支持start的写法了,是不是加了start后,不能再使用
var ncVideo:NetConnection=new NetConnection();
		ncVideo.connect(null);
		nsVideo=new NetStream(ncVideo);
		nsVideo.play(vfile);

这种方式进行连接了?


我这边想2点

1. 你确定你的start=的数据,是从 flv文件中的 metadata中得到的(flv的metadata信息里面包括关键帧对应播放时间点的数组)

2. 在确保第1步正确的情况下,可以使用任何下载工具(我这边推荐用wget或者curl)去下载 http://youserver.com/flv/abcdefg.flv?start=23456 的数据,
如果正确的话,下载到的数据,应该在任何播放器中都是可以播放的,

以上2点,测试后,如果还没有确定问题所在的话,可以再联系我,大家一起研究下

(以上都在建立在你使用的server是正确支持flv拖动功能的server)


gmail: jsonkey@gmail.com
2 楼 yanglaoshi5891 2009-10-29  
对于http://youserver.com/flv/abcdefg.flv?start=23456这种形式,为什么我连接时总是报错了?服务端是用的供应商的,也说已经支持start的写法了,是不是加了start后,不能再使用
var ncVideo:NetConnection=new NetConnection();
		ncVideo.connect(null);
		nsVideo=new NetStream(ncVideo);
		nsVideo.play(vfile);

这种方式进行连接了?
1 楼 ibio 2009-07-07  
真好,这样好的东西竟然没有人顶,晕!~~

相关推荐

    搭建lighttpd+cgi的代码包

    压缩包文件`lighttpd_cgi`可能包含示例CGI脚本、lighttpd配置示例以及其他辅助文件,用于帮助初学者更好地理解和实践lighttpd与CGI的结合使用。解压并研究这些文件,可以帮助你深入理解这一过程。 总结,通过上述...

    lighttpd with H264 support

    H264,也称为AVC(Advanced Video Coding),是一种高效的视频编码标准,能够在较低的带宽下提供高质量的视频流。这使得它成为在线视频服务的理想选择,尤其是在移动设备上,用户通常受限于有限的数据流量。 接下来...

    lighttpd配置和启动脚本

    一、lighttpd.conf配置文件详解 1. **基本设置**:`server.document-root` 指定Web服务器的根目录,是服务器将要服务的静态文件(如HTML、CSS、JavaScript等)的存放位置。 2. **端口设置**:`server.port` 定义了...

    lighttpd 安装配置

    在Lighttpd安装目录下的`doc`目录中,有一个示例配置文件`lighttpd.conf`,可以将其复制到`conf`目录,并进行编辑: ``` mkdir conf cp /path/to/lighttpd-1.4.8/doc/lighttpd.conf /usr/local/lighttpd/conf/ ``` ...

    lighttpd-1.4.45_lighttpd服务器_

    lighttpd-1.4.45是lighttpd服务器的一个重要版本,它以其小巧、安全的特性,为开发者和嵌入式平台提供了一种高效的服务选择。 lighttpd,顾名思义,强调的是“轻”——轻量级、低资源消耗。它的设计目标是提供一个...

    lighttpd+php in android

    这可能涉及到安装NDK(Android Native Development Kit),设置交叉编译工具链,并对lighttpd的配置文件进行调整以适应Android的环境。 2. **下载PHP-CGI**:可以从PHP官方网站获取适用于Android的预编译版本,或者...

    lighttpd代码阅读资料

    4.配置解析:lighttpd的配置文件由一系列指令组成,这些指令在启动时被解析并转化为内部结构,影响服务器的行为。 三、代码阅读策略 1. 了解基础架构:首先,应熟悉lighttpd的整体架构,包括主循环、连接管理、...

    lighttpd-1.4.20-cmake

    CMake是一种跨平台的构建工具,它可以生成特定平台的构建文件,如Unix下的Makefile或Windows的Visual Studio项目。CMake使用CMakeLists.txt文件来描述构建过程,使得开发者可以在不同平台上保持一致的构建步骤,这...

    web_share:通过Lighttpd分享文件,实现上传下载

    web_share通过Lighttpd分享文件,实现上传下载为什么用Lighttpd?因为它安装包小……为什么这么简陋?因为我菜。欢迎提PR来帮助我改进。这个项目意义何在?帮助不同设备之间传输文件。举个例子:手机和电脑要传文件...

    varnish+lighttpd配置

    Varnish是一款HTTP加速器,它的主要功能是缓存静态内容,如HTML页面、图片和CSS文件等,从而减少对后端服务器的请求。Varnish通过使用内存缓存,能够提供极快的响应速度。此外,Varnish还支持自定义规则(VCL,...

    最新lighttpd源码 lighttpd-1.4.22

    Lighttpd是一个德国人领导的开源软件,其根本的目的是提供一个专门针对高性能网站,安全、快速、兼容性好并且灵活的web server环境。具有非常低的内存开销,cpu占用率低,效能好,以及丰富的模块等特点。lighttpd是...

    lighttpd restfulapi cgi

    1. **配置lighttpd**:首先,我们需要在lighttpd的配置文件(通常是`lighttpd.conf`)中启用必要的模块,如`url.rewrite`和`fastcgi.server`。例如,设置以下规则以处理RESTful API请求: ``` url.rewrite-once =...

    lighttpd分析

    在处理网络请求时,lighttpd采用了一种混合的网络模型——多进程加上多路复用技术,如select或epoll。这种模型旨在提供高效的并发处理能力,同时确保系统的稳定性和可靠性。 首先,我们要理解lighttpd的网络模型。...

    lighttpd服务器

    Lighttpd是一款轻量级、高性能的Web服务器,因其轻巧高效的特点而得名。在互联网领域,它被广泛应用在嵌入式设备、移动设备以及资源有限的服务器上,为用户提供网页服务。其设计目标是低系统资源消耗、高速度以及...

    lighttpd-1.4.20源代码

    每个模块都是一个单独的`.c`文件,如`mod_access.c`、`mod_rewrite.c`等,它们通过lighttpd的模块接口注册和执行各自的功能。 6. **内存管理** lighttpd在内存管理上注重效率和安全性,`lighttpd-1.4.20/src/...

    ARM平台lighttpd服务器

    ARM平台的lighttpd服务器就是这样一个解决方案,尤其适用于嵌入式设备和资源有限的环境。本文将深入探讨lighttpd服务器在ARM架构上的应用及其特点。 首先,我们要了解什么是lighttpd。Lighttpd是一款开源的、高...

    lighttpd-1.4.18

    总的来说,lighttpd-1.4.18是一个兼顾性能与效率的Web服务器解决方案,尤其适合对资源有严格限制的场景。它的轻量级特性、模块化设计和丰富的安全功能,使得它在众多Web服务器中脱颖而出,成为小型和中型网站的理想...

    lighttpd源码分析

    Lighttpd是一款轻量级且高效的Web服务器软件,以其低内存占用、快速响应和模块化的结构而备受青睐。本文将深入探讨lighttpd的源码,揭示其内部工作机制,帮助开发者更好地理解和优化这款服务器。 1. **架构概述** ...

Global site tag (gtag.js) - Google Analytics