媒体传输协议 - Arch Linux 中文维基

跳转到内容

# 媒体传输协议

来自 Arch Linux 中文维基

相关文章

- Android#传输文件
- USB 存储设备

翻译状态：

- 本文（或部分内容）译自 MTP，最近一次同步于 2024-08-21，若英文版本有所更改，则您可以帮助同步与翻译更改的内容。
- 您可以在 ArchWiki 的对应页面找到本文翻译的原始修订历史。
- 本文可能与英文原文存在出入。

媒体传输协议（Media Transfer Protocol MTP）可用于在移动设备（所有的 Windows Phone 7/8/10 设备，大部分新的 Android 设备）以及媒体播放器（如 Creative Zen）之间传输媒体文件。

## 连接

要通过 MTP 将计算机连接至一台设备：

- 该设备需要通过 USB 连接至计算机
- 需要启用设备上的 MTP
- 设备需要解锁屏幕（安全原因）

## FUSE 文件系统

下列程序允许通过 FUSE 文件系统访问 MTP 设备。

注意：MTP 功能杂乱且设备之间的实现各不相同。请尝试以下客户端，找出最合适的那一款。
提示：建议在安装 MTP 相关软件包后重启计算机。

对基于 FUSE 的文件系统，可能需要先创建挂载点目录。以下示例中使用了 `~/mnt` 目录。

挂载的 FUSE 一般可用 `fusermount -u mountpoint` 卸载。

### Android File Transfer

Android File Transfer — 带有 CLI、Qt 界面 和 FUSE 封装器的 MTP 客户端，使用自定义 MTP 实现。

  https://whoozle.github.io/android-file-transfer-linux/ || android-file-transfer包

将设备挂载至 `~/mnt`：

    $ aft-mtp-mount ~/mnt

若希望显示专辑封面，则必须将其命名为 `albumart.xxx` 并应先将其放入目标文件夹，然后再复制其他文件。同时请注意，fuse 可能比 ui 或 cli 的文件传输慢 7 至 8 倍。

若希望通过命令行接口与其交互，请运行命令：

    $ aft-mtp-cli

输入 help 以列出所有可用命令，输入 exit 退出。

若希望通过图形用户界面与其交互，请启动 android-file-transfer 应用程序，选择一个目标文件夹并点击工具栏上的任意按钮。可用选项有：Upload Album（上传专辑）、Upload Directory（上传文件夹）和 Upload Files（上传文件）。后两项不必解释。Upload album 选项将在源目录内搜索并设置一个最佳的专辑封面。

### MTPfs

MTPfs — 一个基于 libmtp 的 FUSE 文件系统，支持读写任意 MTP 设备。

  https://www.adebenham.com/mtpfs/ || mtpfs包

注意：以下操作可能无效，需要恢复至 libgphoto2 或使用支持 gvfs 的文件管理器，例如 PCManFM。

首先编辑 `/etc/fuse.conf`，取消该行的注释：

    user_allow_other

然后将设备挂载至 `~/mnt`：

    $ mtpfs -o allow_other ~/mnt

### jmtpfs

jmtpfs — 基于 libmtp，用于访问 MTP（Media Transfer Protocol）设备。

  https://github.com/JasonFerrara/jmtpfs || jmtpfsAUR

将设备挂载至 `~/mnt`：

    $ jmtpfs ~/mnt

通过以下两个步骤，使其与 Linux 的其他部分保持一致（使用通常的 mount 与 umount 命令）：

    $# ln -s <“实际的挂载命令路径”>                 <“与 Linux 挂载约定一致的名称“>
    $  ln -s /sbin/jmtpfs                        /sbin/mount.jmtpfs

将此行（非 # 注释的那一行）添加至 `/etc/fstab`：

     #jmtpfs <“挂载路径”>         fuse nodev,allow_other,<“其他选项”>                                 0    0
      jmtpfs /home/sam/run/motog fuse nodev,allow_other,rw,user,noauto,noatime,uid=1000,gid=1000    0    0

然后挂载设备，观察选项是否生效：

     $ mount /home/sam/run/motog
     Device 0 (VID=22b8 and PID=2e82) is a Motorola Moto G (ID2).
     Android device detected, assigning default bug flags
     $ mount
      ...
      jmtpfs on /home/sam/run/motog type fuse.jmtpfs (rw,nosuid,nodev,noexec,noatime,user_id=1000,group_id=1000,allow_other,user=sam)

