소니 AVCHD 파일 변환기 없이 맥북에서 읽어오기

이미지
 아주예전에 구입했던 소니 HDR-CX12 모델. 생각보다 쓰지 않고 처박혀 있던 녀석을 꺼낸 이유는 꼬맹이가 비디오 촬영에 흥미를 가졌기 때문이다. 다른 컴팩트 카메라를 한대 손에 쥐어 주었는데, 얼마전 찍은 동영상 아빠한테 보여준다고 뛰어오다 떨어트려서 아작이 나버렸다. ㅠㅠ 생각난 김에 처박혀 있던 카메라를 줄려고 꺼내어 보았는데, 특별히 문제 없이 동작중이다. 2008년 모델인데 아무 문제 없이 움직이고 있다. 사스가 소니! 다만 문제는 테스트 용으로 촬영한 동영상을 보려고 메모리 카드에서 파일을 읽어보니 달랑 AVCHD 란 파일 하나만 존재하고 있다. 혹시나 싶어 인터넷에서 매뉴얼을 찾아 읽어보아도, 전용 드라이버를 설치하라고 하는데, 이게 또 귀차니즘이 마구 몰려온다. 같은 avchd 이니 확장자를 m2ts 로 바꾸면 어떨가 싶어 확장자를 바꾸어 보았는데 뜬금 없이 디렉토리로 표시된다.    디렉토리로 되었으니 열어보아야지 하는 마음으로 열어보니 이번엔 BDMV 라는 확장자도 없는 파일이 또 표시되길래 혹시나 싶어 이 파일도 확장자를 m2ts 로 바꾸어 주었다. 확장자를 바꾸어 주니 이 파일도 디렉토리로 표시되었다.   와우, 그랬더니 여러가지 파일과 디렉토리가 표시된다. 이게 바로 처음 메모리 카드를 넣었을때의 비디오 인덱스인 듯 하다. 파일이름에도 인덱스가 들어 있고,디렉토리도 딱 보니 클립, 플레이 리스트, 스트리밍 동영상 등등 어디서 많이 들어본 단어 들이다. 동영상 파일은 예상대로 STREAM 디렉토리 안에 존재하고 있었고 확장자는 MTS 로 맥용 동영상 플레이어인 IINA에서 바로 플레이 할 수 있는 걸 확인했다. IINA에서 다른 동영상 포맷으로 변환은 안되지만 다른 어플을 이용하면 간단하게 처리 할 수 있을 듯 하다. m2ts 가 이런 형식으로 되어 있는 것도 오늘 처음 알았다. 나중을 위하여 메모 겸 남겨 놓는다.  

phpでAWSのstatusページから異常を検知してchatworkへ通知する

 Amazonは「http://status.aws.amazon.com」からAWSのサービス状況を確認できるページを提供している。ブラウザでアクセスすると各リージョンのサービス簡単に確認できる。そして、RSSにも対応しているのでRSSフィーダーを使ってサービスに異常が発生した場合、通知してくれる。

 

今回はphpを使ってRSSフィーダーを定期的にチェックし、新しいアイテムがフィーダーされたらそれを確認する仕組みを作ってみた。たまにしか起きないけど1回起きたら大きい影響を与えるので定期的に確認した方が絶対いい。

 

確認対象サービスはリージョンと関係ないグローバルサービスとリージョンに装束されるサービので2つに分けた。別に1つにしてもいいけど、RSSフィーダーのURLが微妙に違うので分けただけ。

 

$awspub = array (
  "cloudfront", "route53", "route53domainregistration", \
  "import-export", "management-console", "marketplace", \
  "awswaf"
);
 
$awsreg = array (
  "apigateway", "cloudwatch", "dynamodb", "ecr", "ecs", "ec2", \
  "elb", "emr", "elasticache", "glacier","kinesis", "rds", \
  "route53", "sns", "sqs", "s3", "vpc", "autoscaling", \
  "certificatemanager","cloudformation", "cloudtrail", "codedeploy", \
  "directconnect", "elasticbeanstalk", "iam","internetconnectivity", \
  "kms", "lambda", "opsworks", "state", "storagegateway"
);

その後は時間を変換してくれる関数を作った。status.aws.amazon.comのページはPSTかPDTで表示されている。通知してくれるならやさしくちゃんとJSTへ変換しよう。変換した日付をそのまま出力することもありだけどこの後時間の演算が必要いになったので結局 timestampへ変換してその値を返すことにした。


function dateToJST($date) {
 
  $newdate=DateTime::createFromFormat("D, d M Y H:i:s T", $date);
  $timezone=date_format($newdate, "T");
  if      ($timezone == "PST") { $adjuster="+17 hour"; }
  else if ($timezone == "PDT") { $adjuster="+16 hour"; }
 
  return strtotime($adjuster, strtotime(date_format($newdate, "Y-m-d H:i:s")));
}

 

