TelloPyでハマった事と対処方法

# このページは？
* トイドローンTelloをPythonで操作するライブラリ`TelloPy`利用時に遭遇した問題（Issue）と対処方法を記載しています。  
https://github.com/hanyazou/TelloPy
* 自分用メモなので環境によって事象／対処方法は異なる可能性があります。

# 前提事項
* 検証PC
  * Windows 10 Professional
  * Visual Studio 2017, Python3.7 導入済み（非Anaconda環境）
* 検証ドローン … 無印Tello

# Issues
### PyAV導入時に 'cl.exe' が見つからないエラー発生
#### 事象 
`pip install av` 実行が下記エラーにより失敗。

```cmd  
‘error: command 'cl.exe' failed: No such file or directory‘  
```

#### 対応方法
* 参考URL  
https://arakan-pgm-ai.hatenablog.com/entry/2018/12/13/000000  

1. 下記URLを開く  
https://visualstudio.microsoft.com/ja/downloads/
1. `Tools for Visual Studio 2017` のセクションを展開し `Build Tools Visual Studio 2017` の`ダウンロード`ボタンをクリック。その後は指示に従ってインストール  
1. プログラムから `VS 2017用 x64_x86 Cross Toolsコマンド プロンプト` を起動して`pip install av` 実行  
---> 本エラーは解消

### PyAV導入時に 'avfilter.lib' が見つからないエラー発生
#### 事象
`pip install av` 実行が下記エラーにより失敗

```cmd
LINK : fatal error LNK1181: 入力ファイル 'avfilter.lib' を開けません。
```

#### 対応方法
* 参考URL:ffmpegのインストール方法  
https://docs.mikeboers.com/pyav/develop/installation.html#build-on-windows

1. 下記URLを開く  
https://ffmpeg.zeranoe.com/builds/
1. 該当するArchitecture を選択し、Linkageの`Shared`と`Dev` をそれぞれ選択して`Download Build`を押下
1. ダウンロードしたファイルを展開し任意のフォルダ（ここでは`C:\dev\ffmpeg`）に配置
1.  `VS 2017用 x64_x86 Cross Toolsコマンド プロンプト` を開いて下記コマンドを実行後に`pip install av` 実行
      
    ```cmd
    set INCLUDE=%INCLUDE%;c:\dev\ffmpeg\include
    set LIB=%LIB%;c:\dev\ffmpeg\lib
    set PATH=%PATH%;c:\dev\ffmpeg\bin
    ```
---> 本エラーは解消

### PyAV導入時に アーキテクチャ競合エラー発生
#### 事象
`pip install av` 実行が下記エラーにより失敗

```cmd  
python37.lib(python37.dll) : fatal error LNK1112: モジュールのコンピューターの種類 'x64' は対象コンピューターの種類 'x86' と競合しています。
```

#### 対応方法
python3.7を64bit版から32bit版に入れ替えて本エラーは解消。（併せてffmpegも32bit版に入れ替え）
しかし、この対処方法で正しいのか不明…

### サンプル実行時にffmpeg関連ライブラリが参照できないエラー
#### 事象
`py -m video_effect.py` 実行時に下記エラーが発生。

```cmd
C:\Users\＜ユーザー名＞\AppData\Local\Programs\Python\Python37-32\Lib\site-packages\tellopy\examples>py -m video_effect.py
Traceback (most recent call last):
  File "C:\Users\＜ユーザー名＞\AppData\Local\Programs\Python\Python37-32\lib\runpy.py", line 183, in _run_module_as_main
    mod_name, mod_spec, code = _get_module_details(mod_name, _Error)
  File "C:\Users\＜ユーザー名＞\AppData\Local\Programs\Python\Python37-32\lib\runpy.py", line 109, in _get_module_details
    __import__(pkg_name)
  File "C:\Users\＜ユーザー名＞\AppData\Local\Programs\Python\Python37-32\Lib\site-packages\tellopy\examples\video_effect.py", line 4, in <module>
    import av
  File "C:\Users\＜ユーザー名＞\AppData\Local\Programs\Python\Python37-32\lib\site-packages\av\__init__.py", line 9, in <module>
    from av._core import time_base, pyav_version as __version__
ImportError: DLL load failed: 指定されたモジュールが見つかりません。
```