### SIMPLE-MTPFS

SIMPLE-MTPFS — 简易媒体传输协议文件系统（Simple Media Transfer Protocol FileSystem），基于 libmtp，能够对通过 USB 连接至本地机器的 MTP 设备上的文件进行操作。

  https://github.com/phatina/simple-mtpfs/ || simple-mtpfsAUR

运行 `simple-mtpfs -l` 以列出探测到的设备。

要将列表中的第一个设备挂载至 `~/mnt`，请运行 `simple-mtpfs --device 1 ~/mnt`。

### go-mtpfs

go-mtpfs — 使用自定义 MTP 实现的 FUSE 文件系统，用 Go 语言编写。

  https://github.com/hanwen/go-mtpfs || go-mtpfs-gitAUR

安装 android-udev包，之后可编辑 `/etc/udev/rules.d/51-android.rules` 并应用至 `idVendor` 和 `idProduct`，运行 mtp-detect 后可观察到上述行为。在行尾添加当前用户 `OWNER="user"`。

将设备挂载至 `~/mnt`：

    $ go-mtpfs ~/mnt

注意：

- 有多个设备时，可使用 `-d` 标志指定某个设备（id 可通过运行 `mtp-detect` 获取）。
- 使用 `go-mtpfs` 挂载时，若存在外置 SD 卡，挂载可能会失败。若在有 SD 卡的情况下尝试访问设备时遇 go-mtpfs 报错，请移除 SD 卡并重新挂载。
- 该软件包自 2020 年以来未曾维护。

## libmtp

libmtp 是一个 MTP 实现库，还附带了一些命令行工具示例（可使用 `pacman -Ql libmtp` 列出）。

安装 libmtp包 软件包。

运行 `mtp-detect` 以探测设备。

若返回错误，请确认当前用户在 `adbusers` 用户组内。

可使用 `mtp-connect` 命令传输文件。

### 前端

gMTP — libmtp 的一个图形前端。允许用户连接安卓设备，并使用与桌面无关的图形用户界面管理文件。

  https://gmtp.sourceforge.io/ || gmtp包

## 媒体播放器

要在音乐播放器（如 Amarok）中使用 MTP 设备，需编辑 `/etc/udev/rules.d/51-android.rules`（以下示例中的 MTP 设备是一部 Galaxy Nexus）。运行如下命令以搜索设备：

    $ lsusb

搜索结果应类似于：

    Bus 003 Device 011: ID 04e8:6860 Samsung Electronics Co., Ltd GT-I9100 Phone [Galaxy S II], GT-P7500 [Galaxy Tab 10.1]

将条目其添加至 `/etc/udev/rules.d/51-android.rules`，像这样：

    SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0666", OWNER="[username]"

同时，重新加载 udev 规则：

    # udevadm control --reload

## 文件管理器集成

要在文件管理器内通过 MTP 查看安卓设备的存储内容，请安装对应的插件：

- 对于使用 GVFS 的文件管理器（GNOME Files），安装 gvfs-mtp包 以支持 MTP 或安装 gvfs-gphoto2包 以支持 PTP。
- 对于使用 KIO 的文件管理器（KDE 的 Dolphin），kio-extras包（dolphin 的依赖项）已包含 MTP 支持。

安装好所需的软件包后，设备应自动显示在文件管理器内，并且可通过 URL 访问，如 `mtp://[usb:002,013]/`。

### gvfs-mtp

gvfs-mtp包 软件包可从官方仓库获取。

可通过 `lsusb` 获得设备信息，包括 Bus 编号、设备编号（Device numbers）和设备 ID，前两项信息可用于 `gvfs-mtp`，设备 ID 可用于创建 udev 规则。

    Bus 002 Device 018: ID 04b7:88a9 Compal Electronics, Inc.

要查看已探测到启用了 MTP 的设备，使用 gio mount：

    gio mount -li | grep -e ^Volume -e activation_root

    Volume(0): MT65xx Android Phone
      activation_root=mtp://[usb:002,018]/

或使用 lsusb：

    lsusb -v 2> /dev/null | grep -e Bus -e iInterface -e bInterfaceProtocol

    ...
    Bus 002 Device 018: ID 04b7:88a9 Compal Electronics, Inc.
          bInterfaceProtocol      0
          iInterface              5 MTP
    ...

