ラベル MK808 の投稿を表示しています。 すべての投稿を表示
ラベル MK808 の投稿を表示しています。 すべての投稿を表示

2012/12/07

XBMC用.nfoファイルを用意する

XMBCがAndroid端末(MK808)で動きましたので、次の段階です。

再生時の操作については別途書きたいなと思ってますが、今回のテーマは録画ビデオファイルのリスト表示を、ファイル名だけとかサムネイルだけとかじゃなくてちゃんと番組名、内容説明を表示するようにしたいということへの取り組みです。

詳しくはないんですが、XBMCのImport-export library を読むと、nfoファイルというものを用意すれば、無機質なファイル名ではなくて、タイトル名やらなんやら、オンデマンドコンテンツのように表示させることが出来るとありますね。

ビデオファイル名.nfoファイルを作ってあげればよいと

初めは、XBMCの方でそのファイルをインポートするなんて操作をしなければならないのかな?面倒だな。なんて勘違いしてましたが、全然大丈夫でした。
ビデオファイルが入っている同じフォルダ内に拡張子を"nfo"にして置いておけば勝手に読んでライブラリ化してくれます。これなら自動化も楽ちんです。

nfoファイルの中身

XBMCがライブラリ化できるのは大きく分けて、映画(movie)、TV番組(tvshow)、TVエピソード(episodedetails)及び音楽ビデオ(musicvideo)のようです。

メジャーコンテンツ扱う場合なら、オンラインデータベースからの情報とリンクさせてより詳しいデータとかを取得出来たりするようですね。そういうのが一切関係ないローカルで汎用的なビデオ(video)とかあればいいなと思いましたがね。

どのライブラリタイプを使うか

どれが一番適しているか色々試してみました。

本来はtvshow(TV番組)としてライブラリ化するのが自然だろうなぁと思いましたが、tvshowは"tvshow.nfo"と名前が決まっていて、1ファイル1ディレクトリ管理じゃないとだめっぽい。
TV_Show_files_naming_conventions
この辺を読むと、さらにその下にepisodedetailsを置いて、ファイル名とか色々構成を整えないといい感じにならないらしい。

movieとmusicvideoは、ファイル単位のnfoを作るだけで読まれたので、どっちでもよさそうでしたが、musicvideoだと、並べ替えで「日付」を選ぶことが出来なくて、リストがいまいち使いにくい。どちらもpodcastのような公開日とかがないので、実ファイルの作成日が使えることが重要だったりします。

消去法で、内容はTV番組ですが、映画ライブラリとして構成するのが一番使い勝手が良いようです。結論を先に書きましたが、作成と読み込み手順は以下のような感じで進めました。

nfoファイル作成

録画サーバーから提供できる番組情報は、元々地デジEPG情報なので、番組名・内容・日時・長さ(分)・ジャンル・チャンネル位なので、それをどうにか対応させます。
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<movie>
 <id>番組ID</id>
 <title>番組名</title>
 <outline>内容</outline>
 <plot>内容</plot>
 <runtime>長さ</runtime>
 <genre>ジャンル</genre>
 <studio>チャンネル</studio>
 <director>録画日時</director>
 <set>番組名のサブセット</set>
</movie>
outline,plotどっちで内容が出てくれるのかよく分からないので両方に。
チャンネル項目がないので、studioに適当に入れました。
録画日時を表示させたいので、directorに適当に入れました。
studioとdirectorがとにかく目立つところに表示されるのでね。意味が全然違いますけど・・・
idってのがあったのでチケットID入れてみましたが、どこにも表示されませんな。

このnfoファイルを作成する録画システム上のスクリプトがこちら
xbmc-movie.rb

#!/usr/bin/ruby
# -*- coding: utf-8 -*-
#
require 'rubygems'
require 'active_record'
require 'rexml/document'
require 'digest/md5'

@media_path = '/opt/videos/'

ActiveRecord::Base.establish_connection(
        :adapter => 'mysql2',
        :host => 'localhost',
        :username => 'redmine',
        :password => 'redmine',
        :database => 'redmine'
)

class Issue < ActiveRecord::Base; end
class IssueCategories < ActiveRecord::Base; end
class Attachments < ActiveRecord::Base; end
class CustomValues < ActiveRecord::Base; end

def add_element_with_text (parent, element, text)
  e = parent.add_element element
  e.text = text
end

