IINA - 一个现代的 macOS 视频播放器

2017-01-04 19:14:15 +08:00
 lhc70000

作为一个 Mac 用户,或许你和我一样感到过疑惑:为什么这样一个拥有众多高质量软件的平台,竟没有一个强大而优雅的视频播放器。

说起 macOS 上的视频播放器,大多数人会举出 QuickTime 、 VLC 、 MPlayerX 等名字,然而他们的缺点也显而易见: QuickTime 支持的格式太少; VLC 界面不美观,也时常卡顿; MPlayerX 基于稍稍过时的 mplayer ,不再有大幅更新,而且界面......不是那么 Mac 。

这个知乎问题中,有人推荐过了 mpv 。 mpv 是 mplayer 系唯一活跃开发的分支,也是当前跨平台功能最强大的播放软件之一。两年前的我也是从这个问题才了解到 mpv ,当即装上测试,对它的解码能力和强大配置选项有了很深的印象。但即使作为程序员的我,也用不惯它的命令行界面:一个媒体类软件,怎能没有一个好用好看的 UI 呢?

所以今年暑假,我突然冒出「做一个现代的 macOS 视频播放器」的想法。我经常想出个点子做一两天之后坑掉,但是幸运的是,对于这个项目,虽然中间由于自己懒和课程太忙暂停了好一阵,我还是坚持下来了。

Project IINA,是一个基于 mpv 、契合 macOS 设计风格、力求做到最佳用户体验、轻便且功能强大的视频播放器项目。

解码和播放

IINA 以 mpv 为播放核心,所以享受到了 mpv 解码和图像方面的所有优点。与 MPlayerX 使用的 slave mode 不同, IINA 使用了 libmpv 的 C API ,来提供更加稳定快速的渲染和控制。此外,它使用原始屏幕分辨率渲染,所以比起其他一些播放器画质有显著提高。

( IINA 与 MPlayerX 同分辨率下的字幕渲染对比)

用户界面

不多说,先上截图:

当前 macOS 的毛玻璃效果可以选择材质,所以标题栏和播放控制有四种主题可选: Dark (截图中的主题)、 Ultra Dark 、 Light 和 Medium Light 。

语言方面,开发(和截图中)语言为英文,但目前几乎所有界面都有简体中文支持。

快速设置

或许你试过在其他播放器中,调整音频延迟等选项时,需要不断点击菜单项来一次又一次地加减音频延迟的数值;或者在选择音轨字幕时,展开好几层菜单来找到需要的那一个。当然, IINA 提供了和其他播放器一样,甚至更丰富的菜单项,它也提供了一个快速设置界面,涵盖了所有常用的视频、音频和字幕选项,并使用了各种可交互的控件来大大加快更改各种播放设置的效率。

(视频设置)

(音频设置)

(字幕设置)

这些界面只需一个快捷键即可调出。传统的菜单项设置也全部保留,方便有任何需求的用户。

甚至对于画面剪切(用途有去黑边等),除去快速设置中的按常用长宽比剪切,它甚至提供了一个全交互式的剪切界面(此界面将来可扩展至更多设置):

播放列表和章节

IINA 支持简易的播放列表(更多功能稍后添加)。对于分章节的视频,它更是可以把内容及起始时间一目了然地列出:

(播放列表)

(章节)

点击即可跳转至相应视频或者时间。

丰富的设置项

IINA 希望能迎合尽可能多用户的喜好。在开发过程中,遇到和身边人不同的操作习惯,我会把它们作为可选的设置项加入偏好设置。

比如,播放按钮两边的左右箭头,可以选择调整速度(类似 QuickTime )、上一个 /下一个媒体( MPlayerX )或是前进 /后退;又如鼠标在播放界面单击和双击,都可以有可选的相应动作。

我也尽量满足一些「强迫症」用户的偏好,所以在拖动播放控制时,可以吸附窗口中心;又如在根据视频大小调整窗口大小时,可以选择根据 Retina 屏物理分辨率还是逻辑分辨率。

对于快捷键, IINA 保留了整个 mpv 的 input.conf 系统,以做到与原来 mpv 用户的最大兼容。但是,用户可以有多个快捷键配置文件,并在 GUI 中切换和编辑他们(暂时可以做到快捷键配置的管理和录制新快捷键,但对应命令需要自行输入;此问题会尽快解决)。

欲查看所有设置项的截图,请访问 IINA 的网站(链接在文章底部)。

MPV 的配置文件和脚本系统

