国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
lighttpd對flv視頻文件的拖動一種變形 - python mplayer ffmpeg vp6 - JavaEye技術(shù)網(wǎng)站
當(dāng)前流行的視頻網(wǎng)站,關(guān)于視頻的在線拖動觀看技術(shù)的小試,

1.flv文件
 flv視頻文件,想大家都比較清楚,只要從關(guān)鍵幀的位置切開,并加上"FLV\x1\x1\0\0\0\x9\0\0\0\x9"公共頭標(biāo)志信息,后對任何支持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方法,向服務(wù)器請求指定的視頻片段

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

  mod_flv_streaming.c默認(rèn)的方式是,從start(文件的物理位置offset)的開始,默認(rèn)到文件結(jié)束。
 
   相關(guān)服務(wù)器代碼如下:

C代碼
  1. for (k = 0; k < p->conf.extensions->used; k++) {  
  2.         data_string *ds = (data_string *)p->conf.extensions->data[k];  
  3.         int ct_len = ds->value->used - 1;  
  4.   
  5.         if (ct_len > s_len) continue;  
  6.         if (ds->value->used == 0) continue;  
  7.   
  8.         if (0 == strncmp(con->physical.path->ptr + s_len - ct_len, ds->value->ptr, ct_len)) {  
  9.             data_string *get_param;  
  10.             stat_cache_entry *sce = NULL;  
  11.             buffer *b;  
  12.             int start;  
  13.             char *err = NULL;  
  14.             /* if there is a start=[0-9]+ in the header use it as start, 
  15.              * otherwise send the full file */  
  16.   
  17.             array_reset(p->get_params);  
  18.             buffer_copy_string_buffer(p->query_str, con->uri.query);  
  19.             split_get_params(p->get_params, p->query_str);  
  20. /*這個是重點,獲得客戶端的播放器通過get方法傳來的start(文件拖動的開始位置offset)*/  
  21.             if (NULL == (get_param = (data_string *)array_get_element(p->get_params, "start"))) {  
  22.                 return HANDLER_GO_ON;  
  23.             }  
  24.   
  25.             /* too short */  
  26.             if (get_param->value->used < 2) return HANDLER_GO_ON;  
  27.   
  28.             /* check if it is a number */  
  29.             start = strtol(get_param->value->ptr, &err, 10);  
  30.             if (*err != '\0') {  
  31.                 return HANDLER_GO_ON;  
  32.             }  
  33.   
  34.             if (start <= 0) return HANDLER_GO_ON;  
  35.   
  36.             /* check if start is > filesize */  
  37.             if (HANDLER_GO_ON != stat_cache_get_entry(srv, con, con->physical.path, &sce)) {  
  38.                 return HANDLER_GO_ON;  
  39.             }  
  40.   
  41.             if (start > sce->st.st_size) {  
  42.                 return HANDLER_GO_ON;  
  43.             }  
  44.   
  45.             /* we are safe now, let's build a flv header */  
  46.             b = chunkqueue_get_append_buffer(con->write_queue);  
  47.                           
  48.                         /*準(zhǔn)備發(fā)送給客戶端播放器的flv公共頭信息13字節(jié)*/  
  49.             buffer_copy_string_len(b, CONST_STR_LEN("FLV\x1\x1\0\0\0\x9\0\0\0\x9"));  
  50.                           
  51.                         /*發(fā)送seek到的拖動關(guān)鍵楨的位置keyframe, 并計算出從拖動點到該視頻文件結(jié)束的長度*/  
  52.             http_chunk_append_file(srv, con, con->physical.path, start, sce->st.st_size - start);  
  53.                        /* http相關(guān)信息的填充*/  
  54.             response_header_overwrite(srv, con, CONST_STR_LEN("Content-Type"), CONST_STR_LEN("video/x-flv"));  
  55.   
  56.             con->file_finished = 1;  
  57.                        /*done, 處理拖動完成*/  
  58.             return HANDLER_FINISHED  


3 對客戶端的播放器而言,服務(wù)器對flv文件的拖動支持是透明的,
  只要播放器安照合法的get方法向服務(wù)器請求,即可得到可以播放的視頻片段,
  但是這里的start=xxxx,一定是flv視頻文件的關(guān)鍵楨位置,否則不能播放
  一般而言,對flv視頻文件可以使用
  yamdi
  http://yamdi.sourceforge.net/
  加上metadata信息,即可完美支持拖動,
  播放器可以再第一次請求視頻文件的時候獲得該視頻的metadata信息(即包含關(guān)鍵楨,時間,等等與視頻相關(guān)的信息)

4.以上討論的,都是lighttpd-mod_flv_streaming.c默認(rèn)的對flv的拖動支持,
  其實可以,做一些簡單的擴(kuò)展,
  可以增加end參數(shù),即是增加拖動的結(jié)束參數(shù),
  假設(shè),很多用戶并不會觀看視頻到結(jié)束,
  每次請求N字節(jié)
  http://youserver.com/flv/abcdefg.flv?start=23456&end=23456+N
  播放器可以增加這樣的功能,
  a.先請求某一段視頻
  b.當(dāng)當(dāng)前視頻片段沒有播放完畢之前,不會去請求下一個片段,
    只有當(dāng)當(dāng)前視頻片段在即將播放結(jié)束的時候,再去請求下一個片段,
   這樣,當(dāng)用戶,看了前面的某一片段后,突然關(guān)閉該播放頁,以至于不會白白浪費掉那已經(jīng)download到本地,但是并沒有觀看的視頻,節(jié)余帶寬

  粗略代碼實現(xiàn)如下:

C代碼
  1. if (NULL != (get_param = (data_string *)array_get_element(p->get_params, "start")))   
  2. {  
  3.   
  4.     /* too short */  
  5.     if (get_param->value->used < 2)   
  6.                     return HANDLER_GO_ON;  
  7.   
  8.                 /* check if it is a number */  
  9.                 start = strtol(get_param->value->ptr, &err, 10);  
  10.                 if (*err != '\0')   
  11.                 {  
  12.                     return HANDLER_GO_ON;  
  13.                 }  
  14.                   
  15.                 /* check if tflvbegin is >= 0 */  
  16.                 if (start < 0)   
  17.                     return HANDLER_GO_ON;  
  18.   
  19.                 /* check if start is > filesize */  
  20.                 if (start > sce->st.st_size)   
  21.                 {  
  22.                     return HANDLER_GO_ON;  
  23.                 }  
  24.             }  
  25.             else   
  26.             {  
  27.                 return HANDLER_GO_ON;  
  28.             }  
  29.                           
  30.             /* if there is a start=[0-9]+ in the header use it as end, 
  31.              * otherwise send the full file */  
  32. /*這里重點,仿照lighttpd如何獲得get方法的中的start,同理獲得end參數(shù), 并做一些必要的合法 性檢查*/  
  33.             if (NULL != (get_param = (data_string *)array_get_element(p->get_params, "end")))   
  34.             {  
  35.                 /* too short */  
  36.                 if (get_param->value->used < 2)   
  37.                     return HANDLER_GO_ON;  
  38.   
  39.                 /* check if it is a number */  
  40.                 end = strtol(get_param->value->ptr, &err, 10);  
  41.                 if (*err != '\0')   
  42.                 {  
  43.                     return HANDLER_GO_ON;  
  44.                 }  
  45.   
  46.                 /*參數(shù)檢查,必須*/  
  47.                 /* check if end is > 0  
  48.                  * check if start < end  
  49.                  * make sure star > 0  
  50.                  * */  
  51.                 if (end <= 0 || start >= end)   
  52.                     return HANDLER_GO_ON;  
  53.   
  54.                 /* check if end is > filesize */  
  55.                 if (end > sce->st.st_size)   
  56.                 {  
  57.                     //return HANDLER_GO_ON;  
  58.                     tflvend = sce->st.st_size; /* path tflvend is not right */  
  59.                 }  
  60.             }  
  61.             else   
  62.             {  
  63.                 return HANDLER_GO_ON;  
  64.               
  65.       
  66.    }  
  67.   
  68. /* we are safe now, let's build a flv header */  
  69.             b = chunkqueue_get_append_buffer(con->write_queue);  
  70.                           
  71.                         /*準(zhǔn)備發(fā)送給客戶端播放器的flv公共頭信息13字節(jié)*/  
  72.             buffer_copy_string_len(b, CONST_STR_LEN("FLV\x1\x1\0\0\0\x9\0\0\0\x9"));  
  73.   
  74.                       /*這個是重點,以前默認(rèn)的是發(fā)送的數(shù)據(jù)長度是用 fileseize-start, 現(xiàn)在要用end替代 filesize, 即是 end-start*/  
  75.             http_chunk_append_file(srv, con, con->physical.path, start, end - start);  
  76.             response_header_overwrite(srv, con, CONST_STR_LEN("Content-Type"), CONST_STR_LEN("video/x-flv"));  
  77.             con->file_finished = 1;  
  78.             return HANDLER_FINISHED  

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
ag -wifi 設(shè)置
MPI_Allreduce
linux input 子系統(tǒng)分析 三
linux下面如何用ffmpeg將h264幀數(shù)據(jù)村存為FLV文件!!
Socket 同步和異步模式
nginx中upstream的設(shè)計和實現(xiàn)(三)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服