DVテープを今のうちにPCにアーカイブする

# 1. はじめに

家族ムービーがDVテープで数十本ある．手元にはまだDV+VHSのデッキ，ミニDVのハンディカムがあり，動いているけどテープが出てこないとか動作が怪しくなってきた．
動いてるうちにキャプチャしておく！と一念発起してそのワークフローと`ffmpeg`ラッパーを作ったので記録．
![dvtapes.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411108/82606fd4-0fb4-4804-652e-f6c09ac4b94d.jpeg)

## 1.1 条件

- Macでできること
- OSSで完結すること
- ロスレスでキャプチャ・保管すること
- 多少のエラーは無視してキャプチャできること
- DVテープの日付時刻情報をキープすること
- 日付，イベントの切れ目で分割すること
- 家族に渡すムービーは日付・時刻をレンダリングしたmp4にすること

## 1.2 リサーチ

こちらの方がほぼ同じ発想で方法を公開されていた．
["Capturing and Archiving MiniDV Tapes on macOS"](https://leolabs.org/blog/capture-minidv-on-macos/)
以下，途中までLéoさんの方法の受け売り．逐語訳ではないけれどエッセンスを半分以上お借りしている．

## 1.3 構築環境

macOS 14.4.1 (Sonoma)
LéoさんもmacOS．Windows, Linuxは要人柱
Pythonは3.9以降（dictのunionを使っている）

# 2. ワークフロー

## 2.1 概略

## 2.2 アーカイブまで

インストールすべきは以下ソフトウェアの項で説明

1. デッキとPCをFirewireで繋ぐ
1. デッキのIDを得る `ffmpeg -f avfoundation -list_devices true -i ""`
1. キャプチャ `ffmpeg-dl -f avfoundation -capture_raw_data true -i "<ID>" -c copy -map 0 -f rawvideo video.dv` １時間で約13.5GBのファイルになる．
1. マーカ点でファイル分割 `dvpackager -e dv -s video.dv`
1. 細かすぎるファイルを結合．`cat`が使える．`cat foo_1.dv ... foo_n.dv > foo.dv`
1. ファイル名を日付ベースに変更 `mv_datetime.py video_part*.dv`
1. 保存したいフォルダに移動．video.dvは削除

## 2.3 渡すムービーの作成

1. 日付を書き込む `render_datetime.py --filter " -vf yadif" --encode " -c:v libx264 -preset slow -crf 20 -c:a ac3" -o .mp4 *.dv out`

これで，デインターレースして`*.dv`にマッチするファイルを一気にmp4にしてフォルダー"out"に保存．なお，デインターレースした結果fpsが倍になっている．`-mode send_frame`を yadifに追加すれば同じfpsになる．


# 3 インフラ
## 3.1 ハードウェア

私が持ってるデッキは，
- [WV-DR7](https://www.sony.jp/products/Consumer/VD/WV-DR7/index9.html): SonyのDV+VHSダブルデッキ
- [DCR-TRV30](https://www.sony.jp/support/handycam/products/dcr-trv30/): SonyのミニDVハンディカム

両方ともDV(Mini FireWire)出力がある．IDはそれぞれ"WV-D", "DCR-TRV30"だった．PCは，
- Macbook Air M2 (2023) / OS 14.4.1 (Sonoma)

### PCとデッキの接続方法

Mac側にはUSB-C (Thunderbolt 3/4)しかない．
1. Thunderbolt 3（USB-C）- Thunderbolt 2 アダプタ
1. Thunderbolt - FireWire 800 アダプタ
1. FireWire 800 - FireWire 400 アダプタ
1. FireWire 400 - Mini FireWire ケーブル

これでやっとデッキに繋がる．LéoさんはDV Line Protectorというのを入れてるが，既に絶版ぽい．心配なら，デッキとPCの筐体外装をあらかじめ短絡して等電位にしておいてからケーブルを接続すれば良い（かも）．

#### 【番外：デッキに繋がるモニターがない！】

デッキで再生してる映像を確認したい．でもデッキの映像出力は，アナログコンポジットとS端子．自宅にはそんな入力のあるモニタは既にない．仕方なく，これを買った．
　[コンポジット ー HDMI出力用コンバーター](https://www.amazon.co.jp/gp/product/B00J8CTIQI/ref=ppx_yo_dt_b_asin_title_o05_s00)
ただし，アナログなりの絵になる．モニタリング用には十分．

## 3.2 ソフトウェア

Homebrewで調達できるものは揃える．以下，[Léoさん](https://leolabs.org/blog/capture-minidv-on-macos/)の方法そのまま

```bash
brew tap amiaopensource/amiaos
brew tap mediaarea/homebrew-mediaarea
brew install ffmpegdecklink dvrescue mediainfo
brew link --force ffmpegdecklink
```

Pythonスクリプト`mv_datetime.py`と`render_datetime.py`は[github](https://github.com/kchinzei/dvarchiver)にあげてある．
`ffmpeg-python`と`PyExifTool`をPyPIから取ってくる．

使用したソフトのバージョンは以下の通り

- OS: macOS 17.3 and 17.4.1 (Sonoma)
- python 3.11.9 and 3.12.2
- ffmpeg 6.1.1
- ffmpeg-dl 5.1.4
- ffmpeg-python 0.2.0
- dvresque 24.01
- mediainfo 24.03

#### 【番外：ffmpegのDV出力でエラーが出る件】

`render_datetime.py`にdvフォーマットのファイルを出力させると，
`Assertion cur_size >= size failed at libavutil/fifo.c:2703 ...`
というエラーが出ることがある．あるいは，出力のdvファイルが6秒くらいで切れた状態になる．

その場合，`--bug`オプションを`render_datetime.py`に追加してみて．
mp4を出力するときは，このエラーは出ない．

このエラーはffmpegがエラーを含むdvファイルをうまく扱えないことにあるように見える．[ここ](https://github.com/kchinzei/ffmpeg_dv_issue)にまとめてある．

# 4. まとめ

今ならまだ，OS側でDV接続をサポートしていたり，ケーブルが売られていたり，OSSのツールが公開されている．
でも，OSSのツールがいつまでも動くとは限らない．macOSのAV FoundationはAppleの一存でdepricateになる．デッキはとっくの昔に修理できないし，メルカリ等でも良品は入手が難しくなっていく．

結論：善は急げ