世界を動かす技術を、日本語で。

自動化の退屈な作業の失われた章:Pythonにおける音声、動画、ウェブカメラ

概要

  • Pythonで オーディオ・ビデオ・ウェブカメラ を制御する方法の解説
  • VLC Media Player などのマルチメディアプレイヤーとファイル形式の基礎知識
  • OpenCV・sounddevice・wavio などのPythonライブラリの利用法
  • ウェブカメラ写真撮影・録音・動画再生 の自動化サンプルコード
  • アスペクト比・解像度 など動画の基本的な概念も説明

Pythonでオーディオ・ビデオ・ウェブカメラを操作する

  • スマートフォン は携帯型フィルムスタジオとして機能
  • 動画・音声編集ソフトは多種多様だが、 大量処理や自動化 にはPythonが有効
  • 例: 1000本の動画ファイルの音量を自動で半減し、サムネイル画像を抽出
  • ウェブカメラやマイク からの録画・録音の自動化も可能
  • 特定イベントで自動撮影・タイムラプス・写真編集・QRコード読み取り など応用範囲が広い

マルチメディアファイルとVLC Media Player

  • VLC Media Player は無料かつ高機能なマルチメディア再生ソフト
  • Windows/macOS/Linux/Android/iOSに対応
  • ファイル拡張子 だけでなく、 コンテナ形式(MP4, AVI, MKV, MOV)とコーデック(MP3, H.264, AAC等) の理解が重要
  • 音声ファイル例: .wav(非圧縮・高音質・大容量)/.mp3(圧縮・音楽向け)/.ogg(オープン規格・高圧縮)
  • 動画ファイル例: .avi(古い・大容量)/.mp4(汎用性高・広く対応)/.mkv(機能豊富・やや限定的)/.webm(新しい・高圧縮)

動画サイズ・アスペクト比の基礎

  • アスペクト比 :幅と高さの比率(例:4:3, 16:9, 19.5:9)
  • ランドスケープ(横長)/ポートレート(縦長) の区別
  • 画面解像度 :ピクセル数(例:1280x720、1920x1080)
  • 動画は一般的な解像度に合わせて作成され、 フルスクリーン表示 などに適合

Pythonでウェブカメラ・マイクを利用する準備

  • OpenCV :画像処理用オープンソースライブラリ
    • 事前に NumPy インストール必須(pip install numpy または sudo apt install python3-numpy)
    • OpenCV自体は pip install opencv-python で導入
  • sounddevice・wavio :音声入出力用Pythonパッケージ(pip install sounddevice, pip install wavio)
  • Pygame :2Dゲーム用だがマルチメディア機能もあり(pip install pygame)

ウェブカメラ画像の撮影サンプル

  • OpenCVでのカメラ制御

    • 複数カメラがある場合、 インデックス(0, 1, 2...) で指定
    • サンプルコードで 接続可能なカメラ一覧を取得 し、最初のカメラでプレビュー画面を表示
    • スペースキーで写真保存、Escキーで終了 できるインターフェース
    import cv2
    def list_webcam_indexes():
        detected_webcam_indexes = []
        for i in range(10):
            webcam = cv2.VideoCapture(i)
            status, frame = webcam.read()
            if status:
                detected_webcam_indexes.append(i)
            webcam.release()
        return detected_webcam_indexes
    
    first_available_index = list_webcam_indexes()[0]
    webcam = cv2.VideoCapture(first_available_index)
    print('index:', first_available_index)
    print('width:', webcam.get(cv2.CAP_PROP_FRAME_WIDTH))
    print('height:', webcam.get(cv2.CAP_PROP_FRAME_HEIGHT))
    print('fps:', webcam.get(cv2.CAP_PROP_FPS))
    while True:
        success, frame = webcam.read()
        if not success:
            print('Could not capture frame.')
            break
        cv2.imshow('Press space to save photo or Esc to exit', frame)
        pressed_key_code = cv2.waitKey(1)
        if pressed_key_code == 32:
            cv2.imwrite("photo.png", frame)
            break
        elif pressed_key_code == 27:
            break
    webcam.release()
    cv2.destroyAllWindows()
    
  • プレビューなしで即撮影 したい場合はさらに簡単なコード

    import cv2, sys
    camera = cv2.VideoCapture(0)
    success, frame = camera.read()
    if not success:
        sys.exit('Invalid webcam index.')
    cv2.imwrite('photo.png', frame)
    

Pygameを使ったウェブカメラ撮影

  • pygame.cameraモジュール でカメラ一覧取得・初期化・撮影・保存まで可能

  • 接続カメラ名はリストで取得(例:['HD Pro Webcam C920', 'Integrated Camera'])

  • サンプルコード

    import pygame.camera, pygame.image, time
    pygame.camera.init()
    all_webcams = pygame.camera.list_cameras()
    webcam = pygame.camera.Camera(all_webcams[0])
    webcam.start()
    time.sleep(1)
    photo = webcam.get_image()
    pygame.image.save(photo, "photo.png")
    pygame.camera.quit()
    

キーコードの調べ方

  • キーイベント処理には ord()関数 で文字キーのコードを取得
    • 例:ord('q')は113(Qキーのコード)