#### 対応方法
`VS 2017用 x64_x86 Cross Toolsコマンド プロンプト` を開いて下記コマンド実行でffmpegへの参照を追加することで解消

```cmd
set INCLUDE=%INCLUDE%;c:\dev\ffmpeg\include
set LIB=%LIB%;c:\dev\ffmpeg\lib
set PATH=%PATH%;c:\dev\ffmpeg\bin
```

### Videoを使うサンプル実行時にmplayerが見つからないエラー発生
#### 事象
`python -m tellopy.examples.joystick_and_video` 実行時に下記エラー発生

```cmd
Tello: 23:29:25.923: Error: video recv: [WinError 2] 指定されたファイルが見つかりません。
Traceback (most recent call last):
  File "C:\Users\＜ユーザー名＞\AppData\Local\Programs\Python\Python37-32\lib\site-packages\tellopy\_internal\tello.py", line 694, in __video_thread
    self.__publish(event=self.EVENT_VIDEO_FRAME, data=data[2:])
  File "C:\Users\＜ユーザー名＞\AppData\Local\Programs\Python\Python37-32\lib\site-packages\tellopy\_internal\tello.py", line 154, in __publish
    dispatcher.send(event, sender=self, **args)
  File "C:\Users\＜ユーザー名＞\AppData\Local\Programs\Python\Python37-32\lib\site-packages\tellopy\_internal\dispatcher.py", line 35, in send
    receiver(event=sig, **named)
  File "C:\Users\＜ユーザー名＞\AppData\Local\Programs\Python\Python37-32\lib\site-packages\tellopy\examples\joystick_and_video.py", line 191, in handler
    video_player = Popen(['mplayer', '-fps', '35', '-'], stdin=PIPE)
  File "C:\Users\＜ユーザー名＞\AppData\Local\Programs\Python\Python37-32\lib\subprocess.py", line 775, in __init__
    restore_signals, start_new_session)
  File "C:\Users\＜ユーザー名＞\AppData\Local\Programs\Python\Python37-32\lib\subprocess.py", line 1178, in _execute_child
    startupinfo)
FileNotFoundError: [WinError 2] 指定されたファイルが見つかりません。
```

#### 対応方法
mplayer を導入する。  
下記URLを開き `mplayer-svn-38119-x86_64.7z` をダウンロードして展開して `mplayer.exe` があるフォルダにパスを通す  
  http://mplayerwin.sourceforge.net/downloads.html

# 動いたところ
#### video_effect
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Pythonを使ってTelloのカメラで撮影した映像をPCで見れた。TelloPyというライブラリを使ったのだけど前提となるPyAvのインストールでハマった…<br> <a href="https://twitter.com/hashtag/Tello?src=hash&amp;ref_src=twsrc%5Etfw">#Tello</a> <a href="https://twitter.com/hashtag/drone?src=hash&amp;ref_src=twsrc%5Etfw">#drone</a> <a href="https://twitter.com/hashtag/Python?src=hash&amp;ref_src=twsrc%5Etfw">#Python</a> <a href="https://t.co/xv3b4qgNNz">pic.twitter.com/xv3b4qgNNz</a></p>&mdash; fujihide (@hfujikawa77) <a href="https://twitter.com/hfujikawa77/status/1098753390559911936?ref_src=twsrc%5Etfw">2019年2月22日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#### joystick_and_video
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/Tello?src=hash&amp;ref_src=twsrc%5Etfw">#Tello</a> × <a href="https://twitter.com/hashtag/Python?src=hash&amp;ref_src=twsrc%5Etfw">#Python</a> でPCでビデオストリーミングしながらゲームパッドで飛ばせたー。<br><br>・下記サンプルプログラムを一部書き換えて実行。Logicoolゲームパッドの定義追加<a href="https://t.co/hPLNhbm3HZ">https://t.co/hPLNhbm3HZ</a><br>・使ったゲームパッドはこちら<a href="https://t.co/NBvyc9BTyE">https://t.co/NBvyc9BTyE</a> <a href="https://t.co/xKN48gh08q">pic.twitter.com/xKN48gh08q</a></p>&mdash; fujihide (@hfujikawa77) <a href="https://twitter.com/hfujikawa77/status/1103454745883111424?ref_src=twsrc%5Etfw">2019年3月7日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>