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追記:高速化したソースに変更しました
# ATOM(BOX) FIELD CHANGE
# Usage: ruby atomChange.rb infile outfile
# Ver: 1.0.1
# Hist:
#   2007/11/13・・・構築
#   2007/11/14・・・高速化
#   2007/11/15・・・fsearchのデバッグ

#----------------------------------------------------------
# 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
        if data.index(word) != nil
          #i_stream.close
          pos << readed + data.index(word)
        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投票ボタン

« Flash Debug Playerのインストール(Flex2/3)|Top|FFmpeg⇒MP4Boxで携帯用動画を作成(動画変換FFmpeg) »

コメント

管理人のみ閲覧できます

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

管理人のみ閲覧できます

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

コメントの投稿

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

トラックバック

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

Top

HOME

★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(20)
  • 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(18)
  • PL/SQL(8)
  • ORACLEエラー(5)
  • ActiveReports 3.0J(5)
  • サーバ構築・管理(33)
  • 動画変換FFmpeg(8)
  • 携帯サイト作成(9)
  • SEO・SEM(4)
  • WEB素材(3)
  • WINDOWS VISTA(6)
  • LINUX デスクトップ(2)
  • NetBeans(1)
  • Aptana(8)
  • FlashDevelop(3)
  • MS-DOS(5)
  • Excel VBA(5)
  • インターネットプロバイダー検討(2)
  • サーバ・ウェブスペース検討(3)
  • その他(25)
  • ブログかんぺ(2)
  • 未分類(0)

SINCE 2007/09/26

06 | 2009/07 | 08
- - - 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 31 -

うっきー

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

FC2ブログランキング

↑ご投票おねがいします

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

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

★いつでも里親さがし★