WEB2MEMO =PHP、Ajax、JAVA、AIR、Flex2/3、Ruby、Rails等のメモ=

PHP、JavaScript、CSS、JAVA、AIR、Flex2/3、Ruby、Rails(Ruby on Rails)、DB(MySQL、PostgreSQL、ORACLE)、サーバ構築管理など 仕事で忘れそうなことを書いてます。

ezmovie/動画をau用動画に変換する(動画変換FFmpeg)

ezmovie/動画をau用動画に変換する(動画変換FFmpeg)


。。。Docomo用はすんなりできたんですが、auがなかなか強敵。。。
前回の内容

解決方法はATOM(BOX)の以下の項目を編集・追加する事でした。
■ 『ftyp』を書き換え
■ 『uuidcpgd』を追加
■ 『uuidenci』を追加
■ 『uuidmvml』を追加
■ 『stco』を編集

■注意
○東芝機に対する注意
 本体で録画されていないQVGAサイズの動画を再生できない仕様のようです。
 QCIFサイズ(縦176×横144ドット)なら再生できるようです。

■ダウンロード

■ライセンス
煮るなり焼くなり。自己責任でお使いください。
もしよろしければ、下のバナーをクリックしてください。

順番に説明。
■ftyp

ファイルの互換性を示す「ブランド」値が記述されている。
auなら『kddi』で。


■uuidcpgd

有効期限や再生回数を指定できるようです


■uuidenci

撮影した携帯機種のようです
今回はW21Aに偽装しました
携帯動画変換君のソースを参考にしました


■uuidmvml

動画を作成した時間のようです
1904/01/01 0:00:00 からの経過秒数で表示


■stco

データの位置情報のようです
上記の4項目を編集すると、動画データの位置がずれてしまいますので、
位置の修正が必要ということ

以上の事を踏まえて、えいやっとRubyで書いてみました
2007/11/14追記:高速化したソースに変更しました
2009/09/26追記:一行入魂様よりご指摘いただいたFILE SEARCH関数の修正。ありがとうございました。
# ATOM(BOX) FIELD CHANGE
# Usage: ruby atomChange.rb infile outfile
# Ver: 1.0.2
# Hist:
# 2007/11/13・・・構築
# 2007/11/14・・・高速化
# 2007/11/15・・・fsearchのデバッグ
# 2009/09/26・・・一行入魂様よりご指摘いただいたFILE SEARCH関数の修正
# http://aoyagikouhei.blog8.fc2.com/blog-entry-64.html
#

#-------------------------------------------------------------------------------------------
# VARS
IN_FILE = ARGV[0]
OUT_FILE = ARGV[1]

UUID = "%A8%8C%11%D4%81%97%00%90%27%08%77%03"
item0= "ftypkddi%00%00%01%00kddi3g2a"
item1= "uuidcpgd" + UUID + "%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00"
item2= "uuidenci" + UUID + "%00%00%00%00KDDI-SA%00W21SA%00%00%00SAMP4v2%00SAMUXv2%00"
item3= "uuidmvml" + UUID + "%00%00%00%00%FF%FF%E0%00" # <- TIMESTAMP ADD AFTER

#-------------------------------------------------------------------------------------------
# FUNCTION

# CODE 2 ASCII
def code2ascii(str)
if /%{1}/ =~ str
conv_str = ""
codes = str.split('%')
codes.each{|code|
if /^([0-9A-F]){2}$/ =~ code
code = [code].pack("H*")
elsif /^([0-9A-F]){2}.+/ =~ code
code_body = [code.slice(0,2)].pack("H*")
str_body = code.slice(2,code.length - 2)
code = code_body + str_body
end
conv_str += code
}
return conv_str
else
return str
end
end

# GET DATA VALUE
def getDWORD(vword)
vword = vword.unpack("H*")
data_value = vword.to_s.hex
return data_value.to_i
end

