libvlc - http stream error: local stream 1 error: Cancellation (0x8)
libvlc - http stream error: local stream 1 error: Cancellation (0x8)
我遇到 libvlc
的错误,尝试从 YouTube 播放视频会导致错误 http stream error: local stream 1 error: Cancellation (0x8)
上下文
C++代码:
#include <iostream>
#include <thread>
#include <vlc/vlc.h>
#include <vlc/libvlc.h>
#include <vlcpp/vlc.hpp>
int main() {
const char *const arg[] = { "--no-video", "-vv" };
VLC::Instance instance = VLC::Instance(2, arg);
const std::string mrl = "link to youtube video here";
VLC::Media media = VLC::Media(instance, mrl, VLC::Media::FromLocation);
VLC::MediaPlayer player = VLC::MediaPlayer(instance);
player.setMedia(media);
player.play();
std::this_thread::sleep_for( std::chrono::seconds(215) );
return 0;
}
C++ 日志: https://gist.github.com/trofchik/39ebc5df6aeb4a82b464db74a48846d7
VLC 播放器应用日志: https://gist.github.com/trofchik/8028fda99c08f22523800a03f26e168c
请注意,由于 youtube api.
的一些怪癖,我将 720p 设置为播放视频的首选分辨率
Python代码
#!/usr/bin/python3
import pafy
import vlc
import time
import youtube_dl
url = 'link to youtube video here'
song = pafy.new(url)
duration = song.length
audiostreams = song.audiostreams
best = song.getbest()
play_url = best.url
print(play_url)
instance = vlc.Instance('--no-video')
player = instance.media_player_new()
media = instance.media_new(play_url)
media.get_mrl()
player.set_media(media)
player.play()
time.sleep(duration)
Python 日志: https://gist.github.com/trofchik/68e797339853dd5607d8c7b3fcb1493a
使用由 python 脚本生成的 link 时的 C++ 日志: https://gist.github.com/trofchik/000a32280ba177a3e8897eb25cc7b9e0
我还用在 vlc 的 github 页面上找到的代码替换了 youtube 视频的 lua 脚本代码,您可以在这里找到:https://github.com/videolan/vlc/blob/master/share/lua/playlist/youtube.lua 这个脚本显然生成正确的 url 用于视频播放。
说明
我试过用 3 种不同的方式播放视频。
首先是将 libvlc 与正常 link 一起用于 youtube 视频(例如 youtube.com/watch?v=videoID),这给了我上述错误。 (参见 C++ 代码和日志)
其次是使用 VLC 播放器应用程序播放它,效果很好。 (查看 VLC 播放器应用日志)
第三个是使用 vlc-python
和 pafy
播放视频,这也有效。 (参见 python 代码和日志)
第四个是通过 libvlc
播放,但使用 python 代码(存储在 play_url
变量中)生成的 link 有效。 (请参阅使用 python 时生成的 link 时的 C++ 代码和 C++ 日志)有趣的是,在第 301 行使用正常 link 时,您可以在 C++ 日志中看到 link 有与 python 代码生成的格式类似。该程序仍然无法运行。奇怪的是,如果我使用由 libvlc
生成的 link(我在上面指向并以“r1--”开头的那个),程序将按预期工作。
到目前为止我做了什么,我想要什么?
我所做的大部分工作已在上面进行了描述。除此之外,我还花了几个小时比较我用来播放视频的所有 4 种方法的日志,但没有发现任何可以让我找到解决办法的东西。我也在网上搜索修复。许多人建议将最大播放分辨率设置为 720p,这是我在使用 VLC 播放器应用程序时所做的。我怀疑默认分辨率是问题,因为我总是 运行 使用 --no-video
参数编码,该参数禁用视频输出并只留下音频。
编辑:尝试使用 运行ning C++ 代码和 --prefered-resolution=720
参数。没用。在上述第四种情况下,没有任何变化。
我考虑将 python 与 libvlc
结合使用作为最后的手段,而是找出 libvlc
本机使用的 lua
的问题。因此,我希望我的 C++
代码能够在不使用 python
.
的情况下与普通 YouTube link 一起使用
由于 Youtube URLs 不同于 VLC 的其他 URLs,从某种意义上说,你给 HTML URL 到 VLC,VLC 需要解析 HTML 页面并重建实际的 video URL(这就是 lua 脚本的作用), 您不能将 HTML URL 作为媒体直接提供给媒体播放器。
从 HTML URL 创建一个媒体,正如您所做的那样。
VLC::Media media = VLC::Media(instance, mrl, VLC::Media::FromLocation);
解析它。
media.parseWithOptions(VLC::Media::ParseFlags::Network, -1);
解析是异步完成的。媒体上有一个事件可以告诉你什么时候完成。
成功解析后,您可以从媒体子项(通常是媒体列表中的第一项)访问实际视频URL,并将其提供给媒体播放器。
std::shared_ptr<VLC::Media> video = media.subitems()->itemAtIndex(0);
player.setMedia(*video);
player.play();
这就是 VLC 应用在检测到视频是 YouTube URL(或 Vimeo、dailymotion、m3u8 播放列表等)时在后台执行的操作。
我遇到 libvlc
的错误,尝试从 YouTube 播放视频会导致错误 http stream error: local stream 1 error: Cancellation (0x8)
上下文
C++代码:
#include <iostream>
#include <thread>
#include <vlc/vlc.h>
#include <vlc/libvlc.h>
#include <vlcpp/vlc.hpp>
int main() {
const char *const arg[] = { "--no-video", "-vv" };
VLC::Instance instance = VLC::Instance(2, arg);
const std::string mrl = "link to youtube video here";
VLC::Media media = VLC::Media(instance, mrl, VLC::Media::FromLocation);
VLC::MediaPlayer player = VLC::MediaPlayer(instance);
player.setMedia(media);
player.play();
std::this_thread::sleep_for( std::chrono::seconds(215) );
return 0;
}
C++ 日志: https://gist.github.com/trofchik/39ebc5df6aeb4a82b464db74a48846d7
VLC 播放器应用日志: https://gist.github.com/trofchik/8028fda99c08f22523800a03f26e168c 请注意,由于 youtube api.
的一些怪癖,我将 720p 设置为播放视频的首选分辨率Python代码
#!/usr/bin/python3
import pafy
import vlc
import time
import youtube_dl
url = 'link to youtube video here'
song = pafy.new(url)
duration = song.length
audiostreams = song.audiostreams
best = song.getbest()
play_url = best.url
print(play_url)
instance = vlc.Instance('--no-video')
player = instance.media_player_new()
media = instance.media_new(play_url)
media.get_mrl()
player.set_media(media)
player.play()
time.sleep(duration)
Python 日志: https://gist.github.com/trofchik/68e797339853dd5607d8c7b3fcb1493a
使用由 python 脚本生成的 link 时的 C++ 日志: https://gist.github.com/trofchik/000a32280ba177a3e8897eb25cc7b9e0
我还用在 vlc 的 github 页面上找到的代码替换了 youtube 视频的 lua 脚本代码,您可以在这里找到:https://github.com/videolan/vlc/blob/master/share/lua/playlist/youtube.lua 这个脚本显然生成正确的 url 用于视频播放。
说明
我试过用 3 种不同的方式播放视频。
首先是将 libvlc 与正常 link 一起用于 youtube 视频(例如 youtube.com/watch?v=videoID),这给了我上述错误。 (参见 C++ 代码和日志)
其次是使用 VLC 播放器应用程序播放它,效果很好。 (查看 VLC 播放器应用日志)
第三个是使用 vlc-python
和 pafy
播放视频,这也有效。 (参见 python 代码和日志)
第四个是通过 libvlc
播放,但使用 python 代码(存储在 play_url
变量中)生成的 link 有效。 (请参阅使用 python 时生成的 link 时的 C++ 代码和 C++ 日志)有趣的是,在第 301 行使用正常 link 时,您可以在 C++ 日志中看到 link 有与 python 代码生成的格式类似。该程序仍然无法运行。奇怪的是,如果我使用由 libvlc
生成的 link(我在上面指向并以“r1--”开头的那个),程序将按预期工作。
到目前为止我做了什么,我想要什么?
我所做的大部分工作已在上面进行了描述。除此之外,我还花了几个小时比较我用来播放视频的所有 4 种方法的日志,但没有发现任何可以让我找到解决办法的东西。我也在网上搜索修复。许多人建议将最大播放分辨率设置为 720p,这是我在使用 VLC 播放器应用程序时所做的。我怀疑默认分辨率是问题,因为我总是 运行 使用 --no-video
参数编码,该参数禁用视频输出并只留下音频。
编辑:尝试使用 运行ning C++ 代码和 --prefered-resolution=720
参数。没用。在上述第四种情况下,没有任何变化。
我考虑将 python 与 libvlc
结合使用作为最后的手段,而是找出 libvlc
本机使用的 lua
的问题。因此,我希望我的 C++
代码能够在不使用 python
.
由于 Youtube URLs 不同于 VLC 的其他 URLs,从某种意义上说,你给 HTML URL 到 VLC,VLC 需要解析 HTML 页面并重建实际的 video URL(这就是 lua 脚本的作用), 您不能将 HTML URL 作为媒体直接提供给媒体播放器。
从 HTML URL 创建一个媒体,正如您所做的那样。
VLC::Media media = VLC::Media(instance, mrl, VLC::Media::FromLocation);
解析它。
media.parseWithOptions(VLC::Media::ParseFlags::Network, -1);
解析是异步完成的。媒体上有一个事件可以告诉你什么时候完成。
成功解析后,您可以从媒体子项(通常是媒体列表中的第一项)访问实际视频URL,并将其提供给媒体播放器。
std::shared_ptr<VLC::Media> video = media.subitems()->itemAtIndex(0);
player.setMedia(*video);
player.play();
这就是 VLC 应用在检测到视频是 YouTube URL(或 Vimeo、dailymotion、m3u8 播放列表等)时在后台执行的操作。