2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ムービーをランダムに一定時間ずつChromeCastで再生する

Last updated at Posted at 2020-12-28

ChromeCastはほっとけばランダムにGoogle Photosに溜めた写真を流してくれるので、家族で思い出話ができて嬉しい。ただ、写真だけしか流してくれないので、何とかムービーのほうを流すようにならないかなと思っていたけど、一向に機能追加されないorz。仮にスマホのアプリでムービーをキャストするのがあっても、Youtubeのプレイリストからランダムに全部再生する機能だけで、これらのアプリでは長時間のムービー(お遊戯会のムービーとか)が流れ始めたら最後、全部流すまで終わらないので、これじゃない感がある。pychromecastを使えば簡単にmp4を再生できそうだったので、サクッと作ってみた。

事前準備

  • Linux環境 (自分はWSLを使ってる)
  • HTTPサーバ(自分はapacheを使ってる)
  • python3

動画の準備

WSLで見える適当なフォルダにムービーを入れておく。1,000個くらい入れたかな。これらのムービーはChromeCastで直接再生できるフォーマットである必要がある。対応していないムービーはffmpegで変換しておいて、タイムスタンプを揃える。
(下記は拡張子.MOVのムービーを.m4vの拡張子を使って変換して保存している。)

for i in *.MOV; do ffmpeg -y -i $i -s 1920x1080 -vcodec libx264 -r 30 -b 1024k -acodec aac -ac 2 -ar 44100 -ab 128k -f mp4 `basename $i .MOV`.m4v; done

for i in *.MOV; do day=`date '+%Y%m%d%H%M' -r $i`; touch -t $day `basename $i .MOV`.m4v; done

それらのムービーファイルをhttpサーバで表示できるように設定する。apacheなら、/var/www/html以下にシンボリックリンクを作っておけばOK。

ムービーをランダムに選んで、20秒間ランダムな時間から再生を開始するプログラム

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from hachoir.metadata import extractMetadata
from hachoir.parser import createParser
import time
import pychromecast
import random
import os
import datetime
from datetime import datetime as dt

playtime=20
waittime=3 #ChromeCastの動画切り替えにかかる時間分だけこのプログラムが待ってあげる時間
moviefolder="/mnt/e/movie/" #サーバ内でムービーを保存している場所
httpurl="http://192.168.1.10/movie/" #ChromeCastから見えるサーバ上のムービーの場所

# List chromecasts on the network, but don't connect
services, browser = pychromecast.discovery.discover_chromecasts()
# Shut down discovery
pychromecast.discovery.stop_discovery(browser)

# Discover and connect to chromecasts named Living Room
chromecasts, browser = pychromecast.get_listed_chromecasts(friendly_names=["Living"])
[cc.device.friendly_name for cc in chromecasts]

cast = chromecasts[0]
# Start worker thread and wait for cast device to be ready
cast.wait()
print(cast.device)
print(cast.status)

mc = cast.media_controller

stopflag=0
while stopflag == 0:
  tempfile=random.choice(os.listdir(moviefolder))
  print(tempfile)
  filepath = moviefolder+tempfile
  dt = datetime.datetime.fromtimestamp(os.stat(filepath).st_mtime)
  key = dt.strftime('%Y/%m/%d  %H:%M:%S')
  print(key)
  parser = createParser(filepath)
  meta = extractMetadata(parser)
  duration = meta.get("duration")
  print(duration.seconds)
  starttime=int(random.uniform(0,duration.seconds-playtime))
  if starttime < 0:
    starttime = 0
  mc.play_media(httpurl+tempfile, 'video/mp4', current_time=starttime)
  if duration.seconds < playtime:
    time.sleep(duration.seconds+waittime)
  else:
    time.sleep(playtime+waittime)

あとは、ターミナルを開いて、このプログラムを動かせば自動で20秒間ランダムに選んだムービーを再生してくれる。子供たちが懐かしそうに見入ってた。たまに結婚式のムービーとか出てきてこういうアプリがないとなかなか見ないよなぁと思う。
pychromecastのお作法は結構変わるみたいなので、本家HPを見たほうがよさそう。
実際には、PHPからキックして起動するようにして、ページを20秒で自動リロードするようにしておいて、スマホでブラウザを開いている間だけ再生するようにして使っている。

参考にしたサイト

2
2
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
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?