как получить поток vlc в сокет?

Я разрабатываю потоковое приложение с tcl. У меня есть сервер vlc, который транслирует поток в режиме http. то, что я пытаюсь сделать, это разработать клиента, который попытается подключиться к серверу с определенным IP-адресом и номером порта, а затем попытается сохранить поток в файле. код, который я использую, прост:

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

проблема, когда я пытаюсь проверить свой скрипт, я вижу, что я понимаю соединение, но я не могу прочитать поток! "puts" ничего не показывает в консоли...

У вас есть идеи! благодарю вас..


person geniecom    schedule 21.07.2010    source источник
comment
VLC может буферизоваться. Попробуйте прочитать 1024 байта (или кратное 1024).   -  person glenn jackman    schedule 21.07.2010
comment
Я попробовал ваше решение... У меня все еще та же проблема...   -  person geniecom    schedule 22.07.2010


Ответы (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...
person Donal Fellows    schedule 21.07.2010
comment
Спасибо, все работает очень хорошо... Но когда скрипт скачивает файл, у меня нет доступа к тому же файлу! На самом деле мне нужно стримить файл в режиме http и пересылать кому-то еще! здесь я должен дождаться окончания потоковой передачи. Что мне нужно, так это читать поток по байтам и пересылать его одновременно! любые другие идеи, пожалуйста! - person geniecom; 22.07.2010
comment
Ты должен был сказать это раньше. Если вы не хотите хранить байты самостоятельно, но не можете ждать, передайте -command в geturl, и вы получите асинхронный обратный вызов, когда все будет сделано. Тем временем вы можете заняться другими делами. Я обновлю ответ демонстрацией. - person Donal Fellows; 23.07.2010

Поскольку вы работаете с HTTP, я бы посоветовал посмотреть привязки libcurl для TCL.

person Nikolai Fetissov    schedule 21.07.2010