媒體傳輸協議 - 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）訪問不同型號手機的文件。對於至少一位用戶，解決方案是將其關閉。

分類：​

- 存儲
- 行動裝置

媒體傳輸協議
新增話題