この章では、 Pythonでのマルチメディア自動化 の基礎から具体的なコード例まで、実践的なノウハウを網羅。 OpenCVやPygame を使ったカメラ制御の自動化や、 VLC Media Player によるファイル再生の基礎知識を習得可能。

Hackerたちの意見

あなたのUdemyの同名コースからPythonを学びました。新しい版の本、おめでとうございます!

何年も言ってるけど、今年中にUdemyコースの動画を更新するつもりだからね。

これは私の好きなプログラミング本の一つです。ありがとう、アル!

そして、交通好きのサポーターでもある!

こんにちは、アルです。ハハ、サポーターのクレジットで自分の名前を見つけられるといつも驚くよ。これが他のサポートしてる人たちの(かなり古い)ウェブページだよ: https://alsweigart.com/patreon.html

なんでこの素材を含めなかったのか、ちょっと気になるな。

yt-dlpを見たとき、「危険だな」と思ったんだけど、昔はこのプログラムの前身についてYouTubeからたくさん文句が出てなかったっけ?

ページ数について。『Automate the Boring Stuff with Python』は、コーディング経験がない人向けの初心者向け本のはずなのに、ほぼ600ページもあるんだ。コーディングの最大の障害は「賢さ」ではなく、 intimidation factor を克服することなんだ。編集者はこの章をカットすることを勧めたよ。マルチメディアのことをいつも扱ってるけど、これはほとんどのオフィスワーカーがやらないことだって気づいたんだ(少なくとも、Pythonスクリプトを書く規模ではね)。人にコーディングを教えることは、必要ない情報で情報過多にならないように詳細を隠すことなんだ。多くのソフトウェアオタクはこれを理解してなくて、初心者が再帰や演算子のオーバーロードについて知る必要がないことに気づかず、クールな高度なテクニックに興奮してるんだ。(この本ではOOPは完全にスキップしてるよ。)

これは素晴らしいね。cv2とPythonからたくさんのことを学んだし、ページをざっと見ただけでももっと学べることがありそうだ。

ずっと興味はあったけど、プログラミングを理解するのはできなかった。でも、ここ3〜4年でLLMとPythonスクリプトが私の人生を変えてくれた。

あなたにとって、一番興味深いことや影響を与えたことは何ですか?

いいね!新しく入った人たちには、Pythonの基本を学びたいならここを勧めてるよ。私も今週末にこの章を読んでみるつもり。

playsound このライブラリは残念ながら実質的に放置されてるね。4年以上もアップデートがなくて、最新バージョンは全く動かないんだ。: https://github.com/TaylorSMarks/playsound/issues/101 (一応、バージョン1.2.2にダウングレードする方法はあるけど、それにも問題がある。)Pythonで音声を扱った時、マルチメディアライブラリがどれだけ不足しているかに驚いたよ。例えば、音声ファイルをデータとして読み込む必要があった時、SoundFilelibrosaSoundFileaudioreadのラッパー)やpydubを試したけど、どれも特に満足できるものではなかったし、最近はあまり活発に開発されてないみたい。いろんなフォーマットを読み込む必要があるなら、pydubが一番いいかも(内部でffmpegを使ってるから)。もっと「ネイティブ」な解決策を期待してたんだけど、まあ仕方ないね。残念ながら、pydubもメンテナンスされてないし、パフォーマンスに深刻な問題があるよ(例えば: https://github.com/jiaaro/pydub/issues/518 )。

あ、指摘してくれてありがとう。これは初期の未発表のドラフトだったんだ。後でplaysound3に変更したよ、これはplaysoundの現代的なフォークなんだ。ウェブページも更新したよ。

Pythonプログラムから動画ファイルを再生するのは複雑だよ。PySide6を使うといいよ。以下はその例だよ: import sys from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout from PySide6.QtMultimedia import QMediaPlayer, QAudioOutput from PySide6.QtMultimediaWidgets import QVideoWidget from PySide6.QtCore import QUrl class VideoPlayer(QWidget): def init(self): super().init() self.setWindowTitle("Video Player - video.mp4") self.resize(800, 600) # レイアウト layout = QVBoxLayout() self.setLayout(layout) # 動画ウィジェット self.video_widget = QVideoWidget() layout.addWidget(self.video_widget) # メディアプレイヤー self.media_player = QMediaPlayer(self) self.audio_output = QAudioOutput(self) self.media_player.setAudioOutput(self.audio_output) self.media_player.setVideoOutput(self.video_widget) # 動画ファイルを読み込む self.media_player.setSource(QUrl.fromLocalFile("video.mp4")) self.media_player.play() if name == "main": app = QApplication(sys.argv) player = VideoPlayer() player.show() sys.exit(app.exec())

この著者はTim Petersの中傷を擁護してるね。: https://www.reddit.com/r/Python/comments/1f00qdo/no_vote_of_... 彼はGlyph Lefkowitzを引き合いに出して、自分を支持してるけど、今はPyConでランチとディナーのネットワーキング戦略についてアドバイスしてるんだ。これは真剣に受け止めるべきだね。Pythonエコシステムでは、正しいサークルにいることと話すことが全てだから。