当然, IINA 支持 mpv 强大的配置文件和 lua 脚本系统。对于现有的 mpv 用户,只需要打上一个勾, IINA 就会自动使用原有的全部配置(并覆盖偏好设置中的相关项),从而几乎无缝切换到一个同样内核但有强大界面的新播放器。

目前 IINA 也支持 mpv 的日志功能( Debug 用),以及使用 mpv 自己的 osd 。

当然,对于不熟悉 mpv 的用户,这些选项平时会被禁用,不会有任何影响。

面向现代 macOS

现有的播放器有很多都含有不少冗余部分,如 MPlayerX ,含有很多用于兼容 10.6 的代码,而如今几乎没有人在使用此版本。 IINA 仅面向现代 macOS ,支持 macOS 10.10+,推荐使用 macOS 10.12 。

免费,开源,期待你的参与

IINA 由纯 Swift 写成,并在 github 上使用 GPLv3 开源。 IINA 不管现在还是将来,都将免费。

如果你对这个项目感兴趣,可以用各种方式给我反馈:

Alpha 1

目前 IINA 已经推出了第一个版本 v0.0.1 。不过由于我的经验不足,我相信此版本仍有很多待解决的问题。如果你发现了问题,甚至软件根本不能打开,请在 github 上提出 issue 或者通过邮件 /私信等方式联系我。

下载地址等请参见网站,或 github 上的 release 。

Github : https://github.com/lhc70000/iina

网站:https://lhc70000.github.io/iina/zh-cn/

(第一次发帖就是类似广告的东西,还请大家见谅^ ^||)

72290 次点击
所在节点    分享创造
228 条回复
hdbean
2017-01-05 01:17:30 +08:00
屌!还是用 swift 写的!
isphone
2017-01-05 01:21:49 +08:00
太长了
lhc70000
2017-01-05 01:44:58 +08:00
@weicaizhi @wangpao

名字方面... 因为想不出什么有意义的名字,反而取了这个没有恁么意义但看起来有点科技感(误)的名字。暂时不打算改,还是先完善功能吧。感谢支持~
darluc
2017-01-05 01:46:21 +08:00
太赞了!!!
lhc70000
2017-01-05 01:47:09 +08:00
@ITOutsider

全屏的话:
- 菜单中 Video > Full Screen | 视频 > 全屏
- 快捷键 Command + F (也许 option+cmd+F 会好一点?)
- 左上角绿色按钮
lhc70000
2017-01-05 01:59:25 +08:00
@sodatea 如果要长一点可能只有允许自定义进度条长度了,目前做起来还是有点麻烦的,优先级会比较靠后。

可能有一些替代方案:
- 用 Command+J 跳转至精确时间点
- Command + 左右键可以左右移动 5 秒,同时按住 option 可以左右移动一帧
- 设置一个左右轻微移动的快捷键(快捷键系统可能有 bug )
- 使用触控板左右滚动来调整

我会继续考虑如何进行精确的定位。
xshwy
2017-01-05 04:07:50 +08:00
看起来好漂亮!明天就去下载!
dreamcog
2017-01-05 04:14:13 +08:00
诚意之作!
goodryb
2017-01-05 04:20:54 +08:00
@lhc70000 帮你建了一个 telegram 群,可以的话你就 append 上去, QQ 现在不怎么用了
https://telegram.me/joinchat/EUPqOwkAnyXQGU3cje6aQg
hackpro
2017-01-05 05:41:33 +08:00
基于 mpv ,性能足够强大,使用也够便捷,已 Star
提交一个 Bug ,播放时候按 q 退出的时候会崩溃, log 如下

Process: IINA [38669]
Path: /Applications/IINA.app/Contents/MacOS/IINA
Identifier: com.colliderli.iina
Version: 0.0.1 (1)
Code Type: X86-64 (Native)
Parent Process: ??? [1]
Responsible: IINA [38669]
User ID: 501

Date/Time: 2017-01-05 05:37:58.251 +0800
OS Version: Mac OS X 10.11.6 (15G1212)
Report Version: 11
Anonymous UUID: 768E5877-C56F-F813-5229-5D3947E27EB5


Time Awake Since Boot: 31000 seconds

System Integrity Protection: enabled

Crashed Thread: 5 mpv/mpv core

Exception Type: EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY

Application Specific Information:
Assertion failed: (!ctx->initialized), function free_ctx, file ../video/out/vo_opengl_cb.c, line 113.