要挂载所有可用的已连接 MTP 设备，请使用内联脚本：

    gio mount -li | awk -F= '{if(index($2,"mtp") == 1)system("gio mount "$2)}'

通过命令使用 gvfs-mtp 挂载或卸载设备，请指定 Bus 编号和设备编号（Device numbers），例如，使用 `gio mount mtp://[usb:001,007]/` 挂载，使用 `gio mount -u mtp://[usb:001,007]/` 卸载。已挂载设备可通过 mtp:host= 开头的目录访问，且位于 /run/user/$UID/gvfs/ 目录下。

使用 gvfs 时，若希望禁用自动挂载 MTP 设备的功能，需更改 AutoMount 变量的值，将其从 true 更改为 false，该变量位于 `/usr/share/gvfs/mounts/mtp.mount`。

注意：文件管理器自身可能有关于自动挂载的选项。它们在启动时将检查所有可挂载的设备。

若设备没有出现在文件管理器中，则可能缺少 #libmtp 的本地支持，或是不在支持的设备列表中。在尝试使用命令行挂载时，可能会遇到错误：

    Device 0 (VID=XXXX and PID=XXXX) is UNKNOWN.
    Please report this VID/PID and the device model to the libmtp development team

使设备显示在文件管理器中的解决方法是，为设备写一个 udev 规则，但这并不保证能用 MTP 连接将其成功挂载。

创建一个 udev 规则配置文件并使用 vendorId:productID 模式的 ID 编号：

    /etc/udev/rules.d/51-android.rules

    SUBSYSTEM=="usb", ATTR{idVendor}=="04b7", ATTR{idProduct}=="88a9", MODE="0660", GROUP="uucp", ENV{ID_MTP_DEVICE}="1", SYMLINK+="libmtp"

然后重新加载 udev 规则：

    # udevadm control --reload

若受 #libmtp 支持，支持 gvfs（英语：gvfs） 的文件管理器能够显示并挂载 MTP 设备。若不受支持且无法打开，请在手机上更改至 PTP 并安装 gvfs-gphoto2包 以获取（至少）对照片的访问，通过命令行挂载 PTP 与挂载 MTP 设备类似：`gio mount gphoto2://[usb:002,019]/`。

注意：若访问设备受限，且无法通过命令行使用标准命令，例如 `cp`、`ls`，请查找 gvfs（英语：gvfs） 的自身替代品：`ls -1 /usr/bin/gvfs-*`。

## 故障排除

### libmtp（gvfs-mtp）：使用文件管理器（nautilus、pcmanfm、vifm 等）访问安卓设备上的相机相册时挂起

症状：一切正常，直到进入相机相册目录。此时文件管理器冻结，甚至在命令行下也无法 `ls` 该目录。

这极有可能是 libmtp 的问题。

该症状可能由类似 `20180915_180351(0).jpg` 的文件名引起。例如，三星手机倾向于创建此类名称的文件。

参见相关问题报告（[1]、[2]）和问答（[3]、[4]）。

该问题可能的解决方法是使用与 #FUSE 文件系统不同的 mtp 选项（例如 go-mtpfs）或更改手机相机的文件命名策略（或切换至其他相机应用，如 Open Camera）。

### jmtpfs：首次访问设备时出现输入输出错误

症状：jmtpfs 成功挂载，但当尝试访问设备上的文件时（例如，通过 `ls` 访问），会产生以下报错：

     cannot access <mount-point>: Input/output error

这可能是一个安全特性：手机屏幕锁定时，MTP 不能正常运作。解锁手机后，只要保持连接，MTP 应正常生效。

### kio-mtp: 无法使用“用文件管理器打开”操作

若无法使用“用文件管理器打开（Open with File Manager）”，可能需要编辑文件 `/usr/share/solid/actions/solid_mtp.desktop` 以解决此问题。

将 `Exec=kioclient exec mtp:udi=%i/` 这一行更改为 `Exec=dolphin "mtp:/"`。

### kio-mtp 被不同的服务同时调用

根据此帖内容，应避免同时使用 mtpfs 和 kio-mtp，或是使用与 kio-mtp 冲突的服务（包括音乐播放服务）。

例如，Amarok 的 MTP 服务插件，可能会阻止 Dolphin（plasma）访问不同型号手机的文件。对于至少一位用户，解决方案是将其关闭。

分类：​

- 存储
- 移动设备

媒体传输协议
添加话题