Au用の動画変換プログラムの修正
ezmovie/動画をau用動画に変換する(動画変換FFmpeg)で紹介されているプログラムで動画を変換してみたのですが、動画によっては音声がうまくでないものがありまして、何が問題なのか色々調べてみました。
音声がダメなやつでも、UUIDはうまく設定できているし、映像も正しくでます。しかし音声のstcoの修正に失敗していました。
上記サイトのプログラムでデバッグ出力してみると、確かに一度しかstcoを検索しません。
もちろん、hexdumpしてみると、stcoは二箇所埋め込まれています。
うんうん唸って半日・・・ようやく問題箇所発見!
fsearch関数でstcoの位置を検索しているのですが、この関数では動画ファイルを1024バイトづつ区切って、文字列の一致検索をしています。
このとき、この1024バイトの中で「一度しか」検索していなかったのです。
問題箇所を抜粋します。67行目のwhile文の周辺です。
以下が修正した部分です。
文字列検索のindexメソッドは第二引数に検索する位置を指定できます。
発見した次の位置を指定して、次の場所を探しています。
この修正でめでたく、動画変換ができました。
音声がダメなやつでも、UUIDはうまく設定できているし、映像も正しくでます。しかし音声のstcoの修正に失敗していました。
上記サイトのプログラムでデバッグ出力してみると、確かに一度しかstcoを検索しません。
もちろん、hexdumpしてみると、stcoは二箇所埋め込まれています。
うんうん唸って半日・・・ようやく問題箇所発見!
fsearch関数でstcoの位置を検索しているのですが、この関数では動画ファイルを1024バイトづつ区切って、文字列の一致検索をしています。
このとき、この1024バイトの中で「一度しか」検索していなかったのです。
問題箇所を抜粋します。67行目のwhile文の周辺です。
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
以下が修正した部分です。
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
文字列検索のindexメソッドは第二引数に検索する位置を指定できます。
発見した次の位置を指定して、次の場所を探しています。
この修正でめでたく、動画変換ができました。
スポンサーサイト
<<Javaで絵文字を抜き取る | HOME | PL/pgSQLで月初日と月末日を求める>>
COMMENTS
COMMENT FORM
TRACKBACK
| HOME |