Как получить снимок сетевого видеопотока с помощью curl в c / c ++ в windows? - PullRequest
0 голосов
/ 13 октября 2010

А точный тип носителя затем сохранить захваченное изображение с правильным расширением?

1 Ответ

3 голосов
/ 21 октября 2010

Браузер обычно отправляет запрос http GET на сервер (который содержит видеопоток), когда он хочет воспроизвести видео, и именно это начинает передачу файла, но это рукопожатие может измениться в зависимости от сервер, с которым вы ведете переговоры.

Ниже приведен фрагмент кода, который показывает, как настроить curl и загрузить файл, когда у вас есть полный URL-адрес файла:

#include <curl/curl.h>
#include <stdio.h>

void get_page(const char* url, const char* file_name)
{
  CURL* easyhandle = curl_easy_init();

  curl_easy_setopt( easyhandle, CURLOPT_URL, url ) ;

  FILE* file = fopen( file_name, "w");

  curl_easy_setopt( easyhandle, CURLOPT_WRITEDATA, file) ;

  curl_easy_perform( easyhandle );

  curl_easy_cleanup( easyhandle );
}

int main()
{
  get_page( "http://blog.stackoverflow.com/wp-content/themes/zimpleza/style.css", "style.css" ) ;

  return 0;
}

Такие сайты, как youtube, не так легко дают URL-адрес видео, и могут даже перенаправить вас на другую html-страницу, которую вы можете проанализировать, чтобы найти волшебную информацию, необходимую для сборки полного URL-адреса видео. Я написал небольшой скрипт bash давным-давно, чтобы автоматизировать процесс поиска URL-адреса видео на YouTube и загрузки видео. Я знаю, что это больше не работает, поэтому я вставлю его только в образовательных целях:

if [ -z "${1}" ]
then
    echo 'Error !!! Missing URL or video_id !!!'
    exit 1
fi

URL="http://www.youtube.com"

# Retrieve video_id from url passed by the user
VAR_VIDEO_ID="${1/*=}"    

# Retrive t variable located in var swfHTML (javascript)
VAR_T=$(wget -qO - $URL/watch?v=$VAR_VIDEO_ID 2>&1 | perl -e 'undef $/; <STDIN> =~ m/&t=([^&]*)&/g; print "$1\n"';)

# Assemble magical string
FLV_URL="$URL/get_video?video_id="$VAR_VIDEO_ID"&t="$VAR_T"=&eurl=&el=detailpage&ps=default&gl=US&hl=en"

# Download flv from Youtube.com. Add 2>&1 before wget cmd to suppress logs
WGET_OUTPUT=$(wget $FLV_URL -O $VAR_VIDEO_ID.flv)

# Making sure the download went okay
if [ $? -ne 0 ]
then
    # wget failed
    echo -e 1>&2 $0: "!!! ERROR: wget failed !!!\n"
    rm $VAR_VIDEO_ID.flv
    exit 1
fi

И чтобы ответить на ваш 2-й вопрос, я считаю, что для определения типа файла / мультимедиа вам необходимо загрузить первые байты видеопотока, поскольку он содержит заголовок файла, а затем проверить его на наличие известных сигнатур файла . Например, первые байты файла FLV должны быть:

46 4C 56 01

EDIT:

Загрузка видеопотока не так уж отличается, как можно поверить. Вам нужно будет указать curl, что у вас есть свой собственный метод для сохранения потоковых данных, и это можно указать с помощью:

curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, cb_writer);
curl_easy_setopt(curl_hndl, CURLOPT_WRITEDATA, url_data);

Где * cb_writter * - ваш обратный вызов, который будет вызываться curl при поступлении новых данных. Проверьте документацию на Параметры обратного вызова для получения дополнительной информации об этих функциях.

Если вам нужен полный пример, вы можете проверить эту тему .

Еще одна вещь, если вы работаете с потоками M-JPEG , вам следует взглянуть на реализацию cambozola .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...