tags:

views:

83

answers:

1

And exact the media type then save the captured image with correct extension?

+1  A: 

The browser usually sends a http GET request to the server (that holds the video stream) when it wants to play the video and that is what starts the file transfer, but this handshake may change according to the server you are negotiating with.

Below is a short code snippet that shows how to setup curl and download a file when you have the complete url of the file:

#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;
}

Websites like youtube don't give the URL of the video so easily, and may even redirect you to another html page that you could parse to find the magic information needed to assembly the full URL of the video. I wrote a small bash script a long time ago to automate the process for finding a youtube's video URL and downloading the video. I know it doesn't work anymore so I'll paste it for education purposes only:

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

And to answer your 2nd question, I believe that to identify the file/media type you will have to download the first bytes of the video stream since it contains the file header, and then check it for known file signatures. For instance, the first bytes of a FLV file should be:

46 4C 56 01

EDIT:

Downloading a video stream is not so different as one may believe. You will need to tell curl that you have your own method to save the stream data, and this can be specified by:

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

Where *cb_writter* is your callback that will be called by curl when new data arrives. Check the documentation on Callback Options for more info about these functions.

If you need a full example you can check this thread.

One more thing, if you are working with M-JPEG streams you should take a look at the cambozola implementation.

karlphillip
I know how to download a file with curl,but it's totally different story if you are dealing with video streams,like MJEPG streams.
Alan
@Alan Updated my answer and I also make a reference to a working example.
karlphillip