【发布时间】:2022-11-14 02:14:36
【问题描述】:
我正在尝试使用流构建播放器。主要思想是让一个线程运行一个播放器,该播放器读取来自另一个同时下载 youtube 音频的线程的字节。该代码工作了一段时间并且内容正确流式传输,但几秒钟后我总是收到此错误:
Exception: fd:13: hPutBuf: resource vanished (Broken pipe)。
我想我错过了一些东西,因为即使使用 connect 函数,结果也是一样的。这是代码(简化):
import Control.Concurrent
import System.IO.Streams
import Data.ByteString
main = do
(sink,_,_,_) <- runInteractiveCommand "mplayer -novideo - cache 5096 -"
mainSink <- lockingOutputStream sink -- main audio stream, goes straight to player
(_,source,_,_) <- runInteractiveCommand "yt-dlp \"https://www.youtube.com/watch?v=uFtfDK39ZhI\" -f bv+ba -o -"
loop mainSink source
loop :: OutputStream ByteString -> InputStream ByteString -> IO ()
loop sink src = do
sourceBytes <- peek src
case sourceBytes of
Nothing -> do loop sink src
Just _ -> do
audioBytes <- read src
write audioBytes sink
loop sink src
【问题讨论】:
标签: multithreading haskell concurrency stream bytestring