我想为程序创建一个小补丁。我对C不太了解。
当我的函数
get_streamlink
返回 buffer
时,下一个代码无法通过 m3u8
url 获取视频。当函数返回静态url时,视频显示成功。在这两种情况下,url 和下一个代码是相同的。怎么了?
UPD:感谢您的评论。来自
\n
的 fgets
存在问题。
static char *get_streamlink(const char *url) {
char *template = "streamlink %s best --stream-url";
char *buffer = (char *)malloc(5060);
FILE *pPipe;
struct dstr command = {0};
dstr_catf(&command, template, url);
pPipe = _popen(command.array, "rt");
dstr_free(&command);
while (fgets(buffer, 5060, pPipe)) {
puts(buffer);
}
int endOfFileVal = feof(pPipe);
int closeReturnVal = _pclose(pPipe);
// failed
return buffer;
// OK
// return "https://video-weaver.arn03.hls.ttvnw.net/v1/playlist/CvAEXGd8OH7.....m3u8";
}
static void add_file(struct vlc_source *c, media_file_array_t *new_files,
const char *path, int network_caching, int track_index,
int subtitle_index, bool subtitle_enable,
const char *hw_value, bool skip_b_frames)
{
struct media_file_data data;
struct dstr new_path = {0};
libvlc_media_t *new_media;
bool is_url = path && strstr(path, "://") != NULL;
dstr_copy(&new_path, path);
#ifdef _WIN32
if (!is_url)
dstr_replace(&new_path, "/", "\\");
#endif
dstr_copy(&new_path, get_streamlink(new_path.array));
path = new_path.array;
new_media = get_media(&c->files, path);
//...
}
您需要删除尾随的
\n
/ \r\n
。
由于您使用的是非标准函数
_popen
,您还可以使用 MSVC 中的另一个非标准扩展:采用 basic_ifstream
的 FILE*
构造函数。这样您就可以在输入流上使用 std::getline
。
#include <cstdio>
#include <fstream>
#include <iostream>
#include <string>
std::ifstream Popen(const char* command) {
auto fp = _popen(command, "rt");
return std::ifstream(fp); // construct the ifstream using a FILE*
}
int main() {
auto is = Popen("dir");
std::string line;
while (std::getline(is, line)) {
std::cout << line << '\n';
}
}