後は関数かした取得コードを実行するだけ。引数としてグローバル(glb)か、リージョン(reg)なのかを教えてあげる必要がある。ここでは通知先をchatworkの板にしてある。chatworkのAPIを利用して指定の板へメッセージを書き出すことにした。以下にフールコードを残す。


#!/usr/bin/php
<?php
$workdir="/tmp/awsstatus";
$flgfile="$workdir/chk_aws_status.flg";
$interval=60*15; #15m with crontab
$now=time();
$TOKN="xxxxxxxxxxxxxxxxx"; ⇒ chatworkのapi token key
$CWEP="https://api.chatwork.com/v2/rooms";
$RMID="xxxxxxxx"; # chatworkの通知先板番号
 
if (file_get_contents($flgfile) == 1) {
  echo "stop script excute by flag file '$flgfile'\n\n";
  exit;
}
 
$awspub = array (
  "cloudfront", "route53", "route53domainregistration", \
  "import-export", "management-console", "marketplace", \
  "awswaf"
);
 
$awsreg = array (
  "apigateway", "cloudwatch", "dynamodb", "ecr", "ecs", "ec2", \
  "elb", "emr", "elasticache", "glacier","kinesis", "rds", \
  "route53", "sns", "sqs", "s3", "vpc", "autoscaling", \
  "certificatemanager","cloudformation", "cloudtrail", "codedeploy", \
  "directconnect", "elasticbeanstalk", "iam","internetconnectivity", \
  "kms", "lambda", "opsworks", "state", "storagegateway"
);
 
chk_status($awsreg, "reg");
chk_status($awspub, "glb");
 
function chk_status($arrsrv, $div) {
  global $interval;
  global $now;
  global $TOKN;
  global $CWEP;
  global $RMID;
 
  $cntarr=count($arrsrv);
  for ($i=0; $i<$cntarr; $i++) {
    $key=$arrsrv[$i];
    $rssurl="http://status.aws.amazon.com/rss/${key}";
    if ($div=="reg") { $rssurl.="-ap-northeast-1"; }
    $rssurl.=".rss";
    $xml=simplexml_load_string(file_get_contents($rssurl));
    $servicename=$xml->channel->title[0];
    $lastupdated=dateToJST($xml->channel->updated);
 
    echo "Service Name: $servicename\n";
    echo "Last Updated: ".date("Y/m/d H:i:s", $lastupdated)." JST\n";
 
    $cntticket=count($xml->channel->item);
    echo "Count of Feeder's Ticket: $cntticket\n";
    if ($cntticket > 0) {
      for ($j=0; $j<$cntticket; $j++) {
        $ticket['title']=$xml->channel->item[$j]->title;
        $ticket['date']=dateToJST($xml->channel->item[$j]->pubDate);
        $ticket['desc']=$xml->channel->item[$j]->description;
        echo "Ticket Number: $j\n";
        echo "Ticket Title: $ticket[title]\n";
        echo "Ticket Date: ".date("Y/m/d H:i:s", $ticket['date'])." JST\n";
 
        if (($now - $ticket['date']) < $interval) {
          $message ="[info][title]AWSのサービス状況に変更が発生しました。[/title]";
          $message.="◆[".date("Y/m/d H:i:s", $ticket['date'])."] $servicename\n";
          $message.="◆Title : $ticket[title]\n";
          $message.="◆Description\n$ticket[desc]\n";
          $message.="http://status.aws.amazon.com\n";
          $message.="[/info]";
          exec ("/usr/bin/curl -X POST -H \"X-ChatWorkToken: $TOKN\" -d \"body=$message\" \"$CWEP/$RMID/messages\"");
          echo "$message\n";;
          $message="";
        }
      }
    }
  }
}
 
function dateToJST($date) {
  $newdate=DateTime::createFromFormat("D, d M Y H:i:s T", $date);
  $timezone=date_format($newdate, "T");
  if      ($timezone == "PST") { $adjuster="+17 hour"; }
  else if ($timezone == "PDT") { $adjuster="+16 hour"; }
 
  return strtotime($adjuster, strtotime(date_format($newdate, "Y-m-d H:i:s")));
}
?>
  • 途中にはコマンドラインで実行した際のdebug用としてechoで情報を出力するコードも入っている。
  • Intervalは適当に。しかし、cronによる実行間隔とあわせておかないとチェックには漏れが発生するので注意。

댓글

이 블로그의 인기 게시물

소니 AVCHD 파일 변환기 없이 맥북에서 읽어오기

해외거주 국민을 위한 "교민폰" 사용후기

CISCO 2960s 초기화 후 기본 설정