# FILE SEARCH
def fsearch(file,word)
pos = []
word.length.times {|start_pos|
begin
i_stream = open(file, "rb")
rescue => ex
print ex.message, "\n"
exit
end
readed = 0
if start_pos > 0
i_stream.read(start_pos)
readed = start_pos
end
while data = i_stream.read(1024)
data = data.to_s
index = data.index(word)
while nil != index
pos << readed + index
index = data.index(word, index + 1)
end
readed += data.length
end
i_stream.close
}
if pos.length > 0
pos = pos.uniq
pos = pos.sort{|a,b| a<=>b}
return pos
else
return false
end
end

#-------------------------------------------------------------------------------------------
# MAIN
# CHECK FILE NAME
if IN_FILE == OUT_FILE
print "Can't replace file"
exit
end

# TIMESTAMP
begin
t = File::mtime(IN_FILE)
creationTime = t.to_i + 0x7C25B080
rescue => ex
print ex.message, "\n"
exit
end

ts_s = ""
ts_s += "%" + format("%02x",(creationTime / 0x1000000) & 0xFF).upcase
ts_s += "%" + format("%02x",(creationTime / 0x10000) & 0xFF).upcase
ts_s += "%" + format("%02x",(creationTime / 0x100) & 0xFF).upcase
ts_s += "%" + format("%02x",(creationTime) & 0xFF).upcase

# item3 ADD TIMESTAMP
item3 += ts_s

# CREATE ftyp + uuid
item0_cnv = code2ascii(item0)
item1_cnv = code2ascii(item1)
item2_cnv = code2ascii(item2)
item3_cnv = code2ascii(item3)
fu_box = ""
fu_box += [format("%08x",item0_cnv.length + 4)].pack("H*")
fu_box += item0_cnv
fu_box += [format("%08x",item1_cnv.length + 4)].pack("H*")
fu_box += item1_cnv
fu_box += [format("%08x",item2_cnv.length + 4)].pack("H*")
fu_box += item2_cnv
fu_box += [format("%08x",item3_cnv.length + 4)].pack("H*")
fu_box += item3_cnv

# OUTPUT FILE CREATE
begin
o_stream = open(OUT_FILE, "wb")
o_stream.print ""
o_stream.close
rescue => ex
print ex.message, "\n"
exit
end

# stco POSITION
stco_pos = fsearch(IN_FILE,"stco")

# ATOM CHANGE
begin
# INPUT & OUTPUT FILE OPEN
i_stream = open(IN_FILE, "rb")
o_stream = open(OUT_FILE, "ab")

# READED BITE
readed = 0

# WRITED BITE
writed = 0

# ftyp & uuid WRITE
o_stream.print fu_box
writed = fu_box.length
ftyp_length = getDWORD(i_stream.read(4))
i_stream.read(ftyp_length - 4)
readed = ftyp_length
diff = writed - readed

# stco WRITE
stco_pos.each {|spos|
# WRITE BEFORE DATA
before_data_length = spos - 4 - readed
readed += before_data_length
writed += before_data_length
while before_data_length > 0
if(before_data_length > 1024)
read_length = 1024
before_data_length -= 1024
else
read_length = before_data_length
before_data_length = 0
end
o_stream.print i_stream.read(read_length)
end

# stco DATA LENGTH
stco_length = i_stream.read(4)
readed += 4
o_stream.print stco_length
writed += 4
stco_length = getDWORD(stco_length) - 16 # "16" is STATIC AREA LENGTH

# WRITE stco STATIC AREA
stco_static_area = i_stream.read(12)
readed += 12
o_stream.print stco_static_area
writed += 12

# UPDATE stco
while stco_length > 0
dpos = i_stream.read(4)
readed += 4
stco_length -= 4
o_stream.print [format("%08x",getDWORD(dpos) + diff)].pack("H*")
writed += 4
end
}

