cshuaimin/video-funnel

无法使用打开 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-Typevideo/xx 后会自动播放(而不是下载)。或者你创建个 video 标签也行。

不,在我的 Mac Chrome 65 上直接下载了 ...

噢我知道了,你是不是播放的是个下载链接?服务器返回了 Content-Disposition: attachment 头来强制下载。
@windard 我更新了下删掉了这个头,你更新下 pip 包:

$ pip --upgrade video_funnel -i https://pypi.python.org/pypi

86f73df

兄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