2010-07-21 48 views
0

我正在用tcl開發流應用程序。 我有一個vlc服務器在http模式下播放流。我想要做的是開發一個客戶端,它將嘗試使用特定的IP地址和端口號連接到服務器,然後嘗試將流保存在文件中。 ,我正在使用的代碼很簡單:如何在套接字中接收vlc流?

set server localhost 
set sockChan [socket $server 1234] 
set line [read $sockChan 1000] 
puts " vidéo: $line" 
close $sockChan 

當我嘗試測試我的劇本的問題,我看到我實現了連接,但我無法讀取流! 'puts'沒有在控制檯上顯示任何東西...

你有什麼想法! 謝謝..

+0

VLC可能會緩衝。嘗試讀取1024字節(或1024的倍數)。 – 2010-07-21 15:39:39

+0

我試過你的解決方案...我仍然有同樣的問題... – geniecom 2010-07-22 09:27:18

回答

0

由於您正在使用HTTP,我建議您查看libcurl TCL綁定。

2

如果您只是想將URL的內容保存到文件中,標準http程序包有一個-channel選項,可讓您直接轉儲。例如:

package require http 
set f [open video.dump w] 
fconfigure $f -translation binary 
set tok [http::geturl "http://server:port/url" -channel $f] 
close $f 
if {[http::ncode $tok] != 200} { 
    # failed somehow... 
} else { 
    # succeeded 
} 
http::cleanup $tok 

編輯:做它異步(需要事件循環下去,例如通過vwait forever):

package require http 
set f [open video.dump w] 
fconfigure $f -translation binary 
proc done {f tok} { 
    close $f 
    if {[http::ncode $tok] != 200} { 
     # failed somehow... 
    } else { 
     # succeeded 
    } 
    http::cleanup $tok 
}  
http::geturl "http://server:port/url" -channel $f -command "done $f" 
# Your code runs here straight away... 

注意,代碼的可識別類似,但現在在一個稍微不同的順序!如果你有Tcl 8.5 - 如果沒有,爲什麼不呢? - 那麼您可以使用lambda應用程序來代替代碼的明顯順序:

package require http 
set f [open video.dump w] 
fconfigure $f -translation binary 
http::geturl "http://server:port/url" -channel $f -command [list apply {{f tok} { 
    close $f 
    if {[http::ncode $tok] != 200} { 
     # failed somehow... 
    } else { 
     # succeeded 
    } 
    http::cleanup $tok 
}} $f] 
# Your code runs here straight away... 
+0

謝謝你的工作非常好... 但是當腳本正在下載文件時,我沒有訪問相同的文件! 事實上,我需要在http模式下傳輸文件並轉發給其他人!在這裏我必須等待流媒體的結束。我需要的是按字節讀取流,並在同一時間轉發它! 請任何其他的想法! – geniecom 2010-07-22 09:47:21

+0

你應該這麼說過。如果您不想自己保留字節,但又不能等待,請將'-command'傳遞給'geturl',並在完成時獲得異步回調。與此同時,你可以做其他事情。我將通過演示更新答案。 – 2010-07-22 23:29:16