# LEAST DATA WRITE
while data = i_stream.read(1024)
o_stream.print data
readed += data.length
writed += data.length
end

# STREAM CLOSE
o_stream.close
i_stream.close

rescue => ex
print ex.message, "\n"
exit
end
※死ぬほど適当な英語のコメントですが、気にしないでくださいね。
これを前回のシェルに追記する
#!/bin/bash
#
# conv3g2.sh 動画変換スクリプト
#
# 使いかた: ./conv_3g2.sh [入力File] [出力File]
#
export name="`echo $1 | sed -e 's/\..*//'`"

ffmpeg-mh -y -i $1 -bitexact -vcodec mpeg4 -fixaspect -s 176x144 -r 14.985 -b 190 -acodec aac -ac 1 -ar 22050 -vol 768 -ab 32 -f 3gp -muxvb 64 -muxab 32 ${name}.1.3g2

# MP4Box -add ${name}.1.3g2 -new ${name}.2.3g2

ruby /絶対パス/atomChange.rb ${name}.1.3g2 $2

# rm -f ${name}.1.3g2 ${name}.2.3g2
rm -f ${name}.1.3g2
※MP4Boxを使うと再生できない・・・。つかわなければ再生できました
※『atomChange.rb』 のパスは環境にあわせて修正してください。


blogram投票ボタン

« ディレクトリにあるファイルを一覧表示(MS-DOS)|Top|SQL*Plus/EXIT のステータスコード(データベース・DB) »

コメント

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://web2memo.blog120.fc2.com/tb.php/65-ecacd2f6

Au用の動画変換プログラムの修正

ezmovie/動画をau用動画に変換する(動画変換FFmpeg)で紹介されているプログラムで動画を変換してみたのですが、動画によっては音声がうまくで...

Top

HOME

FC2ブログランキング

↑ご投票おねがいします

★AS用文字コード変換[Download]
ActionScript用日本語文字コード変換ライブラリ
★JavaScriptライブラリ[Download]
HTMLタグのクラスを設定するだけで使えるJavaScriptライブラリ
★editor.js [Download]
オンラインWYSIWIGエディタ・携帯HTML編集用JavaScriptライブラリ
★atomChange.rb[Download]
au用動画ATOM変換ライブラリ

  • ダウンロード(5)
  • PHP(21)
  • Zend Framework(5)
  • JavaScript・Ajax(21)
  • YUI(1)
  • EXT JS(2)
  • prototype.js(5)
  • script.aculo.us(3)
  • JAVA(7)
  • JSP・サーブレット(3)
  • Flex2/3(18)
  • AIR(15)
  • Ruby(9)
  • Ruby on Rails(20)
  • CSS(9)
  • データベース・DB(22)
  • PL/SQL(8)
  • ORACLEエラー(6)
  • ActiveReports 3.0J(5)
  • サーバ構築・管理(33)
  • 動画変換FFmpeg(8)
  • 携帯サイト作成(9)
  • SEO・SEM(4)
  • WEB素材(3)
  • WINDOWS VISTA(6)
  • Linux(3)
  • NetBeans(1)
  • Aptana(8)
  • FlashDevelop(3)
  • MS-DOS(9)
  • Excel VBA(7)
  • インターネットプロバイダー検討(3)
  • サーバ・ウェブスペース検討(3)
  • その他(25)
  • ブログかんぺ(2)
  • 未分類(0)

SINCE 2007/09/26

10 | 2009/11 | 12
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 - - - - -

うっきー

Author:うっきー
現在、Java Swingでエディタ作ってます。
プログラムも公開しています。問題があればコメントしてください。
ただいま出張中・・・

お得なポイント貯まる!ECナビ
ポイントの貯まり方が並じゃない!

★wan + life★
和歌山で犬の保護・里親探しをされている団体です。
マイホーム購入を機に、是非里親になろうと考えてます。
興味のある方は上記バナーをクリックしてください。

★いつでも里親さがし★