LoginSignup
2
5

More than 1 year has passed since last update.

【Pythonで画像/動画変換】HEIC/MOVファイルを、JPG/MP4ファイルに一括変換

Last updated at Posted at 2022-02-12

はじめに

iPhone/iPadでカメラ・ビデオ撮影しているといつのまにか端末のストレージが一杯になっていることはありませんか?せっかく撮影したものですからバックアップしておきたいものです。

iPhone/iPadにて撮影したたくさんの画像や動画データをクラウドストレージにアップするのではなく、HDDの容量が安価で豊富に準備できるWindows PC上でファイルを管理する方法を紹介していきたいと思います。

file_icon_text_jpg.pngfile_icon_text_mp4.png

Phone/iPadからWindowsPCに画像・動画データーの移動方法

iPhone/iPadからWindowsにデータを移動する方法はいろいろありますが、とても容量が大きい動画ファイルはクラウドストレージ経由でもコピーできない場合があります。

iPhone/iPadをWindowsPCにライトニングケーブル等でUSB接続すると容量が大きな画像データ/動画データでもコピーすることはできます。

  • iPhone/iPadの[設定]-[写真]を選択し、[MACまたはPCに転送]の設定を[元のフォーマットのまま]を選択しておきます
    • 動画ファイルなど大きなデータを転送中にエラーになることが少なくなります
  • iPhone/iPad をUSBでWindowsPCに接続
  • iPhone/iPad の画面上で「信頼する」を選択
  • WindowsPCにAppleデバイスが認識されます
  • フォルダを開いてファイルを全選択してコピーし、コピー先のフォルダにペーストします

画像・動画データーの一括変換

Apple社の独自フォーマット(HEIC/MOV)ファイルはそのままではWindows上で表示・再生できませんので、Windowsでも表示・再生できる形式(JPG/MP4)に一括変換するpythonを使った方法です。
また、ファイル名を分かりやすく、撮影日時に変換する方法を紹介します。

iPhone/iPad上の元データ形式 Windows上で変換後のデータ形式
写真 IMG_5902.JPG 2019-08-13 11.23.45.JPG
写真 IMG_6797.HEIC 2019-11-12 15.11.23.JPG
写真 IMG_4975.PNG 2021-02-23 15.23.45.JPG
動画 IMG_3386.MOV 2021-03-15 08.24.13.MP4

JPG -> JPG変換

  • JPGはWindowsでも表示できますのでデータ形式の変換不要です
  • ファイル名変換は後記します

HEIC -> JPG変換

  • magick.exeを使用させていただきます。
import os
import subprocess

for root, dirs, files in os.walk("./"):
    for file in files:
        ext = os.path.splitext(file)[1]
        ext = ext.lower()
        if ".heic" in ext:
            jpg = os.path.splitext(file)[0] + ".jpg"
            print("magick.exe convert \""+file+"\" \""+jpg+"\"")
            subprocess.run("magick.exe convert \""+file+"\" \""+jpg+"\"", shell=True)

PNG -> JPG変換

  • データ形式の変換をしなくてもWindowsでも表示できます
  • ですがJPG形式に揃えておきたい場合は、magick.exeを使用します
import os
import subprocess

for root, dirs, files in os.walk("./"):
    for file in files:
        ext = os.path.splitext(file)[1]
        ext = ext.lower()
        if ".png" in ext:
            jpg = os.path.splitext(file)[0] + ".jpg"
            print("magick.exe convert \""+file+"\" \""+jpg+"\"")
            subprocess.run("magick.exe convert \""+file+"\" \""+jpg+"\"", shell=True)

JPGファイル名を撮影日時に変換

  • だいたいのJPGファイルにはexifという撮影日時の情報が埋め込まれていますので、その情報を使ってファイル名を変換していきます

    • まれにexifが埋め込まれていないJPGファイル場合変換できません(後日対処方法を別途紹介します)
      • Windows上で、対象の画像ファイルを右クリックし、プロパティを選択
      • 詳細タブを開き、撮影日時の欄 に、手動で日時を入力します
  • PILライブラリを使用しますので、以下のコマンドを実行してインストールしておいてください

    • pip install Pillow
import os
from PIL import Image
from PIL.ExifTags import TAGS

def get_exif(img):
    try:
        exif = img._getexif()
        for id,val in exif.items():
            tg = TAGS.get(id,id)
            if tg == "DateTimeOriginal":
                return val
    except AttributeError:
        return "NON"
    return "NON"

def getDateTime(path):
    try:
        img = Image.open(path)
    except:
        return "NON"
    datetimeinfo = get_exif(img)
    img.close()
    return datetimeinfo

for root, dirs, files in os.walk("./"):
    for file in files:
        ext = os.path.splitext(file)[1]
        ext = ext.lower()
        if ".jpg" in ext:
            exif = getDateTime(os.path.join(root, file))
            if exif != "NON" :
                name = exif
                name = name.replace(':', '-')[:10] + name.replace(':', '.')[10:]
                if name not in file:
                    if not os.path.exists(os.path.join(root, name+".jpg")):
                        os.rename( os.path.join(root, file), os.path.join(root, name+".jpg") )
                        print(os.path.join(root, file) + " -> " + name + ".jpg [Rename]")
            else:
                print(os.path.join(root, file) + " [Exif error]")

MOV -> MP4 変換 + ファイル名を撮影日時に変換

  • ffmpeg.exe を使用します。

    • 以下からWindows版ダウンロードしffmpeg.exeを実行したいフォルダにコピーします
    • https://ffmpeg.org/
    • iPhone/iPadからデータをコピーしたフォルダ上で以下のpythonを実行します
  • iオプションで情報表示された中から、正規表現で撮影日時を取ってきてmp4ファイル名を作成しています

import os
import subprocess
import re

def MovToMp4(path,root):
    print("ffmpeg.exe -i \""+path+"\"")
    result = subprocess.run("ffmpeg.exe -i \""+path+"\"", shell=True, stderr=subprocess.PIPE, universal_newlines=True)
    m = re.search("(?<=com.apple.quicktime.creationdate: )(.*)" , result.stderr)
    date = m.group(0)
    date = date[:-5]
    date = date.replace('T', ' ')
    date = date.replace(':', '.')
    date = date + ".mp4"
    mp4 = os.path.join(root,date)
    print("ffmpeg.exe -i \""+path+"\" \""+mp4+"\"")
    subprocess.run("ffmpeg.exe -i \""+path+"\" \""+mp4+"\"", shell=True)

for root, dirs, files in os.walk("./"):
    for file in files:
        ext = os.path.splitext(file)[1]
        ext = ext.lower()
        if ".mov" in ext:
            MovToMp4(os.path.join(root, file),root)

さいごに

次回は、上記のpythonプログラムを結合したり、ファイルの整理処理や例外処理を追加したり、クラウドストレージと連携したりして、iPhone/iPadの画像/動画ファイルのWindowsへ自動バックアップを目指していきたいと思います。

2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5