无法使用打开 mpv 观看
Closed this issue · 14 comments
在使用本地视频可以观看,但是在网络上的视频无法观看。
可能是网络太慢的原因
mpv 报错
Playing: http://127.0.0.1:8098
[ffmpeg] Seek failed
[ffmpeg] Seek failed
[cache] Seek failed
[ffmpeg] Seek failed
[cache] Seek failed
[ffmpeg] Seek failed
[cache] Seek failed
[ffmpeg] Seek failed
[cache] Seek failed
[ffmpeg/demuxer] mov,mp4,m4a,3gp,3g2,mj2: moov atom not found
[lavf] avformat_open_input() failed
[ffmpeg] Seek failed
[ffmpeg] Seek failed
[ffmpeg] Seek failed
[ffmpeg] Seek failed
[ffmpeg] Seek failed
[ffmpeg] Seek failed
vf 报错
* Listening at port 8098 ...
Cancelled
Cancelled
Cancelled
Cancelled
Cancelled
Cancelled
Cancelled
Cancelled
Cancelled
Cancelled
Cancelled
Cancelled
Cancelled
Cancelled
Block #4: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 5.00M/5.00M [01:26<00:00, 207kB/sFatal write error on socket transport | 0.00/5.00M [00:00<?, ?B/s]
protocol: <RequestHandler none:none connected>
transport: <_SelectorSocketTransport fd=10 read=polling write=<idle, bufsize=0>>
Traceback (most recent call last):
File "/Users/windard/anaconda/envs/python36/lib/python3.6/asyncio/selector_events.py", line 762, in write
n = self._sock.send(data)
OSError: [Errno 41] Protocol wrong type for socket
我也刚刚发现 mpv 报 Seek failed 错的 bug 😂
具体来说是对 Range 请求的处理有点问题,正在修复
奇怪了,无论是输出每次响应的 HTTP Headers 还是用 Wireshark 抓包,vf 的行为都是正常的啊。算了不折腾 mpv 了,我这边用浏览器和 vlc 播放器都是没问题的,要不换 vlc 吧。
如果有路过的大神遇见过类似情况,请一定给我解释下~
那怎么使用浏览器观看呢?直接打开么?
直接打开 http://127.0.0.1:8098
就行,浏览器在看到 Content-Type
是 video/xx
后会自动播放(而不是下载)。或者你创建个 video
标签也行。
不,在我的 Mac Chrome 65 上直接下载了 ...
兄dei,是
pip install --upgrade video_funnel -i https://pypi.python.org/pypi
哈哈,你说的对 😂
现在还会下载吗?
这是什么鬼
* Listening at port 8098 ...
Traceback (most recent call last):
File "/Users/windard/anaconda/envs/python36/bin/vf", line 11, in <module>
sys.exit(main())
File "/Users/windard/anaconda/envs/python36/lib/python3.6/site-packages/video_funnel/__main__.py", line 44, in main
loop=asyncio.get_event_loop()
TypeError: run_app() got an unexpected keyword argument 'loop'
aiohttp 3.0.9
def run_app(app, *, host=None, port=None, path=None, sock=None,
shutdown_timeout=60.0, ssl_context=None,
print=print, backlog=128, access_log_class=helpers.AccessLogger,
access_log_format=helpers.AccessLogger.LOG_FORMAT,
access_log=access_logger, handle_signals=True,
reuse_address=None, reuse_port=None):
但是你的代码
web.run_app(
app,
print=None,
port=args.port,
loop=asyncio.get_event_loop()
)
😢 看样子是最新的 aiohttp 弃用了 loop 参数,容我再看看
是的,在 aiohttp 里是这样的
def run_app(app, *, host=None, port=None, path=None, sock=None,
shutdown_timeout=60.0, ssl_context=None,
print=print, backlog=128, access_log_class=helpers.AccessLogger,
access_log_format=helpers.AccessLogger.LOG_FORMAT,
access_log=access_logger, handle_signals=True,
reuse_address=None, reuse_port=None):
"""Run an app locally"""
loop = asyncio.get_event_loop()
你的 loop 参数不用传进去。
或者你可以在 setup 里注明依赖的版本
是这样的,这个 run_app 函数最后会 close 掉 loop ,这样对于一个只使用 aiohttp.web
的程序是没有任何问题的,但 vf 还使用了 aiohttp.ClientSession
,如果在 session 关闭之前关掉了 loop 就出错了。在之前的版本中,aiohttp 如果检测到 loop 参数不为 None ,就不会自动关掉 loop。我现在在尝试使用 app.on_cleanup
来关闭 ClientSession
。