ffmpeg -r 30 -i images2/image_%3d.jpeg test.avi
2014年5月30日金曜日
2014年5月29日木曜日
動画フェードアウトと連結、個人用メモ
実行する際には、1回でやることが出来る。エンコード回数を減らすほうが良い。
それぞれの機能用コマンドを見る意味で分けた。
フェイドアウト
連結
それぞれの機能用コマンドを見る意味で分けた。
フェイドアウト
ffmpeg.exe -i [src_file_path] -vf "fade=out:810:90:" -af "afade=t=out:ss=27:d=27" -vcodec libx264 -acodec libvo_aacenc -y [dst_file_path]
連結
ffmpeg -i [src_file_path] -i [src_file_path2] -filter_complex concat=n=2:v=1:a=0 [dst_file_path]
2014年5月27日火曜日
Google App Engine SDKをEclipseで動かす
GAEのSDKをEclipseで起動する場合のメモ。
まずは以下のPyDevプラグインを追加します。
以下はRun設定です。
引数は以下の用に指定します。
実行に成功した場合のコンソール出力です。
ここまでできたら、local:8080 に接続しましょう。
まずは以下のPyDevプラグインを追加します。
以下はRun設定です。
引数は以下の用に指定します。
実行に成功した場合のコンソール出力です。
ここまでできたら、local:8080 に接続しましょう。
2014年5月24日土曜日
はじめてのPython GoogleAppEngineのチュートリアル 1
はじめてのPython フレームワーク
webapp2 は google app engine のフレームワークです。
他にも Django や CherryPy、Pylonsなどが使えますが、webapp2 は Google App Engineの
環境を作成するときにインストールされるので、すぐ使えます。
webapp2
* RequestHandlerクラス:リクエスを処理してレスポンスを生成
* WEGIアプリケーションインスタンス:受信リクエストをURLに基づきハンドラに割り振る
# もっとも単純な例
以下がもっとも単純な例です。
RequestHandlerを継承したクラスのgetメソッドを作成すると、self.requestを通してリクエスト情報を取得出来ます。
通常は、self.response にプロパティを設定して終了します。
webapp2.WSGIApplication インスタンスがアプリケーションです。
debug=trueで、ハンドラにエラーが発生したり、キャッチされない例外が発生した場合にブラウザに出力します。
# ユーザ認証
以下の例は、ユーザのログイン認証機能を追加したものです。
users.get_current_user() で サインイン済みなら Userオブジェクトが、違う場合は None を得られます。
# フォーム
以下がフォームを使った例です。
また、webapp2のimportをyamlファイルに移動しています。
この例にはハンドラが2つ出てきます。
MainPageとGuestbookです。それぞれURL、/ と /sign に対応しています。
Guestbookではpostのみが定義されています。
cgi.escape()は、HTMLの特殊文字をエスケープします。ユーザに入力された文字が、HTMLとして動作するのを防いでいます。
cgiはPythonの標準ライブラリです。
○cgiドキュメント
https://docs.python.org/release/2.7.2/library/cgi.html
今日はここまで、次はDatastoreにデータを永続化してみます。
webapp2 は google app engine のフレームワークです。
他にも Django や CherryPy、Pylonsなどが使えますが、webapp2 は Google App Engineの
環境を作成するときにインストールされるので、すぐ使えます。
webapp2
* RequestHandlerクラス:リクエスを処理してレスポンスを生成
* WEGIアプリケーションインスタンス:受信リクエストをURLに基づきハンドラに割り振る
# もっとも単純な例
以下がもっとも単純な例です。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import webapp2 | |
class MainPage(webapp2.RequestHandler): | |
def get(self): | |
self.response.headers['Content-Type'] = 'text/plain' | |
self.response.write('Hello, masahiro\'s World!') | |
application = webapp2.WSGIApplication([ | |
('/', MainPage), | |
], debug=True) |
通常は、self.response にプロパティを設定して終了します。
webapp2.WSGIApplication インスタンスがアプリケーションです。
debug=trueで、ハンドラにエラーが発生したり、キャッチされない例外が発生した場合にブラウザに出力します。
# ユーザ認証
以下の例は、ユーザのログイン認証機能を追加したものです。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#codint: UTF-8 | |
from google.appengine.api import users | |
import webapp2 | |
class MainPage(webapp2.RequestHandler): | |
def get(self): | |
user = users.get_current_user() | |
if user: | |
self.response.headers['Content-Type'] = 'text/plain' | |
self.response.write('Hello,' + user.nickname()) | |
else: | |
self.redirect(users.create_login_url(self.request.uri)) | |
application = webapp2.WSGIApplication([ | |
('/', MainPage), | |
], debug=True) |
# フォーム
以下がフォームを使った例です。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#coding: UTF-8 | |
''' | |
Created on 2014/05/24 | |
@author: masahiro | |
''' | |
import cgi | |
from google.appengine.api import users | |
import webapp2 | |
MAIN_PAGE_HTML = """\ | |
<html> | |
<body> | |
<form action="/sign" method="post"> | |
<div><textarea name="content" rows="3" cols="60"></textarea></div> | |
<div><input type="submit" value="何か書いてください。"></div> | |
</form> | |
</body> | |
</html> | |
""" | |
class MainPage(webapp2.RequestHandler): | |
def get(self): | |
self.response.write(MAIN_PAGE_HTML) | |
class Guestbook(webapp2.RequestHandler): | |
def post(self): | |
self.response.write('<html><body>あたなの文章:<pre>') | |
self.response.write(cgi.escape(self.request.get('content'))) | |
self.response.write('</pre></body></html>') | |
application = webapp2.WSGIApplication([ | |
('/', MainPage), | |
('/sign', Guestbook), | |
], debug=True) |
また、webapp2のimportをyamlファイルに移動しています。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
application: guestbook-app | |
version: 1 | |
runtime: python27 | |
api_version: 1 | |
threadsafe: yes | |
libraries: | |
- name: webapp2 | |
version: latest | |
handlers: | |
- url: /.* | |
script: guestbook.application |
この例にはハンドラが2つ出てきます。
MainPageとGuestbookです。それぞれURL、/ と /sign に対応しています。
Guestbookではpostのみが定義されています。
cgi.escape()は、HTMLの特殊文字をエスケープします。ユーザに入力された文字が、HTMLとして動作するのを防いでいます。
cgiはPythonの標準ライブラリです。
○cgiドキュメント
https://docs.python.org/release/2.7.2/library/cgi.html
今日はここまで、次はDatastoreにデータを永続化してみます。
はじめてのPython 書式編
Pythonの書式についてひと通り見たまとめ。
最初のうちの備忘録。
最初のうちの備忘録。
標準出力・演算・ループ
新鮮です。主に扱ってきた言語が C++、C#、Java だからでしょうか。
でも拒否感は無いですし、行が少なくなるのはいいですね。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# coding: UTF-8 | |
# HelloWorld | |
print "Hello World" | |
# 変数データについて | |
# 大文字、小文字は区別される | |
#ex) | |
msg = "Hello World2" | |
print msg | |
# 数値 整数、小数、複素数 | |
# 真偽値 True False | |
# None | |
# 関数・オブジェクト | |
# 要素が並んだもの | |
# 文字列:文字 | |
# リスト:データ(配列) | |
# タプル:データ変更不可 | |
# セット:データ重複不可 | |
# 辞書:key と value のペア | |
# 演算子 + - * / // 商 % 余り ** べき乗 | |
print 10 * 5 | |
print 10 // 3 | |
print 10 % 3 | |
print 2 ** 3 | |
print 5 + 1.3 | |
print 5 + 2.0 | |
print 5 / 3 | |
print 5 / 3.0 | |
# 文字列 | |
# 日本語 u"こんにちは" | |
print "こんにちは" | |
print u"こんにちは" | |
print "hello" + "world3" | |
print u"無駄!" * 10 | |
print "hello\nwor\tld3" | |
print """ | |
<html> | |
<body> | |
</body> | |
</html> | |
""" | |
# 文字数 len 、検索 find 、切り出し [] | |
s = "abcdefghijklmn" | |
print len(s) | |
print s.find("c") | |
print s.find("x") | |
print s[2] | |
print s[2:5] | |
print s[:5] | |
print s[2:] | |
print s[2:-1] | |
print len("こんにちは") | |
print len(u"こんにちは") | |
# 型の変換 | |
print 5 + int("5") | |
print 5 + float("5") | |
age = 20 | |
print "I am " + str(age) + " year old" | |
# リスト | |
sales = [255, 100, 353, 400, "aba"] | |
print len(sales) | |
print sales[2] | |
print 100 in sales | |
sales[1] = 10000 | |
print sales[1] | |
print 100 in sales | |
print range(1, 10) | |
print range(3, 10) | |
print range(3 ,20 ,2) | |
sales2 = [50, 100, 80, 45] | |
print sales2 | |
sales2.sort() | |
print sales2 | |
sales2.reverse() | |
print sales2 | |
day = "2013/12/15" | |
print day.split("/") | |
a = ["a", "b", "c"] | |
print "-".join(a) | |
# タプル | |
t = (2, 5, 8) | |
print len(t) | |
print t * 3 | |
b = list(t) | |
print b | |
t2 = tuple(b) | |
print t2 | |
# セット (集合型) | |
s1 = set([1, 2, 3, 4, 3, 2]) | |
print s1 | |
s2 = set([3, 4, 5]) | |
print s2 | |
print s1 - s2 | |
print s2 - s1 | |
print s1 | s2 | |
print s1 & s2 | |
print s1 ^ s2 | |
# 辞書 | |
sales = {"taguchi":200, "imai":400, "dotinst":500} | |
print sales | |
print sales["imai"] | |
sales["imai"] = 1000 | |
print sales | |
print "taguchi" in sales | |
print "test" in sales | |
print sales.keys() | |
print sales.values() | |
print sales.items() | |
v1 = 10 | |
v2 = 1.234234 | |
v3 = "imai" | |
v4 = {"imai":400, "brian":500} | |
print "age: %d" % v1 | |
print "age: %10d" % v1 | |
print "age: %010d" % v1 | |
print "price: %f" % v2 | |
print "price: %.2f" % v2 | |
print "name: %s" % v3 | |
print "sales: %(imai)d" % v4 | |
print "%d and %f" % (v1, v2) | |
# 条件分岐 | |
score = 70 | |
if score > 60: | |
print "OK!" | |
print "OK2!" | |
if score > 60 and score < 80: | |
print "OK3!" | |
score2 = 40 | |
if 60 < score2 < 80: | |
print "OK4!" | |
elif score > 30: | |
print "OK?" | |
else: | |
print "NG!" | |
print "OK5!" if score > 60 else "NG2!" | |
print "OK5!" if score2 > 60 else "NG2!" | |
# ループ | |
f = [13, 3435, 31, 876] | |
sum = 0 | |
for sale in f: | |
sum = sum + sale | |
print sale | |
else: | |
print sum # ループが終わったら一度処理する | |
for i in range(10): | |
if i == 3: | |
continue | |
if i == 5: | |
break | |
print i | |
# 辞書型ループ | |
dic = {"imai":1000, "brian": 300, "claud": 900, "mark": 130, "dave": 487} | |
for key, value in dic.iteritems(): | |
print "key: %s, value: %d " % (key, value) | |
for key in dic.iterkeys(): | |
print key | |
#whileループ | |
n = 100 | |
while n < 110: | |
if n == 103: | |
n += 1 | |
continue | |
if n == 106: | |
break | |
print n | |
n += 1 | |
else : | |
print "end" | |
print n |
関数
Java8でラムダ式が追加されたのを機に使おう!と思っていてあまり使っていないラムダ式。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# coding: UTF-8 | |
# 関数 | |
def hello(name, num=5): | |
print "hello %s! " % name * num | |
def hello2(name, num=4): | |
return "hello %s!" % name * num | |
#pass | |
def hello3(): | |
pass | |
hello("brain", 2) | |
hello("cluad", 4) | |
hello("david") | |
print hello2("mark") | |
# 変数スコープ | |
name = "imai" | |
def hello(): | |
name = "mark" | |
print name | |
def double(x): | |
return x ** 2 | |
print map(double, [2, 5, 8]) | |
print map(lambda x:x * x, [2, 5, 8]) |
クラス・オブジェクト
特に無し。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# coding: UTF-8 | |
__author__ = 'masahiro' | |
class User(object): | |
def __init__(self, name,): | |
self.name = name | |
def greet(self): | |
print "my name is %s!" % self.name | |
nico = User("Nico") | |
brian = User("Brian") | |
print nico.name | |
nico.greet() | |
brian.greet() |
継承
上のクラスを継承したクラス。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# coding: UTF=8 | |
import DotInstall3 | |
__author__ = 'masahiro' | |
class SuperUser(DotInstall3.User): | |
def shout(self): | |
print "%s! is SUPER!" % self.name | |
tom = SuperUser("tom") | |
tom.shout() |
インポート方法
なるほど、こうやってモジュールの中の一部をロード出来るんですね。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#coding: UTF=8 | |
__author__ = 'masahiro' | |
import math, random, numpy | |
from datetime import date | |
print math.ceil(5.2) | |
for i in range(5): | |
print random.random() | |
print date.today() |
2014年5月23日金曜日
Python for Google App Engine
出来るだけシンプルにPythonでWEBアプリ実装したいと思い、いままで使ってこなかったGoogle App Engine を使ってみようと思います。
Google のドキュメントを訳してくれている素晴らしい方がいました。
参考にさせてもらいながら、環境を作成します。
○Python for Google App Engine : Python tutorial の和訳
○インストール時の注意点
インストールディレクトリはデフォルトのままよりも、C:\GoolgleAppEngine などに変更しましょう。
ホワイトスペースを間に含むとあまり良くないです。
○pycharm の CE は Google App Engine プロジェクトに対応していない。
うーん、楽に開発したいので、どうしよ。
2014年5月19日月曜日
はじめての python 環境作成
python 開発環境を作成しよう
時系列解析環境を作成するため、python 環境を作成する。
pythonの日本コミュニティ
http://www.python.jp/
インストール
2系の最新版、python 2.7.6 にすることにしました。
https://www.python.org/downloads/
※python3系の対応ライブラリの件がよくわからなかったので、2系を選択。
慣れてきたら3系環境も構築しよう。
インストールはダウンロードした実行ファイルを使用するだけ。
インストールフォルダは変更しない方が良いようです。というのも、他の数値計算ライブラリをインストールするとき便利だからです。
ライブラリ
今回導入するライブラリは以下です。
pyaudio 音声ライブラリ
http://people.csail.mit.edu/hubert/pyaudio/
Numpy & Scipy 科学計算ライブラリ
http://www.scipy.org/scipylib/download.html
全部、exeを実行するだけでOK。
matplotlib グラフプロットライブラリ
http://matplotlib.org/
IDE
PyCharmをインストールします。http://www.jetbrains.com/pycharm/
昔は有料版しかなかったようですが、CE(無料版)が出ています。
有名なIDEのコマンドを使えるようです。
使い慣れたIDEを選ぶと良いと思います。
PyCharmを初回起動すると、Pythonの実行ファイルを設定するように求められます。
以下を設定します。
[Pythonインストールフォルダ]/python.exe
以上で、開発環境の構築が完了です。
2014年5月12日月曜日
動画音声のノーマライズ
プログラムに組み込むため、dll もしくは コマンドライン(exe) で動画音声調整する方法。
(今回は、音声コーデックが AAC の動画が対象)
aacgain というソフトウェアを使用した。
下記のページの AACGain v1.9が最新
http://www.rarewares.org/aac-encoders.php
dll では libFAAC があったが、今回は使用せず。
aacgain /r /c /k /p [filepath] ...
・分析のみを行う
aacgain /s s [filepath] ...
・/d で指定した変更を行うとどうなるかを解析する
aacgain /s s /d 5 [filepath] ...
(今回は、音声コーデックが AAC の動画が対象)
aacgain というソフトウェアを使用した。
下記のページの AACGain v1.9が最新
http://www.rarewares.org/aac-encoders.php
dll では libFAAC があったが、今回は使用せず。
【aacgainを使うことのメリット】
- mp4を指定すると、直接音声のノーマライズが可能。
- 動画の映像が劣化しない ← これは効きますね。
- プログラムに組み込むのが容易
○音声ノーマライズ
aacgain /r /c /k /p [filepath] ...
/r :トラックゲインを音声個別に指示 89db → /a に変えると、指定した全ての音声の相対的な音量を保って指示
/c :クリッピングが発生しても確認メッセージを出さないオプション。クリッピング:音が大きすぎて許容値を超えていて、音の割れ、歪の発生の可能性がある。指定しないと、確認メッセージへの応答が必要。
/p :ファイルのタイムスタンプを変更しないオプション
/k :クリッピングしないギリギリまでゲインを自動で下げる
/d トラックゲインの指定 89dbに対して増減を指定する。/d 5 とすれば、89 + 5 = 94 となる。
○音声の分析のみ
・分析のみを行う
aacgain /s s [filepath] ...
Recommended "Track" dB change: -0.370000
Recommended "Track" mp3 gain change: 0
Max PCM sample at current gain: 19850.775391
Max mp3 global gain field: 180
Min mp3 global gain field: 115
Recommended "Album" dB change for all files: -0.370000
Recommended "Album" mp3 gain change for all files: 0
・/d で指定した変更を行うとどうなるかを解析する
aacgain /s s /d 5 [filepath] ...
Recommended "Track" dB change: 4.630000
Recommended "Track" mp3 gain change: 3 ← /d は目標のdbまで1.5db刻みで最も近いものを計算する。
WARNING: some clipping may occur with this gain change!
Max PCM sample at current gain: 19850.775391
Max mp3 global gain field: 180
Min mp3 global gain field: 115
Recommended "Album" dB change for all files: 4.630000
Recommended "Album" mp3 gain change for all files: 3
WARNING: with this global gain change, some clipping may occur in file after_converter.mp4 ← /d 5 するとクリッピングすることを示す
LaTeX を Windows で使う ShareLaTeX
WindowsにTeXをインストールして~、とかやろうと思ったけど、けっこう時間かかりそう。
時間の無い社会人院生にとっては結構無駄な時間。
オンラインで良いツールがありました。ShareLaTeX。デザインもブートストラップで少なくともここ3年くらいのものだろうし、ありがたく使わせていただこうと。
数学記号の入力にまずは慣れるために参考になるリンク。
時間の無い社会人院生にとっては結構無駄な時間。
オンラインで良いツールがありました。ShareLaTeX。デザインもブートストラップで少なくともここ3年くらいのものだろうし、ありがたく使わせていただこうと。
数学記号の入力にまずは慣れるために参考になるリンク。
後は習うより慣れろ、ですね。
2014年5月6日火曜日
MySQL 2つのカラムデータをお互いに入れ替える
2つのカラムデータを入れ替えたいこと。
最大値と最小値を間違えたりすると発生します。
以下のように入れ替える事ができます。
以上です。
ユーザ変数を定義する機会ってあまりないので、思いつかなかった。
最大値と最小値を間違えたりすると発生します。
以下のように入れ替える事ができます。
set @str = 0;
update table `column1` = (@str := `column1`)*0+`column2`, `column2` = @str
where id > 0;
以上です。
ユーザ変数を定義する機会ってあまりないので、思いつかなかった。
登録:
投稿 (Atom)