# create a nfo file
def create_nfo (issue)

  video = Attachments.first(:conditions => {
                              :container_id => issue.id,
                              :content_type => "video/mp4"})
  channel = CustomValues.first(:conditions => {
                                 :customized_id => issue.id,
                                 :custom_field_id => 2})
  time_tmp = format("%04d", CustomValues.first( :conditions => {
                                                  :customized_id => issue.id,
                                                  :custom_field_id => 1}).value.to_i)
  time = "#{time_tmp[0..1]}:#{time_tmp[2..3]}"

  # 試行錯誤の末こんな感じに
  set = issue.subject.sub(/[  ”’#(「・◇].*/,'')

  xml = REXML::Document.new
  info = xml.add_element 'movie'
  add_element_with_text info, 'id', issue.id
  add_element_with_text info, 'title', issue.subject
  add_element_with_text info, 'year', issue.start_date
  add_element_with_text info, 'runtime', issue.estimated_hours
  add_element_with_text info, 'outline', issue.description
  add_element_with_text info, 'plot', issue.description
  add_element_with_text info, 'genre', IssueCategories.find(issue.category_id).name
  add_element_with_text info, 'director', "#{issue.start_date} / #{time}"
  add_element_with_text info, 'studio', channel.value
  add_element_with_text info, 'set', set

  nfo_file = video.filename.to_s.sub(/.mp4/,".nfo")
  puts "#{nfo_file}:#{set}"

  nfo = File.open(@media_path + nfo_file,"w")
  nfo.puts '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>'
  xml.write nfo
  nfo.puts "\n"
  nfo.close

  # 本件に関係ないので省略
  #attach "nfoファイル", issue.id, nfo_file, "xbmc/nfo"
end

# 公開ステータスの録画チケット
Issue.find( :all, :conditions => {:tracker_id => 3,:status_id => 4}).each {|issue|
  create_nfo issue
#  break
}

今までのビデオファイル全てにnfoファイルを作成するものになってますが、録画システムとしては番組録画後にそれ用のnfoファイルを作成するフローにしています。以前podcastがらみでやったこととほとんど同じ要領なので、ちゃちゃと出来ました。

XBMC側で読んでもらうには

ビデオソースを追加して、HTTPとかSMBとかで、ビデオフォルダを見れるようにします。
この辺の手順は他のHOWTO記事を参考にされた方が親切でいいです。

コンテンツの種類として”(映画)”を選んで設定ボタンを押して、有効になっているやつを全部外します。外さなくてもいいけれど勝手にDBへアクセスしに行ったりするようなので。
設定を全部OKしてダイアログを全部閉じるとライブラリ化はその瞬間から自動で開始されます。

終了するまで数分時間がかかりました。その最中でも大丈夫そうでしたが、落ち着いたかなぁという頃合いにXBMCのホームに戻るとビデオの下にはにはライブラリ、横に「映画」という項目が増えています。この辺をたどっていくとnfoファイルで設定した内容でビデオファイルが表示されました。

新しい順にリストさせるには、表示オプションで、並べ替えを「日付」にソートを「降順」にすれば新しい順に出ます。後は表示の種類を自分の好みにしてみる。うーん。いい感じです。

setがいい

setタグのところで、番組名のサブセットと書きましたが、XBMC上で同じセット名は仮想的なサブディレクトリとして扱われます。
毎週録画している番組とか、本来はエピソード番号とかで管理されるといいと思いますが、地デジ情報からは得られないので、番組名の共通項をセット名として定義することでシリーズ番組とかを同じセットグループとして分類が出来て便利です。

日本語での検索

表示オプションから検索が出来ますが、残念ながら日本語入力が出来ません。これはがっかりですが、xbmcユーザからすると周知の事実らしいですね。バージョンが上がると解決するんでしょうか。パッチとかあるんでしょうか?

別のAndroid/iOS/その他デバイスでXBMCリモートアプリを使って検索すれば日本語検索できるんで、さほど問題ではないですけど、出来れば普通に本体だけで済ませたいですね。

何だか思っていた以上の環境が整いそうな予感です。
もっといい感じにできるのか調べてみましょう。

2012/11/23

MediaサーバーとMK808と外部キーボード(R600)


え~すでに価値のある情報ではありませんが、次のステップへの過程という意味で少し。

今MK808でビデオを視聴する環境整備に取り組んでおりますが、まずはUPnP/DLNAとかを考えるのが普通かなと思うので、一般に利用されているメジャーどころをやってみました。

自作地デジ録画サーバー上のビデオファイルをhtml5-videoとしてAndroidブラウザで視聴することはできますが、前記事のように思った結果にはなりませんでした。
今度はメディアサーバー(UPnP/DLNA)を稼働させて、Android(mk808)でメディアクライアントアプリで視聴する手段でやってみます。(結果は見えていたんですが・・・それは後で)

録画サーバー(Ubuntu)で稼働させるメディアサーバー
メジャーどころは、こんなところでしょうか。この中でUbuntuServerに入れられそうなのは、
MediaTomb、TVMOBiLi、uShare ですかね。これ以外は、デスクトップ(GNOME)環境が必要だったりでだめです。XBMCが動けば一番いいなぁと思ってますが、クライアント機能もあり、ディスプレイが必要なので断念。

やはり、お手軽なのは、MediaTomb ですかね。
セットアップについてはこちらで十分なので割愛します。
ビデオファイル保存フォルダをMediaTombにコンテンツ登録してサーバー側終了。

MK808用外部キーボード「Rii mini R600」購入

前記事で購入したキーボード(iPazzPort Mini)は個体差かもしれませんが、無線の有効距離がかなり短かったため、似たような別製品を購入しました。妻には「なぜ同じものを・・?」と呆れぎみ。
しかしその甲斐あってか、かなり離れても安定したマウス操作とキー入力が出来ました。

これもAirMouseなので傾けてマウス操作しますが、片手持ち(縦)のみです。iPazzPortは両手持ち(横)と切り替えが出来るので機能的には劣りますが、その代りクリックボタンだけが大きくなっていてマウス操作だけ評価すれば使いやすいと言えます。
キー入力はチャタリングもほとんどなく無線も安定しているので安心して打てました。キーの大きさも微妙ですが大きめなのでタイプミスも減るかと思われます。

リビングでソファーにねっころがって操作したいという要望にはこのコントローラで良さそうです。

視聴アプリ(UPnP/DLNAクライアント)

TVに繋いだMK808上で動かす視聴アプリを探すと沢山ありますね。
試したのは、BubbleUPnP、UPnPlay、および勝手に入っていたeHomeMediaCenterです。
どれでも普通にMediaTombからの再生は出来ました。しかし、出来ましたってレベルです。
結局だたのファイルリストから選んで再生ってだけなので、どれがどの番組なのかさっぱりです。

しかも、キーボード操作ではほとんど何もできない。AirMouseでの操作は結構つらいです。

Redmineで構築した視聴システムへブラウザからアクセスしてタイトルや内容、日時とかが分かって、番組検索が出来て、クリックしたら再生っていう流れとは大違いです。分かってはいますがね。

Androidがリブートする

これは大問題なんですが、ファームアップデートしたためなのか原因は不明ですがビデオ再生してからホームボタンクリックとかでアプリを終わらせるとAndroidがリブートしてしまうんです。
どの視聴アプリを使っても同じ現象でした。

視聴環境として選択肢がこれしかないなら、またOS周りの調査から取り組まないとならないでしょうけど、別手段を考えているので、今回の取り組みはこういう結果になったというところまでで手じまいです。

以下、個人的将来展望

やはり、ちゃんと日本語で番組名・内容・録画時間とかがちゃんとサムネイルとともにリスト表示されるようになって、再生はマウス操作なしでキーボード操作だけでコントロールできる環境が欲しいです。

タッチ操作で使いやすくという方向のアプリが主流な中でキーボードで使いやすくという方向のものは要望としては逆行しているんでしょう。でもいずれ来るであろうスマートTV時代でもタッチコントローラより従来通りのキーコントローラの方が受け入れられると思うんですよね。

それが既存ソフトの組み合わせで出来るならそれが一番です。まずはそういった模索をして、なさそうなら視聴アプリ作りますかね。

2012/11/17

MK808でadbが出来るまでの長い道のり

前回記事で書いた通り、MK808で色々遊んでみようと思い、いつも通りデスクトップにUSB接続して、自作アプリをインストールテストしようと思っていたんです。ところがどっこい、長い道のりでした。

まず、adbとは、Android Debug Bridgeという開発用便利ツールでして、Androidに色々アプリを入れなくてもPCからリモートで色んな操作が出来ます。adbはUSBまたはネットワーク越しでリモート操作が出来ます。
このUSBで接続ってところの話です。Android端末は数種類扱ってますが、今回は苦労しました。

ドライバセットアップ

Macだとこんなことしないでいいんですが、Windowsだと普通にUSB接続してもドライバがないと言われるんで、ハイハイってことで色々やります。まずは、Android SDKをダウンロードします。その中に、google-usb_driverというフォルダがあります。これを入れてやれば通常動きます。

が、このドライバのinfファイルにはNexus用の記述しか書かれていません。なので自分のMK808でインスール出来るように、android_winusb.infというドライバ記述ファイルに、以下のように書き加えます。
[Google.NTamd64]
;MK808
%SingleAdbInterface%     = USB_Install, USB\VID_2207&PID_0006&REV_0222
%CompositeAdbInterface%  = USB_Install, USB\VID_2207&PID_0006
USB_Install, 以降のコードは、デバイスマネージャで不明なデバイスとして認識されているデバイスのプロパティの詳細タブからプロパティ=デバイスIDを選ぶと表示される文字列です。
自分のWindowsは64Bitなのでamd64側にだけ書き加えました。

で、ドライバの更新でこのドライバフォルダを指定してやればインストールされます。
コンソールから
$ adb kill-server
$ adb usb
$ adb devices
ってやれば大体どんなAndroidでも接続できるもんです。もんです。あれ?
端末の方では、「USBデバッグが接続されました」と「USB接続」がちゃんと出ている。USBストレージをONにしてみる。ふむ。ちゃんとデスクトップでストレージマウント出来る。

adbだけが出来ない

マックでやってみた。同じ状態・・・
セルフパワーUSBハブかましてみた。駄目だった・・・
OTG側と電源用USBのさす順番変えたり、どっちかだけにしたり。変わらず・・・
ネット上探しても同じ状況の書き込みは見当たらない。微妙な不良品をゲットしてしまったか。

apk入れるだけなら別手段は色々ある。がっつり開発用ではないし。

microSD経由で入れる。
AirDroidとかサーバークライアント系のアプリ使って入れる。
Webサーバー上に置いておいてダウンロードして入れる。

とまあどんな方法でも入れることは出来るんで割り切ってもよかったんですが、心残りが出来るのも事実。次の手を考えます。

adb tcpip でいいか

冷静に考えれば、この端末はリビングTVに繋いで使うつもりなので、そもそもUSBでPCに接続するシチュエーションはめったにない。Wifi通して操作する方が合っています。

普通、Wifi経由のadbは以下の手順でできます。
  1. 一度USB接続して認識させる
  2. $ adb tcpip 5555 ってやってadbをusbからtcpipに切り替える。ポートも指定する。
  3. USBを抜く
  4. $ adb connect {device-ip-addr} ってやる。接続される。
Android側にadb-wifi切り替えアプリとか入れずとも、こんな感じでできますね。接続が切れてたら4だけやれば再接続されます。駄目だったら1からやり直します。

よく、adb connect {ip-addr}:5555ってやれって書いてあるけど、本当ですかね。
:5555:5555ってなって、失敗しますよね。:5555はいらないんじゃないかな。

普通はこれでいけるんですが、今回は最初のUSB接続で認識が出来ません。そのために、やはりAndroid側にWifiでADB出来るようにするアプリ使う必要があります。その手のものは沢山ありますね。でも大体どれもがルート権限が必要なのです!

自分のMK808はルート化されていなかったので

この辺でもう何だかなぁという気分ですが、始めてしまったので最後までやります。
ルート化されているFirmイメージを探しました。見つけました。
http://tabletrepublic.com/forum/downloads.php?do=file&id=164
他にもいくつか見つけましたが、どれもダウンロードするためにアカウント登録が必要だったり有料ダウンロードだったり・・・この手のものはそういう世界なので安全手軽なものを見つけるのは一苦労です。このファイルも突然別のところに移動するかもしれません。

ここからダウンロードしたrarパッケージはとてもいいですね。RKBatchToolと必要なドライバとフラッシュイメージがセットで入っていました。

沢山のネット記事で説明されている通り、リセットボタン押しながらUSB接続! 無反応・・・
はぁ。これもだめですか。普通はデバイスが認識されてドライバを入れる手順に進むのに。

microSDでアップデート

仕方がないので別手段です。USBストレージマウントはできるので、rarパッケージに入っているフラッシュイメージファイルを”update.img"という名前でmicroSDのルートにコピーします。(このパッケージのイメージファイルは最初からupdate.imgになってました)
Android側のストレージマウントをOffにします。するとその瞬間に、ファームイメージ見つけたけどインストールする?ってAndroidが聞いてきくるので、インストールします。

この方法は外部ツールいらずでお手軽&安全です。アプリや設定は保存されたままシステムだけアップデートされます。逆に言えばクリーンインストールは出来ません。

再度リセット押しながらUSB接続してみたら、今度はちゃんとPCが認識したので、改めてRKBachTool使ってクリーンインストールしました。単に気持ちの問題です。

これでルート化されたので、やっとルート権限が必要なアプリが実行できます。
だいぶ遠回りした気分ですが、これでtcpip経由でのadbが無事機能するようになりました。

eHomeMediaCenter・・・(余談です)

ファームアップデートしたらこんなアプリが入っていました。試しに動かしたらWindowsのメディアセンターやらマックにためしに入れていたTVMOBiLiとかがスパッと表示されてびっくり。
ビデオプレーヤーアプリ作る前に、ちょっとこっち方面をやってみようかな。

2012/11/10

MINITV/android(MK808) でビデオ視聴

以前の記事で購入したMK808がやっと到着した。AliExpressで購入。安く購入できたのがいいが、台湾を出るまでがめちゃめちゃ日数が掛かるのが難点だ。
MINITV/android Dual Core A9 Processorと表記されている。黒つや消しパッケージ。
なかなか、かっこいい。といっても、隙間に入れちゃうんで見えないんだけど。

本体をリビングのTVに繋いで、一緒に注文したキーボード「iPazz Port」を接続!

これでやっとソファーに寝そべって録画番組が見れると思いきや・・・

iPazz Portのワイヤレス電波範囲が思いのほか狭くて、若干前のめりに座って操作しないとマウス操作がまともに出来ない。更に、キーボード入力をその状態で打つと同じキーが何回もリピートして入ってしまう。1m以内くらいに近づけばだいぶ改善されるが、それじゃあねぇ。個体差かな。

MK802で使ってみたときはシチュエーションを考慮していなかったので気づかなかった。

キーボードを、K700の方を使えば上の問題は解決と言えば解決だけど、リビングではビデオリモコンのように片手操作したいのだ。

とにかくビデオ視聴(HTML5 videoをAndroidのブラウザで)

気を取り直して、とにかく我が家の地デジ録画サーバーをブラウザでアクセス。録画番組を観てみる。やはり以前のMK802より若干レスポンスがいい気がする。メモリ倍だしCPUもA9だしね。でも思ってたほどじゃないかな。GPUパワーが低いんだろうか。
画質は問題なしだが、PCやMacで観てるときは感じないカクつきがたまにある。ビデオのビットレートをもう少し落とした方がいいかもしれないと感じた。

MediaElements.jsも問題なくAndroidで動作しているようだが、問題はキー操作

これは残念な結果となった。The State Of HTML5 VideoのAccessibilityによると、キーボード操作はiOS/AndroidともN/Aとなっている。これは不可能という意味だけど、外部キーボードを接続すれば大丈夫じゃないの?って思ってたが・・

  • フルスクリーン状態ではどのキーも反応しなかった。
  • 一度ビデオ部分をマウスクリックしてスペースキーを2回押すとポーズがかかった。
  • 音声ボリューム操作の上下キーもたまに反応した。
  • 一番やりたかった左右カーソルキーでの送りと戻しが全然反応しなかった。

キーコードが違うんじゃない?と思って、アンドロイドのキーコード表のコードをMediaElements.jsのキー操作に加えてみたけれど、無反応だった。

ビデオ視聴中に、アルファベットキーを打つと、IMEウインドウが出て来た。
むむ。ようするにビデオ再生部分にキーボード入力イベントがフォーカスしていない感じだ。だから一度マウスクリックした後のキー操作がたまに動くんだろう。

自分なりの結論

HTML5+Video+Android+Keyboard は無理っぽい。
じゃあアプリ使うか。MX Playerで視聴してみる。いい感じ。キー操作も出来る。
だけどいちいちURL打つのは現実的じゃない。ブラウザから起動するか?
プレーヤーアプリがブラウザ起動を許す仕様になっているか?スキーマは?

ブラウザ起動アプリにする方法はたくさん情報があるけど、GooglePlayからのアプリがそうなっているっていう情報はどこにもないんで手出しできない。

・・・
自分で作るかな
Flashのswfだとブラウザに依存してしまうんで、独立したアプリにする必要があるだろう。
幸いなことに今はAndroidのビデオプレーヤーアプリを作るのはそう難しくない。
Adobe AIRを使えばいいだろう。

・・・
XBMCサーバーとか?
XMBCサーバーいれて、AndroidにはXMBC Remoteで観るとかかな。
UPnPとかDLNAとかにして、Android側でアクセスできるようにするか。

やった事無いけど多分出来そうだ。でも、番組名とかがちゃんと出ないよねきっと。

次回から、この辺の話に移っていく感じでしょうかね。