在curl上使用curlpp从youtube下载flv-视频不播放

在curl上使用curlpp从youtube下载flv-视频不播放,curl,youtube,curlpp,Curl,Youtube,Curlpp,为了从youtube上下载视频,我在curl lib上使用了curlpp 我已经设法下载了flv,但无法使用各种视频播放器打开它 我使用了另一个youtube视频下载程序,下载了质量完全相同的视频,我注意到请求是相同的,而且文件大小几乎相同-我认为这就是问题所在,例如:MyVideo.flv-4.55MB WorkingVideo.flv-4.53MB 代码如下: //回调函数 大小文件回调(文件f、字符ptr、大小、大小nmemb) { 返回fwrite(ptr、size、nmemb、f);

为了从youtube上下载视频,我在curl lib上使用了curlpp

我已经设法下载了flv,但无法使用各种视频播放器打开它

我使用了另一个youtube视频下载程序,下载了质量完全相同的视频,我注意到请求是相同的,而且文件大小几乎相同-我认为这就是问题所在,例如:MyVideo.flv-4.55MB WorkingVideo.flv-4.53MB

代码如下:


//回调函数
大小文件回调(文件f、字符ptr、大小、大小nmemb)
{
返回fwrite(ptr、size、nmemb、f);
}

void GetVideo(std::wstring videoUrl) {

FILE*FILE=fopen(“C:\\locatin\\b.flv”,“w”);
如果(文件)
{
清洁剂;
简单的要求;
//将writer回调设置为允许cURL在内存区域中写入结果
curlpp::types::WriteFunctionFunctor函子(utilspp::BindFirst(utilspp::make_函子(&FileCallback),file));
curlpp::options::WriteFunction*getFileOpt=new curlpp::options::WriteFunction(functor);
setOpt(getFileOpt);
//将URL设置为“检索”。
setOpt(新的curlpp::options::Url(videoUrl));
setOpt(新的curlpp::options::Verbose(true));
setOpt(新超时(2000));
std::列表标题;
标题。推回(“连接:保持活动”);
标题。向后推(“保持活动状态:115”);
headers.push_back(“接受编码:gzip,deflate”);
headers.push_back(“接受字符集:ISO-8859-1,utf-8;q=0.7,*;q=0.7”);
headers.push_back(“用户代理:Mozilla/5.0(Windows;U;Windows NT 6.1;en-US;rv:1.9.2.10)Gecko/20100914 Firefox/3.6.10”);
headers.push_back(“接受:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8”);
headers.push_back(“接受语言:en-us,en;q=0.5”);
setOpt(头文件);
request.perform();
fclose(文件);
}
}

有什么想法吗


谢谢。

Youtube可以提供h263(flashvideo)、h264等编码的视频。您正在下载哪种格式的视频?(还提供Youtube音频/视频格式的详细信息)

使用工具验证文件头并确保下载的内容正常!如果您使用*nix,则可以在命令行上执行文件:文件名.flv

另一种可能是您可能没有播放视频所需的编解码器。这可以解释为什么您的系统上没有视频播放器能够播放您下载的视频。

由于我是在windows平台上开发的,所以我决定使用URLDowloadToFile信息下载文件:


这一个很有魅力,但仍然不确定为什么curl保存的文件与IE或FF或上面的win32 api函数略有不同。

嗯,两个文件的格式都是flv。尽管如此,我用curl下载的那个并没有播放。我比较了两个文件,它们是相同的,但大小略有不同。我认为我写文件的方式是错误的,但这只是一个猜测,我尝试使用curl提供的流支持来编写文件,但仍然得到了相同的结果。但在它里面,你可以有多种视频编码格式。正在使用什么视频编码?h263或h264?这并不重要,我会解释原因:我使用直接下载视频的url,将其放在Firefox中下载,我添加了flv后缀并播放了它,它工作得很好,所以我假设它一定是以我编写文件的方式或使用curl获取它的方式。(哦,还有它的H263,也试过一个是H264,两者都有同样的问题。)在删除curlpp并只使用curl后,一切都很好,我想这是curlpp中的一个bug,或者可能是我用错了。嗨,我已经下载了FLV,但无法将FMT更改为HD。这是可能的吗?是的,你知道这是一个3次呼叫的过程,因为你已经设法下载了一个视频,第一次给你FMT,在第二次呼叫中你通过适当的FMT链接,用这个来选择你想要的质量。
    FILE * file = fopen("C:\\locatin\\b.flv", "w");

if (file)
{
    curlpp::Cleanup cleaner;
    curlpp::Easy request;

    // Set the writer callback to enable cURL to write result in a memory area
    curlpp::types::WriteFunctionFunctor functor(utilspp::BindFirst(utilspp::make_functor(&FileCallback), file));
    curlpp::options::WriteFunction *getFileOpt = new curlpp::options::WriteFunction(functor);
    request.setOpt(getFileOpt);

    // Setting the URL to retrive.
    request.setOpt(new curlpp::options::Url(videoUrl));
    request.setOpt(new curlpp::options::Verbose(true));
    request.setOpt(new Timeout(2000));

    std::list<std::string> headers;
    headers.push_back("Connection: keep-alive");
    headers.push_back("Keep-Alive: 115");
    headers.push_back("Accept-Encoding: gzip,deflate");
    headers.push_back("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7");
    headers.push_back("User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10");
    headers.push_back("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    headers.push_back("Accept-Language: en-us,en;q=0.5");

    request.setOpt<HttpHeader>(headers);
    request.perform();

    fclose(file);
}