2010-07-21 3 views
0

저는 tcl로 스트리밍 어플리케이션을 개발 중입니다. HTTP 모드에서 흐름을 브로드 캐스트하는 vlc 서버가 있습니다. 내가하려는 일은 특정 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의 배수)를 읽으십시오. –

+0

나는 당신의 해결책을 시도했다 ... 나는 여전히 같은 문제를 가지고있다. ... – geniecom

답변

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를 가지고 있다면 - 그렇지 않다면 왜 안됩니까? - 대신 람다 응용 프로그램을 사용하여 명백한 코드 순서를 훨씬 더 비슷하게 만들 수 있습니다.

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

+0

전에 그렇게 말했어 야합니다. 바이트를 스스로 지키고 싶지는 않지만 기다릴 수 없다면'geturl'에'-command'를 전달하면 모두 완료되면 비동기 콜백을 얻을 수 있습니다. 그동안 다른 일을 할 수 있습니다. 데모를 통해 답변을 업데이트하겠습니다. –