如何在Windows中用c / c ++ curl获取networkingvideostream的快照?

确切的媒体types,然后保存正确的扩展名捕获的图像?

Solutions Collecting From Web of "如何在Windows中用c / c ++ curl获取networkingvideostream的快照?"

浏览器通常会在需要播放视频时向服务器(持有视频流)发送一个http GET请求,这就是启动文件传输的原因,但是根据您正在协商的服务器,握手可能会有所不同。

下面是一个简短的代码片段,展示了如何设置卷曲并下载文件,当你有完整的文件的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脚本来自动找到YouTube的视频URL并下载视频。 我知道它不工作了,所以我只会将其粘贴到教育目的:

 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 

为了回答你的第二个问题,我相信要确定文件/媒体类型,你必须首先下载视频流的第一个字节,因为它包含文件头,然后检查已知的文件签名 。 例如, FLV文件的第一个字节应该是:

 46 4C 56 01 

编辑:

下载视频流并不像人们所认为的那么不同。 你需要告诉curl你有自己的方法来保存流数据,这可以通过以下方式来指定:

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

其中* cb_writter *是您的回调,当新数据到达时将被curl调用。 有关这些功能的更多信息, 请查看 Callback Options中 的文档 。

如果你需要一个完整的例子,你可以检查这个线程 。

还有一件事,如果你正在使用M-JPEG流,你应该看看cambozola的实现。