Windowsで「Tello_Video」の環境構築

#はじめに
※2020年12月23日追記　ffmpegがまた消えていたので、修正しました。

このページは，

[Tello-Pythonのサンプル「Tello_Video」を動かす](https://qiita.com/hsgucci/items/c9082690c6d0695b722f)

の補足ページです．

と言うか「Tello_Video」のためだけでなく,
Windowsで「Tello-Python」をやろうと思ったら、Pythonのインストールを含めてまずこの作業を最初に行う必要がありますね．


#概要

DJI公式のTello用Pythonサンプルプログラム「Tello-Python」のうち，
　[Tello_Video](https://github.com/dji-sdk/Tello-Python/tree/master/Tello_Video)
を試すためには、あらかじめ

- 様々な依存ライブラリのインストール

を行う必要があります。

gitの[Tello-Pythonのページ](https://github.com/dji-sdk/Tello-Python/tree/master/Tello_Video#installation)には，インストール方法として

```
・Windows

Go to the "install\Windows" folder,select and run the correct "windows_install.bat" according to your computer operating system bits.
```

と書いてあります．
すなわち，

```bash:フォルダ移動・ファイルの属性変更・シェルファイル実行
> cd install¥Windows¥
> windows_install.bat
```
とコマンドを打てよ，ということです．
<font color="blue">**windows_install.bat**</font>が，Windows用の環境構築を自動的に行ってくれるバッチファイルです．

しかし，これを実行しても，

- 指定されたPythonのバージョンが2.7.15．どうせなら最終バージョンの2.7.17をインストールしたい
- 自動インストールされたPythonでは，コマンドプロンプトでpipが使えないので再度手動インストールする必要がある
- 指定されたffmpegのバージョンが古く，ファイルが存在しないのでダウンロードできない
- boostのダウンロードがうまくいかず，エラーになる
- VisualStudioランタイムのダウンロードがうまくいかず，エラーになる
- ダウンロードしたファイルのMD5をいちいちチェックするので、違うバージョンを対応させるのが大変


とまあ，不具合/面倒が乱発します．
**そもそも実行ファイル名はwindows_install.batじゃなくて，install.batだし！**
これを解決するために，色々な作業が必要です．

#前提条件

ホームフォルダ(c:¥Users¥(ユーザー名)¥)にTello-Pythonがインストールされている，
すなわち，`c:¥Users¥(ユーザー名)¥Tello-Python-master`というフォルダがある前提で話を進めます．

また，

- Windowsのコマンドプロンプトの起動
- テキストファイル(実際にはBATファイル)の文字コードの変更

と言われて分かるだけのスキルを持っていることも大前提です．
Windowsは便利ですが，ちょっと変わったことをしようとすると情弱には厳しい環境なのです(>_<

#フォルダの移動
まずはエクスプローラーで，Tello-Videoの中のinstall¥Windowsフォルダへ移動します．
![tello_video_folder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/81926e7f-4dd3-c6fd-30a1-8e403f3522bb.png)
フォルダの中には，`install.bat`と`uninstall.bat`があります．
**<font color=red>この install.bat を使ってもうまくいかないので注意してください．</font>**

このフォルダを作業エリアとして，次項以下の作業をしていきます．

#新しいBATファイルを作る
WindowsのBATファイルは，文字コードがShift-JISでないとうまく動きません．
（こういう煩わしさがあるから，Windowsは嫌い）

**<font color=blue>以下のコードをメモ帳にコピー＆ペーストし，[ファイル]-[名前を付けて保存]で[文字コード]-[ANSI]で保存してください．</font>**
何らかのテキストエディタを使っている場合は,[Shift-JIS]で保存してください.
ファイル名は`install_new2020Dec23.bat`としています。

一応，[github](https://github.com/hsgucci404/tello/raw/master/Tello_Video_win/install_new2020Dec23.bat) にもファイルを置いてありますが，文字コードがUTF-8になってしまっているかもしれないので，そのままでは使えません．
文字コードを[Shift-JIS]に変換しておいてください．

※2020年12月23日追記
　ffmpegの32bit版が見つからなかったので、Tello-Pythonも64bit版のみでしか動かなくなります。
　まあ最近32ビットのWindowsをわざわざ使っている人は見かけないので、大丈夫だとは思いますが．．．

```:install_new2020Dec23.bat
echo=1/*>nul&@cls
@echo off
setlocal enableDelayedExpansion
::runas administrator
%1 start "" mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
cls
::setlocal
call :setdir
call :configx86orx64
set extract=extract
set pythonLib="C:\Python27\Lib\site-packages\"
set /a maxRetry=3
set /a retryCount=0
echo ------------------------------------------------------

::-------------------down python2.7 and install-------------------
echo ------------------------------------------------------
echo                Downloading python2.7                  
echo ------------------------------------------------------
::このレジストリキーは、複数のバージョンのsslおよびtlsのサポートを有効にするために使用され、公式のPython Webサイトへのアクセスを拒否する問題を解決するために使用されます。
REG ADD "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v SecureProtocols /t REG_DWORD /d 2728 /f >nul
set /a retryCount=0
for %%# in (certutil.exe) do (
    if not exist "%%~f$PATH:#" (
        goto downpython
    )
)
if exist %pythonPackage% goto :downpythoncheck
:downpython
call :down %pythonDown% %pythonPackage%
:downpythoncheck
call :checkMD5 %pythonPackage% %pythonMD5% MD5pass
if "%MD5pass%" == "NO" (
    set /a retryCount=!retryCount!+1 && if !retryCount! == %maxRetry% (
        echo Retried %maxRetry% times, all failed. Skip.
        goto downpythonend
    ) else (
        echo Download %pythonPackage% failed. Retrying... !retryCount! of %maxRetry%
        goto downpython
    )
)
call :installmsiPackage %pythonPackage%
::python2.7環境変数を追加する
::wmicはすぐに有効にならないので、setする
echo %PATH%|findstr "c:\python27" >nul
if %errorlevel% neq 0 (
    wmic ENVIRONMENT where "name='PATH' and username='<system>'" set VariableValue="%PATH%;c:\python27"
    set "path=%path%;c:\python27;"
)
echo %PATHEXT%|findstr ".PY;.PYM" >nul
if %errorlevel% neq 0 (
    wmic ENVIRONMENT where "name='PATHEXT' and username='<system>'" set VariableValue="%PATHEXT%;.PY;.PYM"
    set "pathext=%pathext%;.PY;.PYM;"
)
:downpythonend
::-------------------python pipインストール-------------------
echo ------------------------------------------------------
echo                   Downloading pip                    
echo ------------------------------------------------------
set /a retryCount=0
for %%# in (certutil.exe) do (
    if not exist "%%~f$PATH:#" (
        goto downpip
    )
)
if exist %pipPackage% goto :downpipcheck
:downpip
call :down %pipDown% %pipPackage%
:downpipcheck
call :checkMD5 %pipPackage% %pipMD5% MD5pass
if "%MD5pass%" == "NO" (
    set /a retryCount=!retryCount!+1 && if !retryCount! == %maxRetry% (
        echo Retried %maxRetry% times, all failed. Skip.
        goto downpipend
    ) else (
        echo Download %pipPackage% failed. Retrying... !retryCount! of %maxRetry%
        goto downpip
    )
)
python %pipPackage%
python -m pip install -U pip
:downpipend
::-------------------libboost-all-devのインストール-------------------
echo ------------------------------------------------------
echo                Downloading libboost                   
echo ------------------------------------------------------
echo Please wait a few minutes...
set /a retryCount=0
for %%# in (certutil.exe) do (
    if not exist "%%~f$PATH:#" (
        goto downlibboost
    )
)
if exist %libboostPackage% goto :downlibboostcheck
:downlibboost
call :down %libboostDown% %libboostPackage%
:downlibboostcheck
call :checkMD5 %libboostPackage% %libboostMD5% MD5pass
if "%MD5pass%" == "NO" (
    set /a retryCount=!retryCount!+1 && if !retryCount! == %maxRetry% (
        echo Retried %maxRetry% times, all failed. Skip.
        goto downlibboostend
    ) else (
        echo Download %libboostPackage% failed. Retrying... !retryCount! of %maxRetry%
        goto downlibboost
    )
)
call %libboostPackage% /SILENT /NORESTART
:downlibboostend
::-------------------ffmpegのインストールは、Linuxのlibavcodec-dev libswscale-devの2つに依存します-------------------
echo ------------------------------------------------------
echo                  Downloading ffmpeg                   
echo ------------------------------------------------------
set /a retryCount=0
for %%# in (certutil.exe) do (
    if not exist "%%~f$PATH:#" (
        goto downffmpeg
    )
)
if exist %ffmpegPackage% goto :downffmpegcheck
:downffmpeg
call :down %ffmpegDown% %ffmpegPackage%
:downffmpegcheck
call :checkMD5 %ffmpegPackage% %ffmpegMD5% MD5pass
if "%MD5pass%" == "NO" (
    set /a retryCount=!retryCount!+1 && if !retryCount! == %maxRetry% (
        echo Retried %maxRetry% times, all failed. Skip.
        goto downffmpegend
    ) else (
        echo Download %ffmpegPackage% failed. Retrying... !retryCount! of %maxRetry%
        goto downffmpeg
    )
)
call :unpack %ffmpegPackage% %extract%
:downffmpegend
echo ------------------------------------------------------
echo              Downloading VS2013 runtime         
echo ------------------------------------------------------
set /a retryCount=0
for %%# in (certutil.exe) do (
    if not exist "%%~f$PATH:#" (
        goto downvs2013
    )
)
if exist %vs2013package% goto :downvs2013check
:downvs2013
call :down %vs2013depend% %vs2013package%
:downvs2013check
call :checkMD5 %vs2013package% %vs2013MD5% MD5pass
if "%MD5pass%" == "NO" (
    set /a retryCount=!retryCount!+1 && if !retryCount! == %maxRetry% (
        echo Retried %maxRetry% times, all failed. Skip.
        goto downvs2013end
    ) else (
        echo Download %vs2013package% failed. Retrying... !retryCount! of %maxRetry%
        goto downvs2013
    )
)
call %vs2013package% /passive /NORESTART
:downvs2013end
::-------------------python-numpy python-matplotlib opencv-pythonのインストール(pip方式)-------------------
echo ------------------------------------------------------
echo                  Downloading numpy                    
echo ------------------------------------------------------
python -m pip install numpy
echo ------------------------------------------------------
echo                Downloading matplotlib                 
echo ------------------------------------------------------
python -m pip install matplotlib
echo ------------------------------------------------------
echo              Downloading opencv-python                   
echo ------------------------------------------------------
python -m pip install -v opencv-python==3.4.2.17
echo ------------------------------------------------------
echo                  Downloading pillow                   
echo ------------------------------------------------------
python -m pip install pillow
:copydependencies
::-------------------依存ライブラリのすべてのdllをc：\ python27 \ lib \ site-packagesに配置します-------------------
echo ------------------------------------------------------
echo                 Copying dependencies                  
echo ------------------------------------------------------
echo %extract%\%ffmpegPackage:~0,-4%\bin\ 
echo %libboostPackageCopy%
echo %libh264%
xcopy /Y /E /I %extract%\%ffmpegPackage:~0,-4%\bin\*.dll %pythonLib%
xcopy /Y /E /I %libboostPackageCopy% %pythonLib%
xcopy /Y /E /I %libh264%\*.pyd %pythonLib%
endlocal
echo ------------------------------------------------------
echo                  Installation done.                
echo ------------------------------------------------------
pause
goto :eof

::--------------------------------------------------------------------------------------------

::-----------------以下はMD5チェックの定義エリアです------------------
:checkMD5
set file=%~1
call :MD5get %file% MD5
if "%MD5%" equ "%~2" (
      echo MD5 identical.
      set "%~3=YES"
) else (
      if "%MD5%" equ "skip" (
        echo MD5 check skipped.
        set "%~3=YES"
      ) else (
        echo Warning: MD5 does not match!
        set "%~3=NO"
      )
)
goto :eof

::-----------------以下はMD5チェックの定義エリアです------------------
:MD5get
echo %~1
for %%# in (certutil.exe) do (
    if not exist "%%~f$PATH:#" (
        echo certutil.exe not found
        echo for Windows XP professional and Windows 2003
        echo you need Windows Server 2003 Administration Tools Pack
        echo https://www.microsoft.com/en-us/download/details.aspx?id=16770
        echo now skip the MD5 check
        if "%~2" neq "" (
            set "%~2=skip"
        )
        ::exit /b 4
        goto :eof
    )
)

set "md5="
for /f "skip=1 tokens=* delims=" %%# in ('certutil -hashfile "%~f1" MD5') do (
    if not defined md5 (
        for %%Z in (%%#) do set "md5=!md5!%%Z"
    )
)

if "%~2" neq "" (
    set "%~2=%md5%" 
) else (
    echo %md5%
)

goto :eof

::-----------------以下はディレクトリ切り替え定義エリアです------------------
::管理者モードで実行すると、デフォルトのパスが変更され、ディレクトリはここに戻ります
:setdir
set char=%~dp0%
%char:~0,2%
cd  %~dp0%
goto :eof

::-----------------以下はバージョン関数定義エリアです------------------
:configx86orx64
IF %PROCESSOR_ARCHITECTURE% == AMD64 (
    set versionFlag=win64
) else ( 
    set versionFlag=win32
)

echo Windows Version: %versionFlag%
if %versionFlag%==win64 (
    set pythonDown="https://www.python.org/ftp/python/2.7.17/python-2.7.17.amd64.msi"
    set pythonPackage=python-2.7.17.amd64.msi
    set pythonMD5="55040ce1c1ab34c32e71efe9533656b8"

    set pipDown="https://bootstrap.pypa.io/get-pip.py"
    set pipPackage=get-pip.py
    set pipMD5="7036ca015e814fc2619fdb0b73f2ed19"

    set ffmpegDown="https://github.com/BtbN/FFmpeg-Builds/releases/download/autobuild-2020-12-22-12-37/ffmpeg-N-100455-g5dbabb020e-win64-gpl.zip"
    set ffmpegPackage=ffmpeg-N-100455-g5dbabb020e-win64-gpl-shared.zip
    set ffmpegMD5="fc376995d94dc50949555202f5a435c4"

    set libboostDown="https://nchc.dl.sourceforge.net/project/boost/boost-binaries/1.68.0/boost_1_68_0-msvc-12.0-64.exe"
    set libboostPackage="boost_1_68_0-msvc-12.0-64.exe"
    set libboostPackageCopy="c:\local\boost_1_68_0\lib64-msvc-12.0\boost_python27-vc120-mt-x64-1_68.dll"
    set libboostMD5="4e6b11a971502639ba5cc564c7f2d568"

    set libh264=..\..\h264decoder\windows\x64

    set vs2013depend="https://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x64.exe"
    set vs2013package=vcredist_x64.exe
    set vs2013MD5="96b61b8e069832e6b809f24ea74567ba"

) else (
    set pythonDown="https://www.python.org/ftp/python/2.7.17/python-2.7.17.msi"
    set pythonPackage=python-2.7.17.msi
    set pythonMD5="4cc27e99ad41cd3e0f2a50d9b6a34f79"

    set pipDown="https://bootstrap.pypa.io/get-pip.py"
    set pipPackage=get-pip.py
    set pipMD5="b7666e8e7f98f513096601d4203fb007"

    set ffmpegDown="https://ffmpeg.zeranoe.com/builds/win32/shared/ffmpeg-20200311-36aaee2-win32-shared.zip"
    set ffmpegPackage=ffmpeg-20200311-36aaee2-win32-shared.zip
    set ffmpegMD5="bc9eae5466ca033e54588d7c25fe3ea9"

    set libboostDown="https://excellmedia.dl.sourceforge.net/project/boost/boost-binaries/1.68.0/boost_1_68_0-msvc-12.0-32.exe"
    set libboostPackage="boost_1_68_0-msvc-12.0-32.exe"
    set libboostPackageCopy="c:\local\boost_1_68_0\lib32-msvc-12.0\boost_python27-vc120-mt-x32-1_68.dll"
    set libboostMD5="d5d5ee205c87078245eb7df72789f407"

    set libh264=..\..\h264decoder\windows\x86

    set vs2013depend="https://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x86.exe"
    set vs2013package=vcredist_x86.exe
    set vs2013MD5="0fc525b6b7b96a87523daa7a0013c69d"
)

goto :eof

::-----------------これがh264関数定義領域です------------------
:h264install
cd h264decoder
if exist build (
    rd /s /q build 
    mkdir build
) else (
    mkdir build
)
cd build
cmake ..
make
goto :eof

::-----------------以下はダウンロード機能定義エリアです------------------
:down
echo Source:      "%~1"
echo Destination: "%~f2"
echo Start downloading "%~2"...
cscript -nologo -e:jscript "%~f0" "download" "%~1" "%~2"
::echo Download "%~2" OK!
echo ------------------------------------------------------
goto :eof

::-----------------解凍機能の定義エリアは次のとおりです------------------
:unpack
echo Source:      "%~f1"
echo Destination: "%~f2"
echo Start unpacking "%~1"...
cscript -nologo -e:jscript "%~f0" "unpack" "%~1" "%~2" "%~dp0"
echo Unpack "%~1" OK!
echo ------------------------------------------------------
goto :eof
::-----------------以下はインストール機能定義エリアです-----------------
:installmsiPackage
echo Source:      "%~f1"
echo Strat installing "%~f1"...
msiexec /i "%~f1" /passive
echo install "%~1" OK!
echo ------------------------------------------------------
goto :eof
*/

function download(DownSource, DownDestination)
{
    var DownPost
    ,DownGet;

    DownDestination=DownDestination.toLowerCase();
    DownSource=DownSource.toLowerCase();
    //DownPost = new ActiveXObject("Msxml2"+String.fromCharCode(0x2e)+"ServerXMLHTTP");
    //DownPost = new ActiveXObject("Microsoft"+String.fromCharCode(0x2e)+"XMLHTTP");
    //DownPost.setOption(2, 13056);
    var DownPost=null; 
    try{ 
        DownPost=new XMLHttpRequest(); 
    }catch(e){ 
        try{ 
            DownPost=new ActiveXObject("Msxml2.XMLHTTP"); 
            DownPost.setOption(2, 13056);
        }catch(ex){ 
            try{ 
                DownPost=new ActiveXObject("Microsoft.XMLHTTP"); 
            }catch(e3){ 
                DownPost=null; 
            } 
        } 
    } 
    DownPost.open("GET",DownSource,0);
    DownPost.send();
    DownGet = new ActiveXObject("ADODB"+String.fromCharCode(0x2e)+"Stream");
    DownGet.Mode = 3;
    DownGet.Type = 1; 
    DownGet.Open(); 
    DownGet.Write(DownPost.responseBody);
    DownGet.SaveToFile(DownDestination,2); 
}

function unpack(PackedFileSource, UnpackFileDestination, ParentFolder)
{
    var FileSysObject = new Object
    ,ShellObject = new ActiveXObject("Shell.Application")
    ,intOptions = 4 + 16
    ,DestinationObj
    ,SourceObj;

    if (!UnpackFileDestination) UnpackFileDestination = '.';
    var FolderTest = ShellObject.NameSpace(ParentFolder + UnpackFileDestination);
    FileSysObject = ShellObject.NameSpace(ParentFolder);
    while (!FolderTest) 
    {
        WSH.Echo ('Unpack Destination Folder Not Exist, Creating...');
        FileSysObject.NewFolder(UnpackFileDestination);
        FolderTest = ShellObject.NameSpace(ParentFolder + UnpackFileDestination);
        if (FolderTest) 
        WSH.Echo('Unpack Destination Folder Created.');
    }
    DestinationObj = ShellObject.NameSpace(ParentFolder + UnpackFileDestination); 
    SourceObj = ShellObject.NameSpace(ParentFolder + PackedFileSource);
    for (var i = 0; i < SourceObj.Items().Count; i++) 
    {
        try {
            if (SourceObj) {
                WSH.Echo('Unpacking ' + SourceObj.Items().Item(i) + '... ');
                DestinationObj.CopyHere(SourceObj.Items().Item(i), intOptions);
                WSH.Echo('Unpack ' + SourceObj.Items().Item(i) + ' Done.');
            }
        }
        catch(e) {
            WSH.Echo('Failed: ' + e);
        }
    }
}

switch (WScript.Arguments(0)){
    case "download":
        download(WScript.Arguments(1), WScript.Arguments(2));
        break;
    case "unpack":
        unpack(WScript.Arguments(1), WScript.Arguments(2), WScript.Arguments(3));
        break;
    default:
}
```



**<font color=red>ただし，まだこの batファイルでインストールは始めないでください．</font>**
ほとんどの場合，うまくいきません．

batファイルの中で指定されている依存ライブラリを手動でダウンロードし，同じフォルダに置いておくのが安全策です．


#必要なファイルのダウンロード

以下のファイルをダウンロードし，上記フォルダに置いてください．

64bitのWindowsの場合：

　https://www.python.org/ftp/python/2.7.17/python-2.7.17.amd64.msi

　https://bootstrap.pypa.io/get-pip.py
　`get-pip.py`は右クリックして[名前をつけて保存]を使ってください．

　https://github.com/BtbN/FFmpeg-Builds/releases/download/autobuild-2020-12-22-12-37/ffmpeg-N-100455-g5dbabb020e-win64-gpl.zip

　https://nchc.dl.sourceforge.net/project/boost/boost-binaries/1.68.0/boost_1_68_0-msvc-12.0-64.exe
　sourceforgeは右クリック[名前を付けて保存]でダウンロードできないので、リンクをクリックしてページを開いてください。

　https://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x64.exe


~~32bitのWindowsの場合：~~
 ※ffmpegの32bit版の所在が不明のため，32bitのWindowsには非対応とさせていただきます

　https://www.python.org/ftp/python/2.7.17/python-2.7.17.msi

　https://bootstrap.pypa.io/get-pip.py"
　`get-pip.py`は右クリックして[名前をつけて保存]を使ってください．

　~~https://ffmpeg.zeranoe.com/builds/win32/shared/ffmpeg-20200311-36aaee2-win32-shared.zip~~

　https://excellmedia.dl.sourceforge.net/project/boost/boost-binaries/1.68.0/boost_1_68_0-msvc-12.0-32.exe
　sourceforgeは右クリック[名前を付けて保存]でダウンロードできないので、リンクをクリックしてページを開いてください。

　https://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x86.exe

これらのファイルを手動でダウンロードしておくことで，batファイルの実行エラーを防ぐことができます．

#BATファイルの実行
全てのファイルがダウンロードし終わったフォルダの中は，この様になっているはずです．(64bitの場合)

![win_folder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/812b248c-16aa-442f-2d58-2fba59ea0ee8.png)

それでは，`install_new2020Dec23.bat`をダブルクリックしてインストールを開始してください．

1. Pythonのインストール
2. pipのインストール
3. bootsのインストール
4. ffmpegのインストール
5. Microsoftランタイムのインストール
6. numpy，matplotlib，opencv-python，pillowのpipインストール
7. dllのコピー

が自動的に行われます．

うまくインストールが進んでいれば，コマンドプロンプト画面が以下のように表示されます．

![tello_video_install.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/dcf68075-6066-bd34-dc5f-d6214a599053.png)

インストールが終わったら，**ＰＣを再起動**しておきましょう．
環境変数が追加されたので，有効にするためです．


**<font color=red>コマンドプロンプトが一瞬で閉じてしまう場合は，文字コードがShift-JISになっていない，などの原因で失敗しています．</font>**

#MD5の値が違うと(英語で)表示された場合

Windows版は，ダウンロードしたファイルのMD5ハッシュを計算して，ファイルが正しいかどうかわざわざチェックしています．

そのため，元々記述されていたMD5のハッシュ値が現在は異なってしまい，インストール作業がエラーになることがあります．

そんな時は，手動でMD5値を計算し，`install_new2020Dec23.bat`を編集しましょう．

具体的には，267行目以降にある，この部分を書き換えます．

```bat:ダウンロードするURL，ファイル名，MD5値の記述
    set pythonDown="https://www.python.org/ftp/python/2.7.17/python-2.7.17.amd64.msi"
    set pythonPackage=python-2.7.17.amd64.msi
    set pythonMD5="55040ce1c1ab34c32e71efe9533656b8"

    set pipDown="https://bootstrap.pypa.io/get-pip.py"
    set pipPackage=get-pip.py
    set pipMD5="7036ca015e814fc2619fdb0b73f2ed19"

    set ffmpegDown="https://github.com/BtbN/FFmpeg-Builds/releases/download/autobuild-2020-12-21-12-38/ffmpeg-N-100455-g5dbabb020e-win64-gpl-shared.zip"
    set ffmpegPackage=ffmpeg-N-100455-g5dbabb020e-win64-gpl-shared.zip
    set ffmpegMD5="fc376995d94dc50949555202f5a435c4"

    set libboostDown="https://nchc.dl.sourceforge.net/project/boost/boost-binaries/1.68.0/boost_1_68_0-msvc-12.0-64.exe"
    set libboostPackage="boost_1_68_0-msvc-12.0-64.exe"
    set libboostPackageCopy="c:\local\boost_1_68_0\lib64-msvc-12.0\boost_python27-vc120-mt-x64-1_68.dll"
    set libboostMD5="4e6b11a971502639ba5cc564c7f2d568"

    set libh264=..\..\h264decoder\windows\x64

    set vs2013depend="https://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x64.exe"
    set vs2013package=vcredist_x64.exe
    set vs2013MD5="96b61b8e069832e6b809f24ea74567ba"
```

ハッシュ値の計算方法は，このサイトを参考にしてください

[windows標準でMD5などのハッシュ値を出力](https://qiita.com/akimaru86/items/792bd6654b4d44bbf775)

コマンドプロンプトを開いて，ダウンロードしたファイルのあるディレクトリへ移動し，コマンドを打ちます．
例えばffmpegの場合だと，次のように入力します

```bash:ffmpegのMD5計算
> certUtil -hashfile ffmpeg-N-100455-g5dbabb020e-win64-gpl-shared.zip MD5
```

ハッシュ計算の結果が次のように表示されたら，

```
> certUtil -hashfile ffmpeg-N-100455-g5dbabb020e-win64-gpl-shared.zip MD5
MD5 ハッシュ (対象 ffmpeg-N-100455-g5dbabb020e-win64-gpl-shared.zip):
fc376995d94dc50949555202f5a435c4
CertUtil: -hashfile コマンドは正常に完了しました。
```

**fc376995d94dc50949555202f5a435c4**の部分(ファイルによって異なる)をコピーして，
`set ffmpegMD5="***"`のところを書き換えます．

#Pythonの手動再インストール

BATファイルでインストールが終わった状態では，コマンドプロンプトで

```bash:
> pip install モジュール名
```
と打っても，「ファイルがありません」になります．

そこで，`python-2.7.17.amd64.msi`(64bitの場合)をダブルクリックして，インストーラを起動します．

以下の図のように，「Add python.exe to Path」を有効にして再インストールしておきましょう．
![re_python.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/c1c44eca-16e6-03cf-8a32-c851353fa04a.png)


#Tello_Videoの実行

「Tello_Video」を実行するには，コマンドプロンプトで

```bash:
> python main.py
```
と打っていもよいのですが,
Windowsの便利なところは[関連付け実行]です.
以下の図のように,`main.py`をダブルクリックすれば，プログラムが実行されます.
![tello_video_main.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/7c2aef38-90cf-bf6e-af8c-a06aee370323.png)

こんな風に実行画面が出ます．詳細は[Tello-Pythonのサンプル「Tello_Video」を動かす](https://qiita.com/hsgucci/items/c9082690c6d0695b722f)で説明しています．
![tello_video_window.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/5a1d6658-0d31-c097-7834-801dc43bea35.png)


#おわりに

Windowsの環境設定は，本当に「面倒臭い」ですね(>_<