我有一个.m3u8链接,我正在尝试将其下载为.mp3文件。
import m3u8
import subprocess
import requests
link = 'https://cs9-9v4.vkuseraudio.net/s/v1/ac/NeMmHNX2Iyt08MZ4z5fELAMybgSNR6T1xYEcBEv5Kdsenci3KHOAC-1fKapAV9vxwVOBIik40I4DwfrN-a_jtjILYVcx3mLTNCzKo1UF-UhbKOztLrboF9NEn1jzZs1Jl0ijfmccog6aAcB4PcdnrxPzXY7WCMVWtUjWKOgHad5a-g0/index.m3u8'
m3u8_parsed = m3u8.load(link)
with open('track.ts', 'wb') as f:
for segment in m3u8_parsed.segments:
r = requests.get(segment.absolute_uri)
f.write(r.content)
subprocess.run(['ffmpeg', '-i', 'track.ts', 'track.mp3'])
Run Code Online (Sandbox Code Playgroud)
结果是该track.ts文件占用了 6MB 存储空间,但当我尝试使用 VLC 播放器播放它时没有声音,而track.mp3基本上是一个占用几千字节的空文件。
我正在实现一个由猫鼬光标进行管道传输的转换流(其工作方式类似于可读流,(或者可能是真正的可读流))
const myTransform = new Transform({
readableObjectMode: true,
writableObjectMode: true,
transform(chunk: Document, encoding, callback) {
this.push(chunk?.toObject() ?? null); // <- transforms data
callback(); // <- calls callback
},
});
MyMongooseModelWithHugeData.find()
.cursor()
.pipe(myTransform)
.pipe(someWriteStream)
Run Code Online (Sandbox Code Playgroud)
是的。我当前的代码工作正常。
但我发现callback内部transform实现,接收第二个参数(显然看起来像经典的nodejs异步回调风格)。
所以,我改变了我的代码,如下所示,发现它也工作得很好。
const myTransform = new Transform({
readableObjectMode: true,
writableObjectMode: true,
transform(chunk: Document, encoding, callback) {
callback(null, chunk?.toObject() ?? null); // <- transforms data and calls callback.
},
});
Run Code Online (Sandbox Code Playgroud)
我感到有些尴尬。我搜索了一些有关创建转换流的博客。我发现的所有文章都告诉我必须使用this.push()和调用callback()。但他们甚至没有提到 的第二个参数callback()。
所以,我的问题是:
this.push()传递转换值时和传递转换值时有区别吗 …PS:以下情况描述了一个假设场景,我拥有一家向客户销售产品的公司。
我有一个 Ecto 查询太大,我的机器无法处理它。返回数十亿个结果,世界上可能没有足够的 RAM 来处理它。
这里的解决方案(或者我的研究表明)是使用流。流是为可能无限的结果集而创建的,这适合我的用例。
https://hexdocs.pm/ecto/Ecto.Repo.html#c:stream/2
因此,让我们想象一下,我想要删除购买给定商品的所有用户。也许那个东西在他们的国家并不真正合法,而现在我,这个 IT 行业的可怜人,必须解决问题,这样世界才不会崩溃。
天真的方式:
item_id = "123asdasd123"
purchase_ids =
Purchases
|> where([p], p.item_id == ^item_id)
|> select([p], p.id)
|> Repo.all()
Users
|> where([u], u.purchase_id in ^purchase_ids)
|> Repo.delete_all()
Run Code Online (Sandbox Code Playgroud)
这是天真的方法。我称其为天真,因为有两个问题:
purchase_ids查询)purchase_ids可能会有超过 100K 的 id,因此第二个查询(我们删除内容的地方)将会失败,因为它达到了 32K 的 Postgres 参数限制: https: //stackoverflow.com/a/42251312/1337392我能说的是,我们的产品非常容易上瘾,而且价格非常优惠!我们的客户简直无法满足。不知道为什么。没有。我想不出任何理由。一个都没有。
考虑到这些问题,我无法帮助我的客户并发展我的帝国,我的意思是,小家庭拥有的企业。
我确实找到了这个可能的解决方案:
串流方式:
item_id = "123asdasd123"
purchase_ids =
Purchases
|> where([p], p.item_id == ^item_id)
|> select([p], p.id)
stream = Repo.stream(purchase_ids)
Repo.transacion(fn ->
ids = …Run Code Online (Sandbox Code Playgroud) 我正在使用板条箱玩 Rust 中的流futures-util。
我正在创建一个流,该流在每个步骤中都从分页 API 请求新页面。每个页面的项目基本上都是一个向量。显而易见,每次调用服务器请求新页面都可能会失败。
我不想返回向量流,而是想返回一个项目流,当尝试从失败的页面获取项目时,该项目流会产生错误(并因此关闭该流)。
这是我当前的功能:
pub fn search(
&self,
query: Query,
) -> impl TryStream<Ok = Vec<Item>, Error = MyError> {
let initial_state = (query, None);
stream::try_unfold(initial_state, |(query, page_token)| async move {
let (items, next_page_token) = fetch_page(&query, page_token).await?;
if items.len() <= 0 {
Ok(None)
} else {
Ok(Some((items, (query, next_page_token))))
}
})
}
Run Code Online (Sandbox Code Playgroud)
我想修改它,使返回类型为impl TryStream<Ok = Item, Error = MyError>
有可能吗?
这个函数声明给了我错误:
ostream& operator<<(ostream& os, hand& obj);
Run Code Online (Sandbox Code Playgroud)
错误是:
error C2143: syntax error : missing ';' before '&'
error C4430: missing type specifier
error C2065: 'os' : undeclared identifier
error C2065: 'obj' : undeclared identifier
error C2275: 'hand' : illegal use of this type as an expression
see declaration of 'hand'
error C4430: missing type specifier
Run Code Online (Sandbox Code Playgroud)
hand是我制作的一个类,display是一个类型的公共数据成员char*.
谁能告诉我我做错了什么?
我需要的是PHP的fseek()功能等价物.该函数适用于文件,但我有一个包含二进制数据的变量,我想对它进行处理.我知道我可以使用substr(),但那将是蹩脚的 - 它用于字符串,而不是二进制数据.此外,创建一个文件然后使用fseek()不是我想要的.
也许用流构建的东西?
编辑:好的,我差不多了:
$data = fopen('data://application/binary;binary,'.$bin,'rb');
Run Code Online (Sandbox Code Playgroud)
警告:无法打开流:rfc2397:非法参数
所以我有一个C++程序,通常在它执行时将事物写入日志文件.这是使用fstream完成的.但是,现在我想要包含关闭日志记录的功能.基本上,我的代码看起来像这样:
bool isLogging;
fstream* logFilePtr;
Run Code Online (Sandbox Code Playgroud)
在我的代码中,有一堆语句如:
(*logFilePtr) << " Kernel call time in seconds: " << kTime << endl;
...
Run Code Online (Sandbox Code Playgroud)
现在,如果"isLogging"为真,我不希望这些打印.我可以用一堆if语句围绕它们,但我更喜欢比这更清洁的东西.我认为有一些方法可以采用C++流并将其重定向到"无",以便在使用<<运算符时,不会打印任何内容.
有谁知道如何重定向流,或有任何其他想法如何以优雅的方式处理这个?
谢谢,科林
我有一个WCF服务,其中一个方法返回Stream.现在的问题是当我尝试使用Stream对象时,我是否尝试通过网络使用流或者客户端已经收到了自己的整个流?
如果我使用RESTful而不是WCF,它会有什么不同吗?
为了个人使用,我试图解析一个小的html页面,在简单的网格中显示法国足球锦标赛的结果.
var Url = "http://www.lfp.fr/mobile/ligue1/resultat.asp?code_jr_tr=J01";
WebResponse result = null;
WebRequest req = WebRequest.Create(Url);
result = req.GetResponse();
Stream ReceiveStream = result.GetResponseStream();
Encoding encode = System.Text.Encoding.GetEncoding(0);
StreamReader sr = new StreamReader(ReceiveStream, encode);
while (sr.Read() != -1)
{
Line = sr.ReadLine();
Line = Regex.Replace(Line, @"<(.|\n)*?>", " ");
Line = Line.Replace(" ", "");
Line = Line.TrimEnd();
Line = Line.TrimStart();
Run Code Online (Sandbox Code Playgroud)
然后我真的没有任何线索要么逐行采取,要么整个流采取一个,以及如何仅使用下一个数字作为得分来检索球队的名字.
最后,我想将两个团队的分数放在一个监听或xml中,以便将它与电话应用程序一起使用
如果有人有想法,那将是非常感谢!
我正在尝试在我的日志记录类中实现自己的流操纵器.它基本上是改变旗帜状态的终点操纵器.但是,当我尝试使用它时,我会得到:
ftypes.cpp:57: error: no match for ‘operator<<’ in ‘log->Log::debug() << log->Log::endl’
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/ostream.tcc:67: note: candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>& (*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/ostream.tcc:78: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ios<_CharT, _Traits>& (*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/ostream.tcc:90: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::ios_base& (*)(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>]
Run Code Online (Sandbox Code Playgroud)
...
码:
class Log {
public:
...
std::ostream& debug() { return log(logDEBUG); }
std::ostream& endl(std::ostream& out); // manipulator
...
private:
... …Run Code Online (Sandbox Code Playgroud)