Thread 0:: Dispatch queue: com.apple.main-thread
0 libsystem_kernel.dylib 0x00007fff993abf72 mach_msg_trap + 10
1 libsystem_kernel.dylib 0x00007fff993ab3b3 mach_msg + 55
2 com.apple.CoreFoundation 0x00007fff8e546124 __CFRunLoopServiceMachPort + 212
3 com.apple.CoreFoundation 0x00007fff8e5455ec __CFRunLoopRun + 1356
4 com.apple.CoreFoundation 0x00007fff8e544e38 CFRunLoopRunSpecific + 296
5 com.apple.HIToolbox 0x00007fff917e1935 RunCurrentEventLoopInMode + 235
6 com.apple.HIToolbox 0x00007fff917e176f ReceiveNextEventCommon + 432
7 com.apple.HIToolbox 0x00007fff917e15af _BlockUntilNextEventMatchingListInModeWithFilter + 71
8 com.apple.AppKit 0x00007fff9d791df6 _DPSNextEvent + 1067
9 com.apple.AppKit 0x00007fff9d791226 -[NSApplication _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 454
10 com.apple.AppKit 0x00007fff9d785d80 -[NSApplication run] + 682
11 com.apple.AppKit 0x00007fff9d74f368 NSApplicationMain + 1176
12 com.colliderli.iina 0x00000001011131b9 main + 73
13 libdyld.dylib 0x00007fff9cebd5ad start + 1

Thread 1:: Dispatch queue: com.apple.libdispatch-manager
0 libsystem_kernel.dylib 0x00007fff993b2efa kevent_qos + 10
1 libdispatch.dylib 0x00007fff93e3b165 _dispatch_mgr_invoke + 216
2 libdispatch.dylib 0x00007fff93e3adcd _dispatch_mgr_thread + 52

Thread 2:
0 libsystem_kernel.dylib 0x00007fff993b25e2 __workq_kernreturn + 10
1 libsystem_pthread.dylib 0x00007fff96e11578 _pthread_wqthread + 1283
2 libsystem_pthread.dylib 0x00007fff96e0f341 start_wqthread + 13

Thread 3:: Dispatch queue: com.colliderli.iina.mpvgl
0 com.apple.opengl 0x00007fff94b37514 CGLUnlockContext + 0
1 com.apple.AppKit 0x00007fff9ddce30b -[NSOpenGLContext unlock] + 27
2 com.colliderli.iina 0x00000001011921cd _TFC4IINA9VideoView9drawFramefT_T_ + 509
3 com.colliderli.iina 0x0000000101192946 _TPA__TFFFC4IINA9VideoViewW12mpvGLContextGSQVs13OpaquePointer_U0_FGSqSv_T_U_FT_T_ + 38
4 libdispatch.dylib 0x00007fff93e4093d _dispatch_call_block_and_release + 12
5 libdispatch.dylib 0x00007fff93e3540b _dispatch_client_callout + 8
6 libdispatch.dylib 0x00007fff93e3a03b _dispatch_queue_drain + 754
7 libdispatch.dylib 0x00007fff93e40707 _dispatch_queue_invoke + 549
8 libdispatch.dylib 0x00007fff93e38d53 _dispatch_root_queue_drain + 538
9 libdispatch.dylib 0x00007fff93e38b00 _dispatch_worker_thread3 + 91
10 libsystem_pthread.dylib 0x00007fff96e114de _pthread_wqthread + 1129
11 libsystem_pthread.dylib 0x00007fff96e0f341 start_wqthread + 13

Thread 4:
0 libsystem_kernel.dylib 0x00007fff993b25e2 __workq_kernreturn + 10
1 libsystem_pthread.dylib 0x00007fff96e11578 _pthread_wqthread + 1283
2 libsystem_pthread.dylib 0x00007fff96e0f341 start_wqthread + 13

Thread 5 Crashed:: mpv/mpv core
0 libsystem_kernel.dylib 0x00007fff993b1f06 __pthread_kill + 10
1 libsystem_pthread.dylib 0x00007fff96e144ec pthread_kill + 90
2 libsystem_c.dylib 0x00007fff94dcb6df abort + 129
3 libsystem_c.dylib 0x00007fff94d92dd8 __assert_rtn + 321
4 libmpv.1.23.0.dylib 0x00000001014ca50c free_ctx + 76
5 libmpv.1.23.0.dylib 0x00000001014d452e ta_free + 62
6 libmpv.1.23.0.dylib 0x0000000101472b69 mp_destroy + 169
7 libmpv.1.23.0.dylib 0x000000010145d8c8 playback_thread + 72
8 libsystem_pthread.dylib 0x00007fff96e1199d _pthread_body + 131
9 libsystem_pthread.dylib 0x00007fff96e1191a _pthread_start + 168
10 libsystem_pthread.dylib 0x00007fff96e0f351 thread_start + 13

Thread 6:: com.apple.NSEventThread
0 libsystem_kernel.dylib 0x00007fff993abf72 mach_msg_trap + 10
1 libsystem_kernel.dylib 0x00007fff993ab3b3 mach_msg + 55
2 com.apple.CoreFoundation 0x00007fff8e546124 __CFRunLoopServiceMachPort + 212
3 com.apple.CoreFoundation 0x00007fff8e5455ec __CFRunLoopRun + 1356
4 com.apple.CoreFoundation 0x00007fff8e544e38 CFRunLoopRunSpecific + 296
5 com.apple.AppKit 0x00007fff9d8e7d95 _NSEventThread + 149
6 libsystem_pthread.dylib 0x00007fff96e1199d _pthread_body + 131
7 libsystem_pthread.dylib 0x00007fff96e1191a _pthread_start + 168
8 libsystem_pthread.dylib 0x00007fff96e0f351 thread_start + 13

Thread 7:
0 libsystem_kernel.dylib 0x00007fff993b25e2 __workq_kernreturn + 10
1 libsystem_pthread.dylib 0x00007fff96e11578 _pthread_wqthread + 1283
2 libsystem_pthread.dylib 0x00007fff96e0f341 start_wqthread + 13

Thread 8:: CVDisplayLink
0 libsystem_kernel.dylib 0x00007fff993b1db6 __psynch_cvwait + 10
1 libsystem_pthread.dylib 0x00007fff96e1275e _pthread_cond_wait + 821
2 com.apple.CoreVideo 0x00007fff9a4c10d8 CVDisplayLink::waitUntil(unsigned long long) + 232
3 com.apple.CoreVideo 0x00007fff9a4c0ed1 CVDisplayLink::runIOThread() + 511
4 com.apple.CoreVideo 0x00007fff9a4c09a9 startIOThread(void*) + 147
5 libsystem_pthread.dylib 0x00007fff96e1199d _pthread_body + 131
6 libsystem_pthread.dylib 0x00007fff96e1191a _pthread_start + 168
7 libsystem_pthread.dylib 0x00007fff96e0f351 thread_start + 13

Thread 9:: CVDisplayLink
0 libsystem_kernel.dylib 0x00007fff993b1db6 __psynch_cvwait + 10
1 libsystem_pthread.dylib 0x00007fff96e1275e _pthread_cond_wait + 821
2 com.apple.CoreVideo 0x00007fff9a4c10d8 CVDisplayLink::waitUntil(unsigned long long) + 232
3 com.apple.CoreVideo 0x00007fff9a4c0ed1 CVDisplayLink::runIOThread() + 511
4 com.apple.CoreVideo 0x00007fff9a4c09a9 startIOThread(void*) + 147
5 libsystem_pthread.dylib 0x00007fff96e1199d _pthread_body + 131
6 libsystem_pthread.dylib 0x00007fff96e1191a _pthread_start + 168
7 libsystem_pthread.dylib 0x00007fff96e0f351 thread_start + 13
mczo
2017-01-05 07:05:20 +08:00
Mark
Valyrian
2017-01-05 07:16:35 +08:00
全屏快捷键改成和别的 app 一样的 ctrl command f 吧
iamben
2017-01-05 08:01:08 +08:00
一直用的 vlc 。跟它比有啥优势不?
paradoxs
2017-01-05 08:04:45 +08:00
应该和 movist 做比较
burning
2017-01-05 08:38:11 +08:00
@lhc70000 是的 外置无线鼠标 滚动确实无法调节音量

另外 触控板上下调节音量和其他的软件操作是相反的,双指上滑音量变小,这个有点奇怪。
zobor
2017-01-05 09:07:59 +08:00
Mac 下我一般都是看 mp4 格式的电影 下载了试试
Dvel
2017-01-05 09:17:36 +08:00
这个名字应该怎么念啊
lhc70000
2017-01-05 09:17:42 +08:00
@hackpro @Valyrian @burning 已记录,感谢反馈~
xuhaoyangx
2017-01-05 09:19:05 +08:00
短暂发现几个问题:
1 、打开视频后,强制会进入独显模式~,自用 mpv 不会[默认会启动硬解],在 IINA 关闭硬解也会这样
2 、不知道是不是个人问题, mpv 按 i 可以显示视频参数信息
3 、新打开后有些按键不起作用,比如空格暂停
oxoxoxox
2017-01-05 09:28:19 +08:00
赞!不过现在 movist 用着还蛮好的,等待 LZ 发布稳定正式版

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/332235

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX