gpt4 book ai didi

c++ - 如何在 Windows 中使用 c/c++ 中的 curl 获取网络视频流的快照?

转载 作者:行者123 更新时间:2023-11-28 01:10:00 25 4
gpt4 key购买 nike

并确定媒体类型,然后使用正确的扩展名保存捕获的图像?

最佳答案

当浏览器想要播放视频时,它通常会向服务器(保存视频流)发送一个 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 脚本来自动执行查找 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

为了回答您的第二个问题,我相信要识别文件/媒体类型,您必须下载视频流的第一个字节,因为它包含文件头,然后检查它是否已知 file signatures .例如,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 将调用该回调。 Check the documentation回调选项上获取有关这些函数的更多信息。

如果你需要一个完整的例子,你可以check this thread .

另外一件事,如果你正在使用 M-JPEG streams你应该看看 cambozola实现。

关于c++ - 如何在 Windows 中使用 c/c++ 中的 curl 获取网络视频流的快照?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3921313/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com