<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6573067931953719719</id><updated>2024-09-04T19:28:13.771+09:00</updated><category term="Red5拡張関連"/><category term="AvatarChat関連"/><category term="Jmeter関連"/><category term="JMX関連"/><category term="XmlSocket関連"/><category term="java関連"/><category term="junit関連"/><title type='text'>プログラムしてみようか</title><subtitle type='html'>プログラミングを週末にぼちぼちやります。&#xa;twitterはこちらhttp://twitter.com/#!/search/taktod</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://poepoemix.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://poepoemix.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>poepoemix</name><uri>http://www.blogger.com/profile/05463016011577425897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmArlhv0g68lJB1e7v48w7IYddGoy8Cs8CdCdERcrqQs3pFGiA5SsoRZuc5uaBo-74FqMhnS_R34dGfKWD0AIsGj0lZuGflE3qWNLudYZlDPWeoHI4kOYjytiIFIQ6lQ/s220/atsui.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>220</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6573067931953719719.post-5112918528666021464</id><published>2013-11-28T21:20:00.002+09:00</published><updated>2013-11-28T21:20:53.882+09:00</updated><title type='text'>javaをつかったコンバートプログラムを書いていました。</title><content type='html'>表題どおり、javaで動くメディアデータの変換プログラムを書いていました。&lt;br /&gt;
といっても、pureJavaで書いているわけではなく、ffmpegとかつかって変換させるというものです。&lt;br /&gt;
&lt;br /&gt;
概念的には次の図のようなやつです。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5QQccexFL2AZ8wZjgEMwgAJPdCN02TuoXajzoo2BWEeNjulAX0GeU7M9ZKZkUGsJsjxRVNF_AJ2R9yhOzrZ5pX5pkfhlbBuAUG-l4IWmXzB3TXqsu2O1MK4vctuB9WlIReCYR9TVrBDc/s1600/Untitled+(6).png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;318&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5QQccexFL2AZ8wZjgEMwgAJPdCN02TuoXajzoo2BWEeNjulAX0GeU7M9ZKZkUGsJsjxRVNF_AJ2R9yhOzrZ5pX5pkfhlbBuAUG-l4IWmXzB3TXqsu2O1MK4vctuB9WlIReCYR9TVrBDc/s400/Untitled+(6).png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
動画のデータのUnitを入れると、変換した後のデータがでてくるというもの。&lt;br /&gt;
xuggleを使う場合はこんな感じ。&lt;a href=&quot;https://github.com/taktod/myLib/blob/a954a1fb36f828deb340956c8e2722b2add0f968/myLib.GPLv3/myLib.transcode.xuggle.flv/src/test/java/com/ttProject/transcode/xuggle/flv/test/FileTranscodeTest.java&quot;&gt;テストコード&lt;/a&gt;&lt;br /&gt;
avconv(ffmpeg)を使う場合はこんな感じ。&lt;a href=&quot;https://github.com/taktod/myLib/blob/a954a1fb36f828deb340956c8e2722b2add0f968/myLib.MIT/myLib.transcode.ffmpeg.flv/src/test/java/com/ttProject/transcode/ffmpeg/flv/test/FileTranscodeTest.java&quot;&gt;テストコード&lt;/a&gt;&lt;br /&gt;
となりました。&lt;br /&gt;
&lt;br /&gt;
やってることは同じで&lt;br /&gt;
１：TranscodeManagerを宣言。&lt;br /&gt;
２：MediaUnitを解釈するためのプログラム設置&lt;br /&gt;
xuggleならpacketizer、ffmpegならdeunitizerとunitizer&lt;br /&gt;
３：TrackManagerをTranscodeManagerに作らせる&lt;br /&gt;
４：TrackListenerをくっつけて出力を拾わせる。&lt;br /&gt;
となってます。&lt;br /&gt;
&lt;br /&gt;
これをうまくつかって、高速、安定、字幕も使えて、複数トラック出力もできる、ライブ用のHttpLiveStreaming、はやいところつくってみたいですね。</content><link rel='replies' type='application/atom+xml' href='http://poepoemix.blogspot.com/feeds/5112918528666021464/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://poepoemix.blogspot.com/2013/11/java.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/5112918528666021464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/5112918528666021464'/><link rel='alternate' type='text/html' href='http://poepoemix.blogspot.com/2013/11/java.html' title='javaをつかったコンバートプログラムを書いていました。'/><author><name>poepoemix</name><uri>http://www.blogger.com/profile/05463016011577425897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmArlhv0g68lJB1e7v48w7IYddGoy8Cs8CdCdERcrqQs3pFGiA5SsoRZuc5uaBo-74FqMhnS_R34dGfKWD0AIsGj0lZuGflE3qWNLudYZlDPWeoHI4kOYjytiIFIQ6lQ/s220/atsui.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5QQccexFL2AZ8wZjgEMwgAJPdCN02TuoXajzoo2BWEeNjulAX0GeU7M9ZKZkUGsJsjxRVNF_AJ2R9yhOzrZ5pX5pkfhlbBuAUG-l4IWmXzB3TXqsu2O1MK4vctuB9WlIReCYR9TVrBDc/s72-c/Untitled+(6).png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6573067931953719719.post-861869638407621700</id><published>2013-11-18T20:42:00.002+09:00</published><updated>2013-11-18T20:42:35.384+09:00</updated><title type='text'>jsegmenterのプログラム作り直しました。</title><content type='html'>最近myLib.chunk*というライブラリをつくりました。&lt;br /&gt;
というのも、いままでのmyLib.packetのmpegtsの切り方が気に入らなかったからです。&lt;br /&gt;
&lt;br /&gt;
今日はその説明&lt;br /&gt;
ffmpegでmpegtsを出力すると音声の分割がbyte量単位になります。&lt;br /&gt;
よって無音部や音が弱い部分があると、音声の塊の長さが長くなることがあります。&lt;br /&gt;
また、音声と映像のデータがきちんと同期しているわけではありません。&lt;br /&gt;
&lt;br /&gt;
概念図を書いてみます。&lt;br /&gt;
まずは定義、映像のキーフレーム、中間フレーム、音声のフレームの３つがあります。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpsRrbXz88VYmR81qOs5F1ViqOdKshR-ygyNh5vwlnhBmnkuB11B3B6Rr0sUOXxR09CsPNlx6IgMwcc1XjJes4DgE4DvG269hpW36bz4quSSurcyji17qPA9gi2vef-ONT4_w0_tyH48g/s1600/Untitled.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpsRrbXz88VYmR81qOs5F1ViqOdKshR-ygyNh5vwlnhBmnkuB11B3B6Rr0sUOXxR09CsPNlx6IgMwcc1XjJes4DgE4DvG269hpW36bz4quSSurcyji17qPA9gi2vef-ONT4_w0_tyH48g/s1600/Untitled.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
本来のデータは次のようになります。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOKiKn8l23vQ8zv-N1cu1-QZG_gfDX-lhD5oUndSErOxwkH4bc-2HLoAoqrZaA5VTOsel5Hdo-WFkgs7O4XVWllUHrQZaN7iXW251OTMDFPFk98k1WXSEltZWknh9QOPcttuZHT2a8e1o/s1600/Untitled+%25281%2529.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;51&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOKiKn8l23vQ8zv-N1cu1-QZG_gfDX-lhD5oUndSErOxwkH4bc-2HLoAoqrZaA5VTOsel5Hdo-WFkgs7O4XVWllUHrQZaN7iXW251OTMDFPFk98k1WXSEltZWknh9QOPcttuZHT2a8e1o/s400/Untitled+%25281%2529.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
ファイルに格納されるデータ&lt;br /&gt;
これがffmpegが出力するファイルだと次のような感じになっています。(mpegtsの場合)&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgub0RXG9UQqEULeOkDhK07ceup5kIYMC8L6HbLzvvMJK-ewROQMRGC6MqLA5BjjDak7uzAtoNBJcXD1ytAbSAm1JKn8hn0rZOw_-FY4NcThqN71hLwyYnB59tQgGPBKijdmd2QdIc8QM/s1600/Untitled+%25283%2529.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;12&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgub0RXG9UQqEULeOkDhK07ceup5kIYMC8L6HbLzvvMJK-ewROQMRGC6MqLA5BjjDak7uzAtoNBJcXD1ytAbSAm1JKn8hn0rZOw_-FY4NcThqN71hLwyYnB59tQgGPBKijdmd2QdIc8QM/s400/Untitled+%25283%2529.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
いままでの僕のプログラム(myLib.packet)での分割だと、単にキーフレームの位置のみをみて、分割しているので、次のようになっていました。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_GFhHc8tFswmAkyj-zoRfRQurBV91fjCGOPLX0ZKoTU34zRdMDA9GZmqAi3pr1LQEDSiCG4WDpDrdCPtSdMddx6Nkq6lr2mtXuROmSz9g2ciDhaXBfNFS_EOXiy7hW2Z3U6Mfh8PbeGw/s1600/Untitled+%25284%2529.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;238&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_GFhHc8tFswmAkyj-zoRfRQurBV91fjCGOPLX0ZKoTU34zRdMDA9GZmqAi3pr1LQEDSiCG4WDpDrdCPtSdMddx6Nkq6lr2mtXuROmSz9g2ciDhaXBfNFS_EOXiy7hW2Z3U6Mfh8PbeGw/s320/Untitled+%25284%2529.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
キーフレームをみつけたら、時間を確認して、必要な時間分経っていたらファイルを分割するという感じ。&lt;br /&gt;
これだと、１つ目は音声がない映像だけ、&lt;br /&gt;
２つ目は音声も映像もあるけど、映像のデータよりだいぶ前の音声データがはいっている形になっています。&lt;br /&gt;
実際によく使うマリオのプロモ動画ははじめの方で分割後のデータが音声抜けていたりしていました。&lt;br /&gt;
&lt;br /&gt;
で、今回はこうした。(myLib.chunk)&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCx10OuEnhLvKahtTxB25TU86CLfqGxyzcI22BL3UTTzDvbmMnZ9qO0Q9SXYsVgJzi0bh6n2CJn7CQFpEoIvDqm2NJFiGOSzQuXivB27U5f6KDqPpvlsA5OlejYGPUxs0cOSSm0N73XYs/s1600/Untitled+%25285%2529.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;297&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCx10OuEnhLvKahtTxB25TU86CLfqGxyzcI22BL3UTTzDvbmMnZ9qO0Q9SXYsVgJzi0bh6n2CJn7CQFpEoIvDqm2NJFiGOSzQuXivB27U5f6KDqPpvlsA5OlejYGPUxs0cOSSm0N73XYs/s320/Untitled+%25285%2529.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
これで１つ１つの分割単位が、その単位の再生に必要な動画の１セットと対応する音声データを保持する形になっています。&lt;br /&gt;
なお、この概念図は時間の長さのみを考慮しているので、実際の出力ファイルのサイズは乱高下します。&lt;br /&gt;
&lt;br /&gt;
プログラム&lt;br /&gt;
&lt;a href=&quot;https://github.com/taktod/jsegmenter/tree/new&quot;&gt;https://github.com/taktod/jsegmenter/tree/new&lt;/a&gt;&lt;br /&gt;
利用しているライブラリは&lt;br /&gt;
&lt;a href=&quot;https://github.com/taktod/myLib&quot;&gt;https://github.com/taktod/myLib&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
一応型変換できるようになったので、flvやmp4、mkvのデータからコーデックさえ合えばHLS形式のデータ分割できるようにしたいですね。&lt;br /&gt;
一応下地はすでにつくってあるけど。&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://poepoemix.blogspot.com/feeds/861869638407621700/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://poepoemix.blogspot.com/2013/11/jsegmenter.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/861869638407621700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/861869638407621700'/><link rel='alternate' type='text/html' href='http://poepoemix.blogspot.com/2013/11/jsegmenter.html' title='jsegmenterのプログラム作り直しました。'/><author><name>poepoemix</name><uri>http://www.blogger.com/profile/05463016011577425897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmArlhv0g68lJB1e7v48w7IYddGoy8Cs8CdCdERcrqQs3pFGiA5SsoRZuc5uaBo-74FqMhnS_R34dGfKWD0AIsGj0lZuGflE3qWNLudYZlDPWeoHI4kOYjytiIFIQ6lQ/s220/atsui.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpsRrbXz88VYmR81qOs5F1ViqOdKshR-ygyNh5vwlnhBmnkuB11B3B6Rr0sUOXxR09CsPNlx6IgMwcc1XjJes4DgE4DvG269hpW36bz4quSSurcyji17qPA9gi2vef-ONT4_w0_tyH48g/s72-c/Untitled.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6573067931953719719.post-1409221098105465292</id><published>2013-11-16T08:42:00.000+09:00</published><updated>2013-11-16T14:39:05.271+09:00</updated><title type='text'>11/16すべきこと</title><content type='html'>誰かに見られてないとダレそうなのでブログに書いてみる。&lt;br /&gt;
&lt;br /&gt;
とりあえずしたいこと。&lt;br /&gt;
・HLSのwebvttによるトラック動作の動作確認。&lt;br /&gt;
・rtmpのDL→xuggle変換→ULのプログラムをとりあえず完成させてどのくらいの早さがでるか見てみたい。&lt;br /&gt;
・HLSのシステムを作りたい。&lt;br /&gt;
&lt;br /&gt;
とりあえずこの３つやりたい。&lt;br /&gt;
１つ目は会社での作業がかかわってくるのでやっときたいところ。&lt;br /&gt;
２、３は単なる趣味。まぁ、うまく動作したら会社でつかってもいいけど。&lt;br /&gt;
&lt;br /&gt;
で、１つ目だ。&lt;br /&gt;
iOS6の後期からHttpLiveStreamingでwebvttを使った字幕動作が対応になっています。&lt;br /&gt;
具体的にiOS6の状態で動作するのを確認したことがないので個人的にはiOS7から対応と見ています。&lt;br /&gt;
&lt;br /&gt;
わかっていること&lt;br /&gt;
サンプル：&lt;a href=&quot;http://49.212.39.17/mario/index.m3u8&quot;&gt;http://49.212.39.17/mario/index.m3u8&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
■レベル１&lt;br /&gt;
・iOSの古いバージョンでも動作可能。ただし字幕は見れない。&lt;br /&gt;
・日本語等も使える。&lt;br /&gt;
・m3u8を複数組み合わせた状態でしか実行できない。&lt;br /&gt;
上記のサンプルでは、index.m3u8がsubPlaylist.m3u8とmario.m3u8を内包している形になっている。&lt;br /&gt;
&lt;br /&gt;
■レベル２(つかってみてわかったこと)&lt;br /&gt;
・字幕トラックの時間がかぶるのはあまりよろしくない。&lt;br /&gt;
&lt;div class=&quot;p1&quot;&gt;
00:00:07.500 --&amp;gt; 00:00:08.500 line:100% align:left position:0%&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
hello&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
00:00:08.000 --&amp;gt; 00:00:08.500 line:100% align:left position:0%&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;p1&quot;&gt;
こんにちは&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
こういう字幕をつくると、互いの字幕が干渉する。&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
00:00:07.500 --&amp;gt; 00:00:08.000 line:100% align:left position:0%&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
hello&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
00:00:08.000 --&amp;gt; 00:00:08.500 line:100% align:left position:0%&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
hello&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;p1&quot;&gt;
こんにちは&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
こうやった方が綺麗に字幕がでる。&lt;/div&gt;
&lt;div&gt;
干渉しすぎると字幕が極端に小さくなって見えなくなったりする。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
・内部m3u8でエラーが発生したら動画が止まる。(一度でもm3u8を応答した場合)&lt;/div&gt;
&lt;div&gt;
→動画が読み込めませんでした。とでて前のページに戻されます。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
・黒画面のまま固まる。(初出力の前に内部でredirectとかした場合)&lt;/div&gt;
&lt;div&gt;
→アクセス権限の問題でhttpのredirect等をやっているときで内部のm3u8でredirectやってしまうと、そのredirectは実行されますが、動画ではないのでそのまま表示待ちになります。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
■知りたいこと&lt;/div&gt;
&lt;div&gt;
・字幕の出現時間をmpegtsのpcrに合わせるといい感じに動作するけど、どうやら&lt;/div&gt;
&lt;div&gt;
EXT-X-DISCONTINUITYを挟んで別の動画に切り替えると時間の概念がおかしくなるらしい。&lt;/div&gt;
&lt;div&gt;
字幕側もいったん切らないとだめなのか、pcrの時間ベースではなく、経過時間で時間を出力をしないとだめなのかがわからないところ。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
・mpegtsのpcrはやく１日流し続けるとデータがoverflowしてカウンターが0にもどります。&lt;/div&gt;
&lt;div&gt;
この現象が発生したときにvttの記述をどうすべきか不明な点。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
このあたり知っておきたい。&lt;/div&gt;
&lt;div&gt;
調査してなにかわかったら、この記事に追記しようと思う。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
さぁ、今日もがんばろう。&lt;br /&gt;
&lt;br /&gt;
■で、実際にやったこと。&lt;br /&gt;
とりあえず、rtypeDeltaのデータをmpegts化して動作させて、別トラックとして利用しようとおもいました。&lt;br /&gt;
で、avconvで変換しようとおもったら、動作しない・・・&lt;br /&gt;
仕方ないので、vlcで変換させてみました。aacに直接できなかったので、ac3にしてみた。(ac3のmpegts作成ははじめて)&lt;br /&gt;
変換してみたら、いつもと違うmpegtsができました。&lt;br /&gt;
違う点１：patやpmtのデータのデータがちょっと違う。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKObQ3LH5sSQ5-tEVFQk90uj90Yeu5bjs9VvMoTQS70N5_ZJbUJNsNGrEUfO0upw70jSeWKzmtmx5CuWw2lOY11HGCuVev91GJ6ksCfBCxmVSTIjwFvwWnrM4c_2MjFkgg3tz6yho9ckg/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-11-16+10.49.01.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;96&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKObQ3LH5sSQ5-tEVFQk90uj90Yeu5bjs9VvMoTQS70N5_ZJbUJNsNGrEUfO0upw70jSeWKzmtmx5CuWw2lOY11HGCuVev91GJ6ksCfBCxmVSTIjwFvwWnrM4c_2MjFkgg3tz6yho9ckg/s400/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-11-16+10.49.01.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
左がvlc出力、右がffmpeg出力(avconv)&lt;br /&gt;
vlcはヘッダ + adaptationField + PATデータになってますが&lt;br /&gt;
ffmpegはヘッダ + PATデータ + 埋めとなってます。&lt;br /&gt;
&lt;br /&gt;
違う点２：pmtデータに見慣れないdescriptorがありました。&lt;br /&gt;
存在したのは、RegistrationDescriptorとISO639LanguageDescriptorの２つ&lt;br /&gt;
とりあえず解説しているサイトを参考に読み込みできるように調整。&lt;br /&gt;
&lt;br /&gt;
違う点３：始めのデータが音声のみのpmtを出力していました。&lt;br /&gt;
途中から音声 + 映像のpmtに変わってました。&lt;br /&gt;
[このあたりは、vlcが再生データを変換していることに起因している気がします。(これは想像)]&lt;br /&gt;
このままだと、ffmpegにまわしたときに音声しか変換に拾われませんでした。&lt;br /&gt;
先頭部分の音声のみの部分を削ぎ落としたファイルをつくったら、音声 + 映像のデータとffmpegにも認識されました。&lt;br /&gt;
&lt;br /&gt;
で、ライブラリも書き換え。&lt;br /&gt;
&lt;a href=&quot;https://github.com/taktod/myLib&quot;&gt;https://github.com/taktod/myLib&lt;/a&gt;&lt;br /&gt;
きちんと動作するようにしました。&lt;br /&gt;
&lt;br /&gt;
本題に入る前に分割用のtsファイルを作るのに時間かかっちゃったw&lt;br /&gt;
&lt;br /&gt;
■途中経過２&lt;br /&gt;
その１のhttpLiveStreamingの字幕入りのときに、中途で動画データが切り替わったらどうすればよい？というのに回答がでました。&lt;br /&gt;
(まぁ動作させた上での実験結果ですけど)&lt;br /&gt;
&lt;br /&gt;
結論としては、字幕側のm3u8にも#EXT-X-DISCONTINUITYをいれること&lt;br /&gt;
字幕のtimestampも始めからやり直しにすること&lt;br /&gt;
この２点できればいけるみたいです。&lt;br /&gt;
















&lt;br /&gt;
サンプル：&lt;br /&gt;
字幕付きのストリーム&lt;br /&gt;
&lt;a href=&quot;http://49.212.39.17/m3u8/index.m3u8&quot;&gt;http://49.212.39.17/m3u8/index.m3u8&lt;/a&gt;&lt;br /&gt;
字幕のストリーム(中途切り替えあり)&lt;br /&gt;
&lt;a href=&quot;http://49.212.39.17/m3u8/subPlaylist.m3u8&quot;&gt;http://49.212.39.17/m3u8/subPlaylist.m3u8&lt;/a&gt;&lt;br /&gt;
映像のみのストリーム(中途切り替えあり)&lt;br /&gt;
&lt;a href=&quot;http://49.212.39.17/m3u8/movie.m3u8&quot;&gt;http://49.212.39.17/m3u8/movie.m3u8&lt;/a&gt;&lt;br /&gt;
マリオのデータ&lt;br /&gt;
&lt;a href=&quot;http://49.212.39.17/m3u8/mario.m3u8&quot;&gt;http://49.212.39.17/m3u8/mario.m3u8&lt;/a&gt;&lt;br /&gt;
rtypeのデータ&lt;br /&gt;
&lt;a href=&quot;http://49.212.39.17/m3u8/rtype.m3u8&quot;&gt;http://49.212.39.17/m3u8/rtype.m3u8&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
字幕のやり方：&lt;br /&gt;
再生する。&lt;br /&gt;
右下にある字幕ボタンを押してcommentを選択&lt;br /&gt;
シークバーを巻き戻して視聴する&lt;br /&gt;
すると左下に秒数カウントがでてきます。&lt;br /&gt;
&lt;br /&gt;
iPadの場合はフルスクリーンにしてからやらないと字幕選択ボタンがでてきません。&lt;br /&gt;
&lt;br /&gt;
端末による動作確認結果：&lt;br /&gt;
iOS7のiphone4S、問題なし。&lt;br /&gt;
Nexus7 android、映像はみれるけど、字幕は選択できず。シークしようとするとこの動画を再生できませんとでてくる。&lt;br /&gt;
&lt;br /&gt;
備考：EXT-X-ENDLISTをいれると強制的に始めからにできるけど、VODではなくライブ用の動作検証なので、今回はあえていれてません。&lt;br /&gt;
&lt;br /&gt;
というわけで#EXT-X-DISCONTINUITYを適当に挿入してやればよかったという落ちでした。&lt;br /&gt;
よかったよかった。&lt;br /&gt;
&lt;br /&gt;








&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://poepoemix.blogspot.com/feeds/1409221098105465292/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://poepoemix.blogspot.com/2013/11/1116.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/1409221098105465292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/1409221098105465292'/><link rel='alternate' type='text/html' href='http://poepoemix.blogspot.com/2013/11/1116.html' title='11/16すべきこと'/><author><name>poepoemix</name><uri>http://www.blogger.com/profile/05463016011577425897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmArlhv0g68lJB1e7v48w7IYddGoy8Cs8CdCdERcrqQs3pFGiA5SsoRZuc5uaBo-74FqMhnS_R34dGfKWD0AIsGj0lZuGflE3qWNLudYZlDPWeoHI4kOYjytiIFIQ6lQ/s220/atsui.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKObQ3LH5sSQ5-tEVFQk90uj90Yeu5bjs9VvMoTQS70N5_ZJbUJNsNGrEUfO0upw70jSeWKzmtmx5CuWw2lOY11HGCuVev91GJ6ksCfBCxmVSTIjwFvwWnrM4c_2MjFkgg3tz6yho9ckg/s72-c/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-11-16+10.49.01.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6573067931953719719.post-6820635877358878275</id><published>2013-11-02T19:41:00.003+09:00</published><updated>2013-11-02T19:41:56.432+09:00</updated><title type='text'>hlsのbyteRangeアクセスが気になったのでちょっとつくってみた。</title><content type='html'>今日書いた記事&lt;br /&gt;
&lt;a href=&quot;http://poepoemix.blogspot.jp/2013/11/hlsmpegts.html&quot;&gt;http://poepoemix.blogspot.jp/2013/11/hlsmpegts.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
これを書いているときに、そういえばbyteRangeアクセスのやつつくったことないなとおもったので、ちょっと作ってみた。&lt;br /&gt;
&lt;br /&gt;
mp4バージョン&lt;br /&gt;
&lt;a href=&quot;http://49.212.39.17/rtype.mp4&quot;&gt;http://49.212.39.17/rtype.mp4&lt;/a&gt;&lt;br /&gt;
hlsバージョン&lt;br /&gt;
&lt;a href=&quot;http://49.212.39.17/rtype.m3u8&quot;&gt;http://49.212.39.17/rtype.m3u8&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
内容は同じです。&lt;br /&gt;
資料によるとiOS5以降なら対応らしいですね。&lt;br /&gt;
&lt;br /&gt;
どうなんだろう・・・ちょっと早いな程度ですかね。&lt;br /&gt;
&lt;br /&gt;
ちなみに作り方。&lt;br /&gt;
１：hls分割をavconvにやらせる。&lt;br /&gt;








&lt;br /&gt;
&lt;div class=&quot;p1&quot;&gt;
$ avconv -i rtype.mp4 -acodec copy -vcodec copy -bsf h264_mp4toannexb -start_number 1 -f hls -hls_time 10 rtype.m3u8&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
２：rtype0.ts、rtype1.ts・・・とデータが326個できたので、全部のdurationとサイズを確認するし、m3u8ファイルを作成する。&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
$ avconv -i rtype0.ts&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
$ ls -l&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
参考：&lt;a href=&quot;https://developer.apple.com/library/ios/technotes/tn2288/_index.html&quot;&gt;https://developer.apple.com/library/ios/technotes/tn2288/_index.html&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
３：分割したファイルを結合する。&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
$ cat rtype0.ts &amp;gt; rtype.ts&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div class=&quot;p1&quot;&gt;
$ cat rtype1.ts &amp;gt;&amp;gt; rtype.ts&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div class=&quot;p1&quot;&gt;
$ cat rtype2.ts &amp;gt;&amp;gt; rtype.ts&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
・・・&lt;/div&gt;
&lt;div&gt;
めんどくさかったので２と３の処理はプログラムを書いてさくっと終わらせました。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
４：適当なサーバーにデータをアップロードすれば出来上がり。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
ではでは&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://poepoemix.blogspot.com/feeds/6820635877358878275/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://poepoemix.blogspot.com/2013/11/hlsbyterange.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/6820635877358878275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/6820635877358878275'/><link rel='alternate' type='text/html' href='http://poepoemix.blogspot.com/2013/11/hlsbyterange.html' title='hlsのbyteRangeアクセスが気になったのでちょっとつくってみた。'/><author><name>poepoemix</name><uri>http://www.blogger.com/profile/05463016011577425897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmArlhv0g68lJB1e7v48w7IYddGoy8Cs8CdCdERcrqQs3pFGiA5SsoRZuc5uaBo-74FqMhnS_R34dGfKWD0AIsGj0lZuGflE3qWNLudYZlDPWeoHI4kOYjytiIFIQ6lQ/s220/atsui.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6573067931953719719.post-8216494855904645840</id><published>2013-11-02T12:56:00.001+09:00</published><updated>2013-11-02T12:56:21.116+09:00</updated><title type='text'>hls用のmpegts作成プログラムが進んだのでメモしておきます。</title><content type='html'>はじめにぶっちゃけて置きますが、最近はffmpegが優秀になっているので、面倒なことしなくてもよかった気がします。&lt;br /&gt;
まぁ、勉強になって楽しかったですが・・・&lt;br /&gt;
&lt;br /&gt;
---- まずは基本 ----&lt;br /&gt;
&lt;br /&gt;
hls(HttpLiveStreaming)がなにか？&lt;br /&gt;
　appleのiPhone等、iOSでバイスで大きめの動画を再生させる場合、もしくはライブ映像を流す場合、httpLiveStreamingという方式を使うのが推奨されてます。&lt;br /&gt;
　一応mp4でも再生は可能なのですがmp4の場合はファイルの先頭部にmoovという再生時の位置情報やキーフレームがどのようにはいっているか等、いろいろな情報がいっきに詰まっています。１時間の動画とかになった場合は、これが大きすぎてダウンロードがうまくいかなかったり、動作しても再生までに時間がかかったりします。&lt;br /&gt;
　hlsを使うとテキストでできた再生用のリストファイルと再生の実体動画がわかれているので、必要な動画データからダウンロードさせることでサクッと動作します。&lt;br /&gt;
　最近では、androidやWiiUにも実装されている規格となります。&lt;br /&gt;
&lt;br /&gt;
利点は？&lt;br /&gt;
　まずhttpのやり取りだけで成立するので、たいていの環境で動作します。&lt;br /&gt;
　サイズの大きいデータの場合は再生まで速いです。&lt;br /&gt;
　ライブ映像も扱うことが可能です。&lt;br /&gt;
　必要に応じて転送サイズを変更することも可能です。&lt;br /&gt;
　iOS6以降の場合はsubtitleを挿入したりすることも可能です。&lt;br /&gt;
欠点は？&lt;br /&gt;
　mpegtsベースなので転送データサイズが増えます。&lt;br /&gt;
　基本動作では、ファイルが大量にできるので、管理が大変です。&lt;br /&gt;
&lt;br /&gt;
どうやって使うの？&lt;br /&gt;
　VODの場合はVLCプレーヤーでコンバートできたはずです。&lt;br /&gt;
　avconvを使う場合は出力タイプをhls、出力ファイル拡張子をm3u8にすれば作成されます。&lt;br /&gt;
例：$ avconv -i mario.flv -acodec copy -vcodec copy -f hls output.m3u8&lt;br /&gt;
として実行した場合、output[n].tsが大量にできて、output.m3u8が生成されます。&lt;br /&gt;
(与太話：最近のプログラムは優秀ですね。以前はrtmpdump + ffmpeg + segmenterとか組み合わせてつくっていました。精度もよくなかった・・・)&lt;br /&gt;
&lt;br /&gt;
---- 続いて変わった使い方 ----&lt;br /&gt;
&lt;br /&gt;
ファイルが大量にできるのはヤダ&lt;br /&gt;
　そういう人向けに1つのmpegtsファイルの部分アクセスを実行することで動作させることも可能になっています。&lt;br /&gt;
0byte〜&lt;br /&gt;
500byte〜&lt;br /&gt;
1000byte〜&lt;br /&gt;
みたいなアクセスを実行します。&lt;br /&gt;
httpの206アクセスが可能なサーバーでかつ、そこそこあたらしいiOS端末の場合は動作可能になります。&lt;br /&gt;
詳しくは仕様をみてください。&lt;br /&gt;
&lt;br /&gt;
ライブを扱いたい&lt;br /&gt;
　ffmpegやavconvはpipelineでデータの入力を受け付けることが可能なので&lt;br /&gt;
rtmpdump -&amp;gt; ffmpegで出力したデータにhttp経由でアクセスする&lt;br /&gt;
みたいなことを実施すればライブ映像を扱うことができます。&lt;br /&gt;
&lt;br /&gt;
回線速度に合わせて映像のクオリティーを前後させたい&lt;br /&gt;
　appleの提供しているsegmentCreatorを使えば確かできるはずです。が、使ったことはありません。&lt;br /&gt;
仕様によると&lt;br /&gt;
・重ねる映像の比率が一致すること(16:9と4:3をまぜるということは不可)&lt;br /&gt;
・音声データは一致すること&lt;br /&gt;
の２点を守ればOKとのことで、実際に作成したところ動作できました。&lt;br /&gt;
切り替えはシームレスで、あ、急に映像が悪くなった・・・というのがわかる感じでした。&lt;br /&gt;
&lt;br /&gt;
subtitleをいれたい。&lt;br /&gt;
　本来はCEA608でしたっけ？mpegtsのデータにclosed captionを織り込む必要があったのですが、日本語は扱えませんでした。&lt;br /&gt;
ところがiOS6から(僕が確認したのはiOS7からですが・・・)webVttのm3u8をつくることで任意の言語のsubtitleを挿入することが可能になった模様です。&lt;br /&gt;
　詳しくはappleのドキュメントをみるか、僕にコンタクトとってください。そんなに難しいものではないです。&lt;br /&gt;
　なお、iphone4Sでデバッグしていますが、ちょっとバグがあるみたいです。&lt;br /&gt;
&lt;br /&gt;
---- 本題 ----&lt;br /&gt;
&lt;br /&gt;
さて、本題ですが最近このmpegtsの動作について研究していました。&lt;br /&gt;
というのもffmpegやavconvで吐くmpegtsデータの音声と映像の吐き方の部分で、いくつかの要件があったためです。&lt;br /&gt;
１：映像と音声の吐き方に関連性がないため、分割したときに、片方のデータが欠如することがあった。&lt;br /&gt;
２：分割したときに先頭に必要なトラック情報がなかったため、トラック情報のデータに当たるまで再生が開始されない問題があった。&lt;br /&gt;
３：nullパケットや無駄に挿入された追加情報があるためそれらのデータを削除したかった。&lt;br /&gt;
&lt;br /&gt;
ちなみにできてからわかったのですが、1,2に関してはavconvにhls出力を実行させると解決したデータが吐き出されることがわかっています。&lt;br /&gt;
&lt;br /&gt;
で、やってみてできたデータがこちらです。&lt;br /&gt;
&lt;a href=&quot;http://49.212.39.17/mario2/index.m3u8&quot;&gt;http://49.212.39.17/mario2/index.m3u8&lt;/a&gt;&lt;br /&gt;
iphoneあたりでみてみると再生できます。&lt;br /&gt;
&lt;br /&gt;
やっていることはデータを受け取ってからトラック情報、映像、音声にデータを分解&lt;br /&gt;
音声データは一番細かいフレームデータ(0.03秒ごと程度)に分解しておく。&lt;br /&gt;
映像のキーフレームからキーフレームの間隔にその間に配布べき音声データを適宜挿入しつつファイルの先頭にだけ、トラック情報をいれるようにしておく。&lt;br /&gt;
&lt;br /&gt;
先頭にトラック情報と必要なキーフレームが必ずくるようになっているので、どこから再生してもスパット動作するという形になります。&lt;br /&gt;
&lt;br /&gt;
---- 苦労した点 ----&lt;br /&gt;
&lt;br /&gt;
mpegtsのフォーマット変換に苦労しました。&lt;br /&gt;
・まずpcrの取り扱いの問題、単にavconvに変換させると同期処理のためかpcrの値がtimestamp値よりちょっと遅れていることがあるみたいです。これを調整するのに苦労しました。&lt;br /&gt;
・bufferの問題。vlcとvlc互換のライブラリをつかっている場合ですが、音声用のpesが大きいと後ろの方のデータを無視するという仕様だかバグだかわからない動作がありました。&lt;br /&gt;
回避策として、中間フレームでも音声データ量が大きくなった場合は、ファイルに書き出すようにしました。&lt;br /&gt;
pesは60kByteほどのデータを持たせることが可能なんですが、4kByte強の粒度で挿入するようにしました。&lt;br /&gt;
なお、ffmpegではこの問題はない模様ですが、出力データの粒度は4kByte強になっているみたいです。&lt;br /&gt;
・pesのデータの取り扱いの資料がなかったので、いくつかパラメーターの意味を誤解していた部分があったところ。&lt;br /&gt;
&lt;br /&gt;
---- で研究してなにしたいの？ ----&lt;br /&gt;
&lt;br /&gt;
まずはプログラムの精度をあげたい点&lt;br /&gt;
・ffmpegのrtmpdumpを利用している場合もしくは、rtmpdumpからpipeしてつかっている場合は、映像配信がunpublishされた場合にプロセスごと止まってしまう点がある件。&lt;br /&gt;
できたら、unpublishしたら待機しておいて、publish再開したときにすぐに動作再開してもらえばいい感じの動作になる。&lt;br /&gt;
・flashのrtmp配信では、soundLevelによる音声欠損や中途でのコーデック切り替えやサイズ切り替えが可能だが、きちんと対応したい。音声欠損は回復するまでコンバートがとまってしまう。映像切り替えはその後ffmpegがエラー吐いて動作しなくなる。&lt;br /&gt;
&lt;br /&gt;
続いてちまたにあふれるmp4のデータをmpegtsで視聴できるようにするproxy servletを書きたい。&lt;br /&gt;
できたら高速アクセスできるようになるはず。&lt;br /&gt;
&lt;br /&gt;
変換の高速化を図りたい。&lt;br /&gt;
・ffmpegで変換していると変換に３秒ほどかかる形になっているが、実は型に合わせるために、待っている時間が存在しているみたいです。実際にxuggleの変換部分だけ抜き出して動作させてやると変換はそこまで時間がかからない。&lt;br /&gt;
よって、自力でmpegts出力ができるようになっておくと高速コンバートが実装できる可能性が高い。&lt;br /&gt;
&lt;br /&gt;
あとは、単なる趣味。&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://poepoemix.blogspot.com/feeds/8216494855904645840/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://poepoemix.blogspot.com/2013/11/hlsmpegts.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/8216494855904645840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/8216494855904645840'/><link rel='alternate' type='text/html' href='http://poepoemix.blogspot.com/2013/11/hlsmpegts.html' title='hls用のmpegts作成プログラムが進んだのでメモしておきます。'/><author><name>poepoemix</name><uri>http://www.blogger.com/profile/05463016011577425897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmArlhv0g68lJB1e7v48w7IYddGoy8Cs8CdCdERcrqQs3pFGiA5SsoRZuc5uaBo-74FqMhnS_R34dGfKWD0AIsGj0lZuGflE3qWNLudYZlDPWeoHI4kOYjytiIFIQ6lQ/s220/atsui.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6573067931953719719.post-3603979994577845481</id><published>2013-09-20T19:14:00.000+09:00</published><updated>2013-09-20T19:14:05.851+09:00</updated><title type='text'>メディアデータの高速変換に挑戦してみたい。</title><content type='html'>この記事は今週末ちょっとやってみようと思っていることへの先駆けです。&lt;br /&gt;
ブログを書いた時点ではきっちりした検証はしていませんことを先に書かせていただきます。&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://github.com/taktod/myLib/blob/217bc0acb2d5165f4c0941d7dfd2534526156b0f/myLib.xuggle.flv/src/test/java/com/ttProject/xuggle/flv/test/MultiCoderTest.java&quot;&gt;https://github.com/taktod/myLib/blob/217bc0acb2d5165f4c0941d7dfd2534526156b0f/myLib.xuggle.flv/src/test/java/com/ttProject/xuggle/flv/test/MultiCoderTest.java&lt;/a&gt;&lt;br /&gt;
こちらのプログラムのh263avcMultiThreadTest2の動作・・・&lt;br /&gt;
実行すると５秒だけ、h263のflvとavcのflvを並行して作成します。&lt;br /&gt;
できるデータは黒字に白で時間が表示されるflvになります。&lt;br /&gt;
&lt;br /&gt;
実際に実行してみると、avcの方だけわずかに短いデータになります。&lt;br /&gt;
&lt;br /&gt;
内部処理でsleep値を5にしてありますが、始めは100にしていました。&lt;br /&gt;
100にするとavcの方だけめちゃくちゃ短いデータになります。(２秒くらい？)&lt;br /&gt;
&lt;br /&gt;
このことから推測するに、どうやらavcの変換でははじめにフレームが大量に送られてこないと変換が始まらない可能性があります。&lt;br /&gt;
&lt;br /&gt;
さて、100ミリ秒に設定してあったということは、10fps程度のデータを流し込んでいたことになります。&lt;br /&gt;
5ミリ秒に設定したということは(たぶん実際はそこまで速度でていないはずですが・・・) 200fpsでていたことになります。&lt;br /&gt;
&lt;br /&gt;
10fpsを素直に変換すると3秒ほど遅延する。&lt;br /&gt;
200fpsを変換するとほぼ遅延しない。&lt;br /&gt;
&lt;br /&gt;
さて、会社でやっているhttpLiveStreamingへの変換ですが、入力flvと出力mpegtsのtimestampを比較するとおおよそ2秒〜3秒遅延します。&lt;br /&gt;
rtmpのfpsですが、最高で15fps程度と・・・&lt;br /&gt;
ん？どこかで聞いたことあるような遅延秒数ですね。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
というわけで、もしかするとh264(avc)への変換ですが、入力ソースが仮に10fpsだとしても、パケットをねつ造して(同じ画像を重ねがけして)100fpsとしてコンバートに回してやればもしかしたら変換遅延を0に近づけることが可能なのではないでしょうか？&lt;br /&gt;
&lt;br /&gt;
まぁ、そんなことするとCPUが異常に必要になったり変換が崩れたりするかもしれませんが、ちょっと週末時間があるときに試したいな・・・と思う次第です。&lt;br /&gt;
&lt;br /&gt;
つくったら誰か買ってくれないかなぁ。&lt;br /&gt;
ではでは〜&lt;br /&gt;
&lt;br /&gt;








</content><link rel='replies' type='application/atom+xml' href='http://poepoemix.blogspot.com/feeds/3603979994577845481/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://poepoemix.blogspot.com/2013/09/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/3603979994577845481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/3603979994577845481'/><link rel='alternate' type='text/html' href='http://poepoemix.blogspot.com/2013/09/blog-post.html' title='メディアデータの高速変換に挑戦してみたい。'/><author><name>poepoemix</name><uri>http://www.blogger.com/profile/05463016011577425897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmArlhv0g68lJB1e7v48w7IYddGoy8Cs8CdCdERcrqQs3pFGiA5SsoRZuc5uaBo-74FqMhnS_R34dGfKWD0AIsGj0lZuGflE3qWNLudYZlDPWeoHI4kOYjytiIFIQ6lQ/s220/atsui.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6573067931953719719.post-4640723614986836794</id><published>2013-09-13T19:36:00.001+09:00</published><updated>2013-09-13T19:36:17.202+09:00</updated><title type='text'>mavenのxuggleについて</title><content type='html'>xuggleというライブラリがあります。&lt;br /&gt;
javaでのffmpegを扱うためのライブラリです。&lt;br /&gt;
xuggleそのものは２、３年前から知っていて、僕が借りているsakuraのvpsにもxuggleをソースコードからインストールしてつかっていたりしてます。&lt;br /&gt;
&lt;br /&gt;
このxuggle、インストールするのが非常に厄介なので配信ツールみたいな一般のユーザーに配るプログラムには向いていないなぁと思っていたのですが、なんと、mavenで公開されているjarファイルには、JNIで読み込むライブラリが同梱されています。(40MByteほどサイズあるけど)&lt;br /&gt;
&lt;br /&gt;
しかも同梱されているライブラリはwindows用、mac用、linux用と３つきちんと入っています。(40MByteほどサイズあるけど)&lt;br /&gt;
&lt;br /&gt;
一応、iMac、windowsXP、CentOSで動作することを確認してあります。&lt;br /&gt;
&lt;br /&gt;
ちなみに同梱されているライブラリはGPLバージョンでh264やmp3、aacも扱うことが可能みたいです。&lt;br /&gt;
&lt;br /&gt;
変換用のライブラリがわざわざコンパイルしなくても利用できるのは非常にありがたいことですね。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ついでにいうと、変換プログラムを動作させるのにシステムライブラリを汚さないところもGoodだとおもいます。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
惜しいところはどうもxuggleは最近下火になっているんですよね。&lt;br /&gt;
&lt;br /&gt;
では、今日もはりきってプログラムしていこう。</content><link rel='replies' type='application/atom+xml' href='http://poepoemix.blogspot.com/feeds/4640723614986836794/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://poepoemix.blogspot.com/2013/09/mavenxuggle.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/4640723614986836794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/4640723614986836794'/><link rel='alternate' type='text/html' href='http://poepoemix.blogspot.com/2013/09/mavenxuggle.html' title='mavenのxuggleについて'/><author><name>poepoemix</name><uri>http://www.blogger.com/profile/05463016011577425897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmArlhv0g68lJB1e7v48w7IYddGoy8Cs8CdCdERcrqQs3pFGiA5SsoRZuc5uaBo-74FqMhnS_R34dGfKWD0AIsGj0lZuGflE3qWNLudYZlDPWeoHI4kOYjytiIFIQ6lQ/s220/atsui.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6573067931953719719.post-1781227338895215571</id><published>2013-07-31T19:23:00.000+09:00</published><updated>2013-07-31T19:23:19.801+09:00</updated><title type='text'>h264についてメモ書き</title><content type='html'>正しくない可能性がありますので、h.264について知る上での手がかり程度にしてください。&lt;br /&gt;
&lt;br /&gt;
■構造について&lt;br /&gt;
まずはnal構造&lt;br /&gt;
nal構造というのは、次のような形になっています。&lt;br /&gt;
00 00 01 [h264のフレームデータ] 00 00 01 [h264の別のデータ]・・・&lt;br /&gt;
mpegtsの中身とかはコレになっています。&lt;br /&gt;
&lt;br /&gt;
その他の構造もあります。&lt;br /&gt;
[4バイトでフレームデータサイズ] [h264のフレームデータ][4バイトのサイズ][h264...]・・・&lt;br /&gt;
flvやmp4はこちら側になっているみたいです。&lt;br /&gt;
&lt;br /&gt;
その他の構造があるってことを知っておかないと混乱します。&lt;br /&gt;
&lt;br /&gt;
■フレームデータについて&lt;br /&gt;
とりあえず１バイト目をみれば、どういうデータであるか知ることができます。&lt;br /&gt;
bitにすると&lt;br /&gt;
ABBC CCCC&lt;br /&gt;
という形になっていて&lt;br /&gt;
Aは0固定&lt;br /&gt;
Bは数値が大きいほど変換に必要なデータ、0の場合はなくてもいいデータ&lt;br /&gt;
Cの部分はフレームタイプになっています。&lt;br /&gt;
↓ボクのプログラムでつかっている定義はこんな感じ&lt;br /&gt;
&lt;a href=&quot;https://github.com/taktod/myLib/blob/master/myLib.media.h264/src/main/java/com/ttProject/media/h264/Type.java&quot;&gt;https://github.com/taktod/myLib/blob/master/myLib.media.h264/src/main/java/com/ttProject/media/h264/Type.java&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
とりあえず、以下のデータを押さえてあります。&lt;br /&gt;
0x01:slice いわゆるinnerFrame、High Profileのファイルをみたら、優先度が0になっているデータがあってびっくりした。&lt;br /&gt;
0x05:sliceIDR いわゆるkeyFrame&lt;br /&gt;
0x07:sequenceParameterSet 略すとsps&lt;br /&gt;
0x08:pictureParameterSet 略すとpps spsとppsを合わせたデータがflvではmediaSequenceHeaderとなっています。mp4ならavcCのタグの中身がこの２つ合わせた物になっている。&lt;br /&gt;
0x09:accessUnitDelimiter 単なる区切りです。もちろん優先度は0&lt;br /&gt;
&lt;br /&gt;
とりあえずこんなことになっているらしいです。</content><link rel='replies' type='application/atom+xml' href='http://poepoemix.blogspot.com/feeds/1781227338895215571/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://poepoemix.blogspot.com/2013/07/h264.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/1781227338895215571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/1781227338895215571'/><link rel='alternate' type='text/html' href='http://poepoemix.blogspot.com/2013/07/h264.html' title='h264についてメモ書き'/><author><name>poepoemix</name><uri>http://www.blogger.com/profile/05463016011577425897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmArlhv0g68lJB1e7v48w7IYddGoy8Cs8CdCdERcrqQs3pFGiA5SsoRZuc5uaBo-74FqMhnS_R34dGfKWD0AIsGj0lZuGflE3qWNLudYZlDPWeoHI4kOYjytiIFIQ6lQ/s220/atsui.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6573067931953719719.post-4412828459222037695</id><published>2013-06-25T21:55:00.001+09:00</published><updated>2013-06-25T21:55:17.683+09:00</updated><title type='text'>matroskaを理解していく。</title><content type='html'>webmのストリーミングをつくっておきたいので、とりあえずコンテナであるmatroskaを理解していくことにしています。&lt;br /&gt;
&lt;br /&gt;
で、とりあえず、lacingというのがわかりにくかった。&lt;br /&gt;
&lt;br /&gt;
matroskaでは、EBMLに従ったデータを扱うことで、容量を節約しています。&lt;br /&gt;
&lt;a href=&quot;http://matroska.org/technical/specs/index.html#EBML_ex&quot;&gt;http://matroska.org/technical/specs/index.html#EBML_ex&lt;/a&gt;&lt;br /&gt;
データを表現するときに、始めのビットがでてくる部分で、データ長がきまるみたいな感じです。&lt;br /&gt;
たとえば、5を表現する場合はビットにすると&lt;br /&gt;
0000 0101&lt;br /&gt;
１バイトで表現できるので、始めのビットを初っ端にいれてやって&lt;br /&gt;
1000 0101→16進数にすると0x85となります。&lt;br /&gt;
800を表現する場合、ビットにすると&lt;br /&gt;
0000 0011 0010 0000となります。&lt;br /&gt;
2ビット必要になるので・・・&lt;br /&gt;
0100 0011 0010 0000→16進数で0x4320となります。&lt;br /&gt;
&lt;br /&gt;
matroskaでは、各データはmp4みたいにelementという単位で取り扱いします。&lt;br /&gt;
&lt;a href=&quot;http://matroska.org/technical/specs/index.html#LevelEBML&quot;&gt;http://matroska.org/technical/specs/index.html#LevelEBML&lt;/a&gt;&lt;br /&gt;
[タグ][データの長さ][データ]という構成でできています。&lt;br /&gt;
タグはEBMLでつくられたデータで1バイト〜4バイトでできています。&lt;br /&gt;
データの長さは、1バイト〜8バイトでできているEBMLで表現した数値になっています。&lt;br /&gt;
データの部分は各タグ次第という感じです。&lt;br /&gt;
とりあえずCodecPrivateの中にFlvでいうところのMediaSequenceHeaderのデータがあったこと。&lt;br /&gt;
BlockもしくはSimpleBlockの中に各データが入っていること。&lt;br /&gt;
Seek関連の部分が、Segmentの中の各要素の位置情報がはいっていることを確認してあります。&lt;br /&gt;
&lt;br /&gt;
で、問題の中身で注意しないといけなさそうなのは・・・&lt;br /&gt;
１：Seek関連のSeekPositionのデータの中身ですが、数値でSegment領域の内容データの先頭からの相対位置で格納されているみたいです。&lt;br /&gt;
[タグ][サイズ][データ....]のデータの始まりの位置からの相対位置です。&lt;br /&gt;
&lt;br /&gt;
２：BlockとSimpleBlockにあるLaceについて&lt;br /&gt;
&lt;a href=&quot;http://matroska.org/technical/specs/index.html#lacing&quot;&gt;http://matroska.org/technical/specs/index.html#lacing&lt;/a&gt;&lt;br /&gt;
読んでもはじめなんのこっちゃわかりませんでした。&lt;br /&gt;
とりあえずサンプルデータ&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgygBkpILd5GCMMjY1-w5SqwzaMxnyLyib-UdYKZgOLkc0utw128DhVQ9z1hVPzJmntcx-l3wcGyBdNyyXPhzB0llLGQBAKF302nuOL3ZBGNJiHmSyPJkohR087bOWNIq9pT5btS14moO4/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-06-25+21.08.55.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;350&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgygBkpILd5GCMMjY1-w5SqwzaMxnyLyib-UdYKZgOLkc0utw128DhVQ9z1hVPzJmntcx-l3wcGyBdNyyXPhzB0llLGQBAKF302nuOL3ZBGNJiHmSyPJkohR087bOWNIq9pT5btS14moO4/s400/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-06-25+21.08.55.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
これはmp3を格納しているblockのデータです。&lt;br /&gt;
まずlacingというのは、ブロックにいれるにしては、データが細かすぎて何度もブロックをつくるのはもったいないというときに利用します。&lt;br /&gt;
１つのブロックの中に複数のデータがはいっているという状況を作り出します。&lt;br /&gt;
&lt;br /&gt;
　まずタグの部分、先頭の0xA1がそうです。これはBlockの方です。&lt;br /&gt;
　続く0x4ADAの部分がデータサイズになります。EBMLの数値なので0x0ADAになります。&lt;br /&gt;
　続く0x82がトラックIDを示しています。これもEBMLの数値なので0x02になります。&lt;br /&gt;
このデータでは、Track:0x01がh.264の映像データ Track:0x02がmp3の音声データになっています。&lt;br /&gt;
　続く２バイトがこのブロックのtimestamp情報になります。このBlockが含まれているClusterのtimecodeからの差分として、記録されています。&lt;br /&gt;
0x0000になっているので、timestampは0になります。この数値はEBMLではないです。&lt;br /&gt;
　続く0x06の部分が、各種フラグになっています。0x06は0000 0110となりこのBlockがEBMLLacingを利用していることがわかります。&lt;br /&gt;
　次の0x07の部分がこのブロックが保持しているlacingされているデータの数-1になっています。この数値はEBMLではないみたいです。&lt;br /&gt;
7なので、MP3のデータが8個はいっていることになります。&lt;br /&gt;
　この後の数値7つ(EBML表記)が各lacingされているデータのサイズになっています。&lt;br /&gt;
　このサンプルの場合は&lt;br /&gt;
0x41A1　　0x01A1&lt;br /&gt;
0x5F97　　0x1F97&lt;br /&gt;
0xBF　　0x3F&lt;br /&gt;
0xF3　　0x73&lt;br /&gt;
0x8B　　0x0B&lt;br /&gt;
0xF3　　0x73&lt;br /&gt;
0x8B　　0x0B&lt;br /&gt;
となっています。&lt;br /&gt;
この数値ですが、どうやら始めのデータは単にデータ量なんですが、その後のデータは前のデータとの差分量になっているみたいです。&lt;br /&gt;
で、その差分量の計算方法が結構ややこしいです。&lt;br /&gt;
&lt;br /&gt;
　まず先頭の0x41A1ですが、EBMLの数値にしたがって、0x01A1が始めのデータになります。&lt;br /&gt;
　以降のデータですが、各バイトの中間値を０とする数値になるみたいです。&lt;br /&gt;
0x5F97に対応する数値は0x1F97&lt;br /&gt;
2バイトのデータは0x0000〜0x3FFFですが、中間値は0x1FFFになります。&lt;br /&gt;
0x1F97 - 0x1FFF = -0x68が差分になります。&lt;br /&gt;
よって0x01A1 - 0x68を計算してやって0x139が次のデータ量になります。&lt;br /&gt;
　次のデータは0xBF・・・EBMLを解除すると0x3F&lt;br /&gt;
１バイトのデータは0x00 〜 0x7Fで中間値は0x3Fになります。&lt;br /&gt;
0x3F - 0x3F = 0x00これが差分になるため、0x139が次のデータ量になります。&lt;br /&gt;
　続くデータは0xF3(0x73)、先ほどと同じく中間値は0x3Fなので&lt;br /&gt;
0x73 - 0x3F = +0x34&lt;br /&gt;
よって0x139 + 0x34 = 0x16Dがデータ量になります。&lt;br /&gt;
こうして計算していくと&lt;br /&gt;
0x01A1&lt;br /&gt;
0x0139&lt;br /&gt;
0x0139&lt;br /&gt;
0x016D&lt;br /&gt;
&lt;div&gt;
0x0139&lt;br /&gt;
0x016D&lt;/div&gt;
&lt;div&gt;
0x0139&lt;br /&gt;
最後の８個目のデータはこのブロックの残りデータすべてとなります。&lt;br /&gt;
0x016D&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
という風に計算して導きだすことができます。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
本来はここまでしなくても、単にffmpegにデータを出力させてwebmのストリーミングするだけならできるのですが・・・&lt;/div&gt;
&lt;div&gt;
解析に利用しているrtypeDeltaの動画がちょっと壊れているらしく、その原因を知りたいなとおもっているため、回り道しています。(また、可能だったら正しいデータに復元してやって、他のところで利用したいと思っています。)&lt;/div&gt;
&lt;div&gt;
ちなみに解析に利用しているデータはこちらのr-typeDeltaの動画です。(再生は可能ですが、30分あたりで止まるっぽいです。続きにシークすれば、続きの再生も可能です。&lt;/div&gt;
&lt;div&gt;
matroskaのデータが壊れているのは確認済みです。)&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://www.longplays.org/downloads.php?cat_id=21&amp;amp;download_id=312&quot;&gt;http://www.longplays.org/downloads.php?cat_id=21&amp;amp;download_id=312&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
では、また〜&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://poepoemix.blogspot.com/feeds/4412828459222037695/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://poepoemix.blogspot.com/2013/06/matroska.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/4412828459222037695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/4412828459222037695'/><link rel='alternate' type='text/html' href='http://poepoemix.blogspot.com/2013/06/matroska.html' title='matroskaを理解していく。'/><author><name>poepoemix</name><uri>http://www.blogger.com/profile/05463016011577425897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmArlhv0g68lJB1e7v48w7IYddGoy8Cs8CdCdERcrqQs3pFGiA5SsoRZuc5uaBo-74FqMhnS_R34dGfKWD0AIsGj0lZuGflE3qWNLudYZlDPWeoHI4kOYjytiIFIQ6lQ/s220/atsui.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgygBkpILd5GCMMjY1-w5SqwzaMxnyLyib-UdYKZgOLkc0utw128DhVQ9z1hVPzJmntcx-l3wcGyBdNyyXPhzB0llLGQBAKF302nuOL3ZBGNJiHmSyPJkohR087bOWNIq9pT5btS14moO4/s72-c/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-06-25+21.08.55.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6573067931953719719.post-2487934593616175507</id><published>2013-06-02T19:06:00.000+09:00</published><updated>2013-06-02T19:06:08.527+09:00</updated><title type='text'>audioPlayerで使っているmp4の話　その５</title><content type='html'>いろいろ作業してとうとうこうなりました。&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhELP4oJ65SI-VeKZN40Ot2fxBhzw69bfAswbpCdE4CS7zIRJkvlUNZthCGf82hR9NV7gfOAUdOpngGWuhq1h54921H5N-rOkv3Ujc_PkXTaxYfDuvGF7Q4MldOwEGusq3uUIf17uyI9VE/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2013-06-02+18.33.07.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;228&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhELP4oJ65SI-VeKZN40Ot2fxBhzw69bfAswbpCdE4CS7zIRJkvlUNZthCGf82hR9NV7gfOAUdOpngGWuhq1h54921H5N-rOkv3Ujc_PkXTaxYfDuvGF7Q4MldOwEGusq3uUIf17uyI9VE/s400/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2013-06-02+18.33.07.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
flowplayerによるflashのデモとhtml5によるデモ&lt;br /&gt;
合計４つあります。&lt;br /&gt;
&lt;br /&gt;
flashの動作はお約束の読み込んでいないデータの部分でもシークできます。&lt;br /&gt;
&lt;br /&gt;
やり方&lt;br /&gt;
１： java1.6以降とmaven3を入手する&lt;br /&gt;
２：myLibを入手する。&lt;br /&gt;
&lt;a href=&quot;https://github.com/taktod/myLib&quot;&gt;https://github.com/taktod/myLib&lt;/a&gt;&lt;br /&gt;
$ git clone git://github.com/taktod/myLib.git&lt;br /&gt;
$ cd myLib&lt;br /&gt;
$ mvn installでOK&lt;br /&gt;
３：mediaMp4を入手する。&lt;br /&gt;
&lt;a href=&quot;https://github.com/taktod/mediaMp4&quot;&gt;https://github.com/taktod/mediaMp4&lt;/a&gt;&lt;br /&gt;
$ git clone git://github.com/taktod/mediaMp4.git&lt;br /&gt;
$ cd mediaMp4&lt;br /&gt;
$ mvn jetty:run&lt;br /&gt;
４：chromeあたりでアクセスする。&lt;br /&gt;
http://localhost:8080/index.jsp&lt;br /&gt;
&lt;br /&gt;
で上記のサイトにアクセスできると思います。ちなみに上記のスナップショットは都合上少々htmlをいじってあります。&lt;br /&gt;
&lt;br /&gt;
で、やってみた感想ですが応答が遅いです。&lt;br /&gt;
だいたい平均して1秒くらい？&lt;br /&gt;
たまにfileの読み込みに問題がでて、5秒とかかかるときがあるみたいです。&lt;br /&gt;
個人的には実践で利用するには、0.1秒くらいの応答にしたいです。(シークがどこであってもそうしたい。)&lt;br /&gt;
どうもネックになっているのが、ローカルファイル上にcacheしているデータっぽいので、これをcacheシステム(ehcacheか？)あたりに移設したり、前から順にシークしていって問題の場所を見つけている部分もあるので、その処理の高速化をやればまだなんとかできそうです。&lt;br /&gt;
同じことはmp4の動作にもいえそうですね。&lt;br /&gt;
&lt;br /&gt;
なお、応答ができるようになったあとは、DLしながら動作するだけなので、そこは適当にDL待ちがおきない程度の動作でうごけばいいと思っています。&lt;br /&gt;
&lt;br /&gt;
応答がだいたい0.1秒くらいでできるようになったら、どこかの人導入しませんか？</content><link rel='replies' type='application/atom+xml' href='http://poepoemix.blogspot.com/feeds/2487934593616175507/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://poepoemix.blogspot.com/2013/06/audioplayermp4.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/2487934593616175507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/2487934593616175507'/><link rel='alternate' type='text/html' href='http://poepoemix.blogspot.com/2013/06/audioplayermp4.html' title='audioPlayerで使っているmp4の話　その５'/><author><name>poepoemix</name><uri>http://www.blogger.com/profile/05463016011577425897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmArlhv0g68lJB1e7v48w7IYddGoy8Cs8CdCdERcrqQs3pFGiA5SsoRZuc5uaBo-74FqMhnS_R34dGfKWD0AIsGj0lZuGflE3qWNLudYZlDPWeoHI4kOYjytiIFIQ6lQ/s220/atsui.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhELP4oJ65SI-VeKZN40Ot2fxBhzw69bfAswbpCdE4CS7zIRJkvlUNZthCGf82hR9NV7gfOAUdOpngGWuhq1h54921H5N-rOkv3Ujc_PkXTaxYfDuvGF7Q4MldOwEGusq3uUIf17uyI9VE/s72-c/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2013-06-02+18.33.07.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6573067931953719719.post-8717211026872163064</id><published>2013-05-30T16:44:00.000+09:00</published><updated>2013-05-30T16:44:46.960+09:00</updated><title type='text'>audioPlayerでつかっているmp4の話　その４</title><content type='html'>&lt;a href=&quot;http://poepoemix.blogspot.jp/2013/05/audioplayermp4_14.html&quot;&gt;前回&lt;/a&gt;の続きです。&lt;br /&gt;
&lt;br /&gt;
前回のしめくくりでflvで応答するバージョン、その音声onlyとmpegtsによるhttpLiveStreamingの応答を作りたいとして締めくくりましたが、１つめのflvで応答するバージョンがとりあえずできました。&lt;br /&gt;
&lt;br /&gt;
ソースコードは以下の２つです。&lt;br /&gt;
&lt;a href=&quot;https://github.com/taktod/myLib&quot;&gt;https://github.com/taktod/myLib&lt;/a&gt;&amp;nbsp;(ライブラリ補助)&lt;br /&gt;
&lt;a href=&quot;https://github.com/taktod/mediaMp4&quot;&gt;https://github.com/taktod/mediaMp4&lt;/a&gt;&amp;nbsp;(mp4用のサーブレットあれこれ)&lt;br /&gt;
&lt;br /&gt;
使いかたはmyLibをcloneしてきて&lt;br /&gt;
$ mvn installでmavenのローカルリポジトリに登録&lt;br /&gt;
mediaMp4をcloneしてきて&lt;br /&gt;
$ mvn jetty:run&lt;br /&gt;
でサーバーが立ち上がるので&lt;br /&gt;
http://localhost:8080/test.flvでアクセスすればflvファイルとしてhttp://49.212.39.17/mario.mp4のファイルにアクセスできます。&lt;br /&gt;
&lt;br /&gt;
やっていることは次のとおり。&lt;br /&gt;
mp4のデータ参照用タグを一時ファイルにコピーします。&lt;br /&gt;
あとは映像や音声のフレームを読み込みつつ、flvのデータとして応答を返すだけです。&lt;br /&gt;
&lt;br /&gt;
うーん。文字列にするとすこぶる簡単なことをやっているように見えますね。&lt;br /&gt;
&lt;br /&gt;
いまのところmp4の応答とは違い、httpのレスポンスヘッダをきちんとつくっていません。また、206の一部だけ応答する動作にも対応させていません。&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://poepoemix.blogspot.com/feeds/8717211026872163064/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://poepoemix.blogspot.com/2013/05/audioplayermp4_30.html#comment-form' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/8717211026872163064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/8717211026872163064'/><link rel='alternate' type='text/html' href='http://poepoemix.blogspot.com/2013/05/audioplayermp4_30.html' title='audioPlayerでつかっているmp4の話　その４'/><author><name>poepoemix</name><uri>http://www.blogger.com/profile/05463016011577425897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmArlhv0g68lJB1e7v48w7IYddGoy8Cs8CdCdERcrqQs3pFGiA5SsoRZuc5uaBo-74FqMhnS_R34dGfKWD0AIsGj0lZuGflE3qWNLudYZlDPWeoHI4kOYjytiIFIQ6lQ/s220/atsui.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6573067931953719719.post-6070175844011453660</id><published>2013-05-14T21:34:00.003+09:00</published><updated>2013-05-14T21:34:47.596+09:00</updated><title type='text'>audioPlayerでつかっているmp4の話　その３</title><content type='html'>&lt;a href=&quot;http://poepoemix.blogspot.jp/2013/05/audioplayermp4.html&quot;&gt;前の記事の続きです。&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
ここ数日、myLibのリポジトリを複数のモジュールプロジェクトに分割する作業とversion4の動作を作成してました。&lt;br /&gt;
複数に分割した理由は、必要なプログラムのみつまみ食いするためです。&lt;br /&gt;
今回myLibのプログラムには&lt;br /&gt;
FileRead用のchannel動作&lt;br /&gt;
&lt;a href=&quot;https://github.com/taktod/myLib/tree/master/myLib.channels&quot;&gt;https://github.com/taktod/myLib/tree/master/myLib.channels&lt;/a&gt;&lt;br /&gt;
プログラム作成補助のutil動作&lt;br /&gt;
&lt;a href=&quot;https://github.com/taktod/myLib/tree/master/myLib.util&quot;&gt;https://github.com/taktod/myLib/tree/master/myLib.util&lt;/a&gt;&lt;br /&gt;
mp4解析補助&lt;br /&gt;
&lt;a href=&quot;https://github.com/taktod/myLib/tree/master/myLib.mp4&quot;&gt;https://github.com/taktod/myLib/tree/master/myLib.mp4&lt;/a&gt;&lt;br /&gt;
flv解析補助&lt;br /&gt;
&lt;a href=&quot;https://github.com/taktod/myLib/tree/master/myLib.flv&quot;&gt;https://github.com/taktod/myLib/tree/master/myLib.flv&lt;/a&gt;&lt;br /&gt;
の４つのプログラムをとりあえずいれてありますが、&lt;br /&gt;
mediaMp4の現在までの動作では、flvは必要ないです。&lt;br /&gt;
&lt;br /&gt;
なので分割しているmyLib.channels myLib.util myLib.mp4だけ取り込んでます。&lt;br /&gt;
まぁ、flvにコンバートしてDLさせるversion5の動作をつくったらflvも必須になりますけど・・・&lt;br /&gt;
&lt;br /&gt;
さて、今回の更新の目玉は映像取り除きservlet proxyです。&lt;br /&gt;
&lt;a href=&quot;https://github.com/taktod/myLib/&quot;&gt;myLib&lt;/a&gt;と&lt;a href=&quot;https://github.com/taktod/mediaMp4/&quot;&gt;mediaMp4&lt;/a&gt;を入手してservletを立ち上げるとボクのsakuraのvpsにアップロードしてある。http://49.212.39.17/mario.mp4のデータをベースにデモ動作します。&lt;br /&gt;
&lt;br /&gt;
まずは基本の動作&lt;br /&gt;
元データへのアクセスversion1&lt;br /&gt;
http://49.212.39.17/mario.mp4&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDsTt471GqNZvDmnlOKafXYA5k5pi5sfqpJJC5yhyphenhyphen9D4N2wf9-rxrwLrwVpmOFR-uWMcLlNzeUqt8yWPf_CBTvO14MmXAMw-Qzzhdy77uiC272B9qXbFzI_ONqIDJIC35AwqOpFwYJ_S8/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2013-05-14+21.21.45.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDsTt471GqNZvDmnlOKafXYA5k5pi5sfqpJJC5yhyphenhyphen9D4N2wf9-rxrwLrwVpmOFR-uWMcLlNzeUqt8yWPf_CBTvO14MmXAMw-Qzzhdy77uiC272B9qXbFzI_ONqIDJIC35AwqOpFwYJ_S8/s400/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2013-05-14+21.21.45.png&quot; width=&quot;391&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
続いてproxy経由のアクセスversion2(データはそのまま)&lt;br /&gt;
http://localhost:8080/test.mp4&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgudnFYb4jODrIHy0oZCp4U0V-55VDUgubkNdrLd_6-1Djm8dC-Q-UIwOVAvvrnsMB3gk9ZXwEYU27nc9S58LQb4PU2loSvAX1HvwRy2oc_CU9POVmkEooYUDWQcsTAoNH-RI94WpVleeU/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2013-05-14+21.19.43.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgudnFYb4jODrIHy0oZCp4U0V-55VDUgubkNdrLd_6-1Djm8dC-Q-UIwOVAvvrnsMB3gk9ZXwEYU27nc9S58LQb4PU2loSvAX1HvwRy2oc_CU9POVmkEooYUDWQcsTAoNH-RI94WpVleeU/s400/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2013-05-14+21.19.43.png&quot; width=&quot;362&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
さらに映像タグ無効化version3&lt;br /&gt;
http://localhost:8080/test.m4&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiU1kVcfIRhu2SopBf4xwI2DYf6ChLOt2Q24phj9T2Sdzu7i26xFC_gjOS6xUQxpR-Ws3t13WeWwcZHm2fUIL61YY07Dw9db2zbVkgo7cnRdE8aFoNJSb50F2C7CJ2d7CE1SN4hrUhvXq0/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2013-05-14+21.20.13.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiU1kVcfIRhu2SopBf4xwI2DYf6ChLOt2Q24phj9T2Sdzu7i26xFC_gjOS6xUQxpR-Ws3t13WeWwcZHm2fUIL61YY07Dw9db2zbVkgo7cnRdE8aFoNJSb50F2C7CJ2d7CE1SN4hrUhvXq0/s400/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2013-05-14+21.20.13.png&quot; width=&quot;370&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
今回公開した映像タグ削除version4&lt;br /&gt;
http://localhost:8080/test.m4a&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYryvOQsWj2-BIj51-tU-I_q4BNYnN4nnncWOw3mqiLdLoRYYu9_Hr1LjQRWS_h_DjR1WWybXDIco2BI6CzfVf4O5bhIRXN4ogXDXdroT1R9PTzA1Tq3tmwKWaaXgoJ9BObPhux644rvE/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2013-05-14+21.20.36.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;385&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYryvOQsWj2-BIj51-tU-I_q4BNYnN4nnncWOw3mqiLdLoRYYu9_Hr1LjQRWS_h_DjR1WWybXDIco2BI6CzfVf4O5bhIRXN4ogXDXdroT1R9PTzA1Tq3tmwKWaaXgoJ9BObPhux644rvE/s400/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2013-05-14+21.20.36.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
特筆すべきところはversion4のダウンロードサイズです。&lt;br /&gt;
映像の部分をきれいに落としてあるので、元データは14.2MBなんですがproxy経由のDLサイズはたった1.7MB&lt;br /&gt;
これが現状のaudioPlayerで利用しているプログラムとほぼ同等のプログラムになります。&lt;br /&gt;
(現状利用しているプログラムよりさらによい動作になっています。)&lt;br /&gt;
&lt;br /&gt;
あと作りたいのは&lt;br /&gt;
version5 flvとして応答する&lt;br /&gt;
version6 flvとして応答する(音声のみバージョン)&lt;br /&gt;
とmpegtsとしてHttpLiveStreamingで応答する&lt;br /&gt;
の３バージョンつくりたいですね。バージョン５は汎用性がかなり高いはずなのでがんばってつくりたいところです。&lt;br /&gt;
&lt;br /&gt;
ではでは〜&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://poepoemix.blogspot.com/feeds/6070175844011453660/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://poepoemix.blogspot.com/2013/05/audioplayermp4_14.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/6070175844011453660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/6070175844011453660'/><link rel='alternate' type='text/html' href='http://poepoemix.blogspot.com/2013/05/audioplayermp4_14.html' title='audioPlayerでつかっているmp4の話　その３'/><author><name>poepoemix</name><uri>http://www.blogger.com/profile/05463016011577425897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmArlhv0g68lJB1e7v48w7IYddGoy8Cs8CdCdERcrqQs3pFGiA5SsoRZuc5uaBo-74FqMhnS_R34dGfKWD0AIsGj0lZuGflE3qWNLudYZlDPWeoHI4kOYjytiIFIQ6lQ/s220/atsui.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDsTt471GqNZvDmnlOKafXYA5k5pi5sfqpJJC5yhyphenhyphen9D4N2wf9-rxrwLrwVpmOFR-uWMcLlNzeUqt8yWPf_CBTvO14MmXAMw-Qzzhdy77uiC272B9qXbFzI_ONqIDJIC35AwqOpFwYJ_S8/s72-c/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2013-05-14+21.21.45.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6573067931953719719.post-4197291967275081464</id><published>2013-05-04T10:48:00.002+09:00</published><updated>2013-05-04T10:48:22.101+09:00</updated><title type='text'>audioPlayerでつかっているmp4の話　その２</title><content type='html'>mp4のコンテナをいじりまわす。&lt;br /&gt;
&lt;a href=&quot;http://poepoemix.blogspot.jp/2013/04/audioplayermp4.html&quot;&gt;こちらの話の続き&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
■今回は実際に動作するプログラムをつくって、githubにあげてみました。&lt;br /&gt;
とりあえず以下の２つ&lt;br /&gt;
library： &lt;a href=&quot;http://github.com/taktod/myLib/&quot;&gt;http://github.com/taktod/myLib/&lt;/a&gt;&lt;br /&gt;
servlet：&lt;a href=&quot;http://github.com/taktod/mediaMp4/&quot;&gt;http://github.com/taktod/mediaMp4/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
■とりあえず触ってみたい方は以下の手順で動作できます。&lt;br /&gt;
&lt;br /&gt;
java6(7でもいいと思う)とmaven2、gitを準備します。&lt;br /&gt;
&lt;br /&gt;
myLibを取得します。&lt;br /&gt;
$ git clone&amp;nbsp;git://github.com/taktod/myLib.git&lt;br /&gt;
$ cd myLib/&lt;br /&gt;
とりあえずテスト&lt;br /&gt;
$ mvn test&lt;br /&gt;
http://49.212.39.17/mario.mp4のデータをリモート解析します。&lt;br /&gt;
特に問題なかったらローカルのリポジトリにインストール&lt;br /&gt;
$ mvn install&lt;br /&gt;
&lt;br /&gt;
続いてmediaMp4を取得します。&lt;br /&gt;
$ cd ..&lt;br /&gt;
$ git clone&amp;nbsp;git://github.com/taktod/mediaMp4.git&lt;br /&gt;
$ cd mediaMp4/&lt;br /&gt;
そのまま実行&lt;br /&gt;
$ mvn jetty:run&lt;br /&gt;
servletが立ち上がったらgoogle chromeで&lt;br /&gt;
http://localhost:8080/test.mp4&lt;br /&gt;
にアクセスしてhttp://49.212.39.17/mario.mp4のデータにproxyアクセスできているのを確認して&lt;br /&gt;
http://localhost:8080/test.m4a&lt;br /&gt;
にアクセスして同データのproxyアクセス(映像off)できているのを確認してもらえればいいと思います。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://poepoemix.blogspot.jp/2013/04/audioplayermp4.html&quot;&gt;前回の話&lt;/a&gt;であげた作成プログラム２号がmp4アクセス&lt;br /&gt;
作成プログラム３号がm4aアクセスとなります。&lt;br /&gt;
&lt;br /&gt;
■これでなにができるか&lt;br /&gt;
&lt;br /&gt;
・musicTubeをつくるきっかけになった。映像offにすることでBGM再生できるようにできます。&lt;br /&gt;
・必要のないboxを削除して応答することで、転送データ量を減らすこともできます。&lt;br /&gt;
・CDNサービスのデータソースを割り当てることで１つのソースでいろんなコンテナを提供できるようになります。(*)&lt;br /&gt;
&lt;br /&gt;
その他httpのmediaデータproxyで手を出すのはいろいろな物に応用が効きそうです。&lt;br /&gt;
&lt;br /&gt;
■今後&lt;br /&gt;
&lt;br /&gt;
とりあえずversion4をさっさと公開してflv変換にも取りかかりたいですね。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://poepoemix.blogspot.com/feeds/4197291967275081464/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://poepoemix.blogspot.com/2013/05/audioplayermp4.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/4197291967275081464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/4197291967275081464'/><link rel='alternate' type='text/html' href='http://poepoemix.blogspot.com/2013/05/audioplayermp4.html' title='audioPlayerでつかっているmp4の話　その２'/><author><name>poepoemix</name><uri>http://www.blogger.com/profile/05463016011577425897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmArlhv0g68lJB1e7v48w7IYddGoy8Cs8CdCdERcrqQs3pFGiA5SsoRZuc5uaBo-74FqMhnS_R34dGfKWD0AIsGj0lZuGflE3qWNLudYZlDPWeoHI4kOYjytiIFIQ6lQ/s220/atsui.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6573067931953719719.post-5715338710698092901</id><published>2013-05-03T14:26:00.001+09:00</published><updated>2013-05-03T14:26:05.415+09:00</updated><title type='text'>gitコマンドメモ</title><content type='html'>俺的 git コマンドメモ&lt;br /&gt;
&lt;br /&gt;
会社でも家でもgitをつかってソースの管理をやっています。&lt;br /&gt;
で、よく使うgitコマンドメモ&lt;br /&gt;
&lt;br /&gt;
$ git init&lt;br /&gt;
今いるディレクトリをgitのリポジトリにするコマンド。&lt;br /&gt;
&lt;br /&gt;
$ git remote add [名前] [リポジトリアドレス]&lt;br /&gt;
リモートリポジトリを適当な名前に割り当てるコマンド&lt;br /&gt;
例：git remote add origin git@github.com:taktod/testProject&lt;br /&gt;
&lt;br /&gt;
$ git pull [リモート指定] [リモートブランチ]:[ローカルブランチ]&lt;br /&gt;
リモートリポジトリのデータを持ってくるコマンド&lt;br /&gt;
[リモート指定]の[リモートブランチ]のデータを、[ローカルブランチ]に割り当てる&lt;br /&gt;
基本：git pull origin master&lt;br /&gt;
[origin]の[master]のデータを、[現在のブランチ]に割り当てる。&lt;br /&gt;
例：git pull git@github.com:taktod/testProject master:test&lt;br /&gt;
[git@github.com:taktod/testProject]の[master]のデータを、testに割り当てる&lt;br /&gt;
&lt;br /&gt;
$ git push [リモート指定] [ローカルブランチ]:[リモートブランチ]&lt;br /&gt;
リモートリポジトリにデータを割り当てるコマンド&lt;br /&gt;
[ローカルブランチ]のデータを、[リモート指定]の[リモートブランチ]に割り当てる。&lt;br /&gt;
基本：git push origin master&lt;br /&gt;
[master]のデータを、[origin]の[master]に割り当てる&lt;br /&gt;
例：git push origin master:test&lt;br /&gt;
[master]のデータを、[origin]の[test]に割り当てる&lt;br /&gt;
例：git push origin :test&lt;br /&gt;
[空]のデータを、[origin]の[test]に割り当てる(空なので削除になる)&lt;br /&gt;
例：git push git@github.com:taktod/testProject master:tmp&lt;br /&gt;
[master]のデータを、[git@github.com:taktod/testProject]の[tmp]に割り当てる&lt;br /&gt;
&lt;br /&gt;
$ git log&lt;br /&gt;
gitのログを参照する。&lt;br /&gt;
例：git log --graph --pretty=oneline&lt;br /&gt;
このコマンドを使うとtreeの形で確認できるので重宝してます。&lt;br /&gt;
&lt;br /&gt;
$ git branch&lt;br /&gt;
ローカルブランチを確認する。&lt;br /&gt;
&lt;br /&gt;
$ git checkout [ローカルブランチ]&lt;br /&gt;
任意のブランチに切り替える。コミットIDを指定した場合はそのコミットIDのデータにする。&lt;br /&gt;
&lt;br /&gt;
$ git reset --hard [コミットID]&lt;br /&gt;
現在のブランチがさしている状態をログごと前の状態に戻すコマンド&lt;br /&gt;
&lt;br /&gt;
とりあえずこの辺り押させておけばいいかなと思っています。&lt;br /&gt;
あるある例：&lt;br /&gt;
公開データで利用しているgitリポジトリがマージで壊れた！というときには&lt;br /&gt;
１：サーバーに入り&lt;br /&gt;
２：git log --graph --pretty=onelineで過去の大丈夫そうなcommitIDを見つける&lt;br /&gt;
３：git reset --hardで見つけたcommitIDの状態に戻す&lt;br /&gt;
４：git pullで作業ツリーを作成し直すことで問題のない状態にしておく。&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://poepoemix.blogspot.com/feeds/5715338710698092901/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://poepoemix.blogspot.com/2013/05/git.html#comment-form' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/5715338710698092901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/5715338710698092901'/><link rel='alternate' type='text/html' href='http://poepoemix.blogspot.com/2013/05/git.html' title='gitコマンドメモ'/><author><name>poepoemix</name><uri>http://www.blogger.com/profile/05463016011577425897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmArlhv0g68lJB1e7v48w7IYddGoy8Cs8CdCdERcrqQs3pFGiA5SsoRZuc5uaBo-74FqMhnS_R34dGfKWD0AIsGj0lZuGflE3qWNLudYZlDPWeoHI4kOYjytiIFIQ6lQ/s220/atsui.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6573067931953719719.post-6611254820207582590</id><published>2013-04-25T22:37:00.001+09:00</published><updated>2013-04-25T22:37:07.756+09:00</updated><title type='text'>audioPlayerでつかっているmp4の話</title><content type='html'>　最近注力している&lt;a href=&quot;http://taktodtools.appspot.com/audioPlayer/index.html#list/CN_dJyu8bXI,h8_2-6wMXho,5dO0NwKNQj0,wTInVYp3FF0,gxqLob1G83k,ZcRbfTIR0no,9AS7EAQYa6g,YsyntnalA9Q,TDVaPpFgVC4,Oe2KXWZwo_g,u8mSh_1CeBU,7tr01CXQXvk,aSJ-VMtVfkM,_Mr_kaO12l0,wa6jnOXBShY,wZf5BK2pzno,K06ETHFQ4Vk,-5XxJ4XBm50,V8SSQ3b5mIY,puJkHW_MIk0,T68j6tU422I,yZ95vHy19CQ,UKigNP9KG4o,W8S3WRwRP60,tbi6EOaH0po,S9F7XCTYRcU,52zPBmmDCQo,PARCgURBOOI,yIKoqcFX_Co,toyzLIQSrZM,lSuqmCiJv4I,S9F7XCTYRcU,YgdMHaax_e0,NWbDBhfTAFQ,TpZQBR2NRgM,CEpgRUQhP3Y,DRCX41GSo6U,aoQm8uYNBC8,M-LarOU0Bwk&quot;&gt;audioPlayerのhtml5のプログラム&lt;/a&gt;ですがaudioタグでmp4が再生できない場合に、Flashをつかって再生させるようにしてあります。(firefoxとかIEとか)&lt;br /&gt;
　で、既に読み込みが完了している部分ではシークができるんですが、読み込みが完了していない部分ではシークができません。&lt;br /&gt;
これはFlashの仕様に依存しています。&lt;br /&gt;
　で、これをなんとかしてやりたいなぁと思っているわけです。&lt;br /&gt;
&lt;br /&gt;
nginxのモジュールには似たような問題の解決方法があります。&lt;br /&gt;
&lt;a href=&quot;http://nginx.org/en/docs/http/ngx_http_mp4_module.html&quot;&gt;http://nginx.org/en/docs/http/ngx_http_mp4_module.html&lt;/a&gt;&lt;br /&gt;
何をやっているかというと、getパラメーターで与えた値以降のみで構成されているmp4を生成して応答してやるというもの。&lt;br /&gt;
10秒からを選択した場合に、10秒の部分から始まるmp4をhtmlの応答として返せばいいじゃね？というわけです。&lt;br /&gt;
ただこのnginxのモジュールはローカルにあるファイルに対して実行する修正になります。&lt;br /&gt;
　僕があつかっているデータはあくまで元データはyoutubeにあり、データ転送のproxyを実行することで転送途中で速度を損ねることなくデータ調整するところがミソになっています。というわけでnginxのモジュールでハイ解決とはいきません。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　で、自作する必要があるわけなのでいままでのおさらいということでメモしておきます。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
■作成プログラム第１号：(単なるproxyサーバー:nettyバージョン)&lt;br /&gt;
　はじめにつくったプログラムはnettyから起こしたサーバーでした。&lt;br /&gt;
なぜnettyかというとflazrつながりでnettyにハマっていたからです。&lt;br /&gt;
確かにnettyでhttpサーバーを書くことができたのですが１つ問題がありました。&lt;br /&gt;
nettyで動作させたところ、応答データの追記書き込みができないみたいです。&lt;br /&gt;
httpのpartial Content(206応答)の肝はデータを少しずつ応答する・・・なんですが、この少しずつというのがnettyにとっては苦手みたいです。(すくなくともhttpサーバー動作としてつかったクラスは苦手だった模様です。)&lt;br /&gt;
しょっちゅうtimeoutとか起こして使いにくいなぁと思っていました。&lt;br /&gt;
　このころはまずは動作を・・・ということでテストでつくってみたproxyサーバーになります。&lt;br /&gt;
&lt;br /&gt;
■作成プログラム第２号：(単なるproxyサーバー:jettyバージョン)&lt;br /&gt;
　上記のnettyバージョンのproxyサーバーを書いているときに、jettyのproxyServletの動作を参考にしていました。proxyServletを使うと手軽にproxyサーバーをつくることができます。&lt;br /&gt;
ここでいうproxyサーバーというのは、ネットワーク設定にいれて、全部のhttpの通信をこのproxyサーバーを通して動作させるというたぐいのproxyです。&lt;br /&gt;
　mp4ファイルへのアクセスがどのようになっているのか調査するのにちょうどいい感じだったので重宝していました。&lt;br /&gt;
　で、nettyでつくっていた動作の応答が芳しくなかったし、動作の調査してるときに、ちょうどjettyのプログラムにいろいろとログを挟んだりしていたので、じゃぁ、jettyに乗り換えるか・・・ということでjettyベースのプログラムを構築しました。&lt;br /&gt;
もちろんつくったのは、特定のファイルの通信にのみ間に入って手を加えるproxyです。&lt;br /&gt;
　これははっきりいってあっさりできました。だって、アクセスパスから目標mp4のアドレスを調べてしまえばあとはproxyServletのコピペで終わっちゃいましたからね。&lt;br /&gt;
&lt;br /&gt;
■作成プログラム第３号：(映像のないmp4をつくるバージョン)&lt;br /&gt;
　単なるproxyがうまくいったので、そろそろ転送しているmp4のデータに口をだそうと思いました。とりあえず目標は通常の動画から映像部分を取り除いて音楽のみのデータに変えてやってiOS6.1のiPhoneでもBGM再生させること。これが目標です。&lt;br /&gt;
でやったこと&lt;br /&gt;
・音声用trakデータ、映像用trakデータの２種類がある。&lt;br /&gt;
・tag名をfreeに変更すると無視するtagに変更できる&lt;br /&gt;
以上の２点がmp4をいじっていてわかったのでproxy転送しているデータのtrakの部分をfreeに書き換えておくってやれば音声のみのmp4にできそうということになりました。&lt;br /&gt;
で、つくったところ、いい感じの動作をしてくれたのでさくさくっとjqmobiバージョンのmusicTubeをつくってベータリリースしました。&lt;br /&gt;
&lt;br /&gt;
■作成プログラム第４号：(映像部のデータ転送やめましたバージョン)&lt;br /&gt;
　上記のプログラムでもうまく動作していたんですが、映像の部分を無視するようにしたとはいえ、なくなったわけではないので使わないデータ転送がある状態でした。&lt;br /&gt;
使わないなら消しちまえということで、削除したかったのですが、そうなってくると、4バイト書き換えるだけでは済まなくなります。&lt;br /&gt;
　で、やったこと&lt;br /&gt;
・映像用trakデータは必要ないので、削除する。&lt;br /&gt;
・削除にあわせてヘッダデータも書き換える。&lt;br /&gt;
・mdatの実データ内容もうまく変更してやる必要がある。&lt;br /&gt;
という３つを満たしつつ&lt;br /&gt;
・データ実体は持たない、http proxyとしてきちんと成立させる。&lt;br /&gt;
(転送速度に影響がでないようにする)&lt;br /&gt;
というちと無謀なことに挑戦してみました。まぁ、実際にできちゃったわけですが&lt;br /&gt;
　まず１つ目の大問題&lt;br /&gt;
httpの応答では、これから応答するデータがどういう大きさであるか応答しなければいけません。初回アクセス時にこのサイズがどの程度になるかは誰にもわかりませんし、さすがにこの計算を実施してから応答を開始する・・・では遅すぎます。&lt;br /&gt;
たまたまiPhoneのアクセスでは何度が分けてアクセスが来ることが先のproxyServletの動作ログからわかっていたので、なにもわからなければデータ元のサーバーが応答したサイズをとりいそぎ返すことにしました。&lt;br /&gt;
　続いて２つ目の問題&lt;br /&gt;
httpの全体のサイズはごまかしましたが、mp4の内部データでごまかしを使うわけにはいきません。(応答データが中途で変わることはまずありえないし)&lt;br /&gt;
というわけで、moovのタグの開始部(先頭から30バイト程度の部分があるやつ)の大きさは正しい値にする必要があります。この計算を高速に実施しないとhttp proxyとしては成立できなくなっちゃいます。&lt;br /&gt;
幸い次の２点のおかげで解決することができました。&lt;br /&gt;
・partialContentの要求を使うことで、originalデータの問い合わせ時に必要な部分の問い合わせに狙い撃ちできたこと。&lt;br /&gt;
・mp4の内部データがサイズ + タグ + 内容という構成だったので、あらかじめ大きさが把握できたこと。&lt;br /&gt;
いくつかのタグは非常に大きいので頭から律儀に読み込みを実施しているとタイムアウトになりそうなくらい時間がかかってしまうのですが、そのあたりはすっぱりあきらめサイズだけに重点を置いたところ解決できました。&lt;br /&gt;
　３つ目の問題&lt;br /&gt;
moovの内容の応答を勧めていくことになるのですが、先ほどスキップしたデータの非常に大きなタグが次の問題になります。具体的には、stco(co64)のタグが問題です。&lt;br /&gt;
このタグは、mp4ファイルの内部のどこに目的のデータがあるか記述しているタグです。&lt;br /&gt;
データを書き換えつつ応答しなければいけないので、以下のような手法をとりました。&lt;br /&gt;
データ元のサーバーに２本httpUrlConnectionの読み込みストリームを作成して、映像と音声のstcoのデータを並列で取得しつつ、計算してたたき出した値をiPhoneに返していくという動作にしました。&lt;br /&gt;
後述のmdatの編集もそうなんですが、前から順にデータが並んでいるという構造であるため、逐次データをつくって応答していくということができて助かりました。&lt;br /&gt;
このときに平行してサーバー上のデータとして、mdatのデータのどの部分を抜き出して応答すべきかというデータを保持するようにしています。&lt;br /&gt;
　あとは、mdatの部分の応答ですがデータ元サーバーからは全部DLしつつもクライアントには、計算して出した必要な部分のみ応答を返していくという動作をすることで、映像のデータを完全に除外したデータ転送を実施することに成功しました。&lt;br /&gt;
　一応まだmetaデータ部(udat)がまぁなくてもいい命令なんですが、データ元サーバーのサインみたいなものだと思うので、そこには手を出してません。&lt;br /&gt;
あと、html5のaudioタグの動作仕様だと思うのですが、プレーヤー側でシークした場合に新しくparticalContentsでサーバー側にDLの要求が飛んでくるので、その場合は対応するデータ元サーバーへの問い合わせ位置を計算したあと、その場所からのDLを行いつつクライアントには必要なデータのみ応答するという動作に仕上げることができました。&lt;br /&gt;
これが現状のproxyサーバーの動作となります。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
■これからつくるやつ案&lt;br /&gt;
とりあえず、Flashの動作のために、moovをもっと改造して中途から始まるmp4をつくる必要があります。&lt;br /&gt;
で、さくっとmp4ファイルをいくつか確認して関係ありそうなタグをあつめてみました。&lt;br /&gt;
trakの中のstbl以下の次のデータが関係ありそうです。&lt;br /&gt;
stsd (Sample descriptions)&lt;br /&gt;
stts (Map decoding time to sample)&lt;br /&gt;
stsc (Map sample to chunk)&lt;br /&gt;
stsz (Sample sizes)&lt;br /&gt;
stco (Chunk offsets)&lt;br /&gt;
stss (Sync sample table) (これは映像onlyっぽいです。もともと映像と音声を同期させるためのデータみたい)&lt;br /&gt;
&lt;br /&gt;
まずstsd&lt;br /&gt;
ざっと調べたところ手持ちのmp4のデータではどれも１つのデータのみはいっているみたいです。とりあえずそのままコピーでいいかも&lt;br /&gt;
続いてstts&lt;br /&gt;
サンプルの時間の記述みたいです。中途で変わることがあるデータみたいなので、中途からはじめるためには、それにあわせて変更しないとだめみたいです。&lt;br /&gt;
stsc&lt;br /&gt;
Chunkの構成とそのデコード方法？が記述されているみたいです。&lt;br /&gt;
audioのデータをみるとそれほどデータ数がおおいわけではなさそうです。単なるサンプルとデコード方法の対応表だったら変更なしでもとりあえずいけるのだろうか？&lt;br /&gt;
stsz&lt;br /&gt;
サンプル１つ１つのサイズ定義&lt;br /&gt;
mp4の解説からするとまぁ、なくてもいいよというデータっぽいですが、いまのところ消せたらラッキーくらいに思っています。DL済みデータのシークができなくなるかもしれませんね。&lt;br /&gt;
stco&lt;br /&gt;
前回修正したmdat上のどこにデータがあるか指定&lt;br /&gt;
moovが先頭にきているデータなので、変更にあわせて書き換えが必要。&lt;br /&gt;
stss&lt;br /&gt;
映像と音声の同期用、今回は音声のみの抽出なのでばっさり削除でいいはず。(もともと映像側にしかないデータなので切ってるし)&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://d.hatena.ne.jp/SofiyaCat/20080430&quot;&gt;http://d.hatena.ne.jp/SofiyaCat/20080430&lt;/a&gt;&lt;br /&gt;
こちらを今日は参考にしました。&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
まじめにmp4をつくるなら上記のデータの修正が必要になりそうです。&lt;br /&gt;
&lt;br /&gt;
で、そんなことをしていると大変なので、proxy用に不真面目にやる方法も考えてみました。&lt;br /&gt;
１：DL済みデータのシークをすっぱりあきらめて参照用のindexがmdatの先頭にしかないデータをつくるやり方。&lt;br /&gt;
これが可能なら結構楽です。中途の位置を計算する方法がそもそも必要なくなりますので、moovの内容もとってもコンパクトになりそうです。&lt;br /&gt;
ただ、きちんと成立するデータがつくれるかちょっと疑問ですが・・・&lt;br /&gt;
　問題点は、サイドシークした場合にDL済みの位置だとしても再DLを強制されるところ。&lt;br /&gt;
3G回線のandroid端末だと何度もmediaデータの転送が走ってイライラするかもしれません。&lt;br /&gt;
２：あたまの方にあるデータをすべて0byteだったことにするやり方。&lt;br /&gt;
これも可能なら非常に楽です。stcoのoffsetデータを目標の時間のデータまですべて0にしてしまって全部DLしているが見かけ上は中途再生にみえるみたいなことができるかもしれません。&lt;br /&gt;
　問題点は、うごかない端末が出てくる可能性があることくらいでしょうか。&lt;br /&gt;
３：FLVにしちゃう。&lt;br /&gt;
osmfのプラグインにHLS対応のがあるんですが、mpegts→flv変換をactionScriptでやってるみたいです。同じようにmp4→flvのコンテナ変換を自力でやっちゃってflashに送るデータをflvにしてしまえば中途データにするのは非常に楽です。&lt;br /&gt;
これができたら汎用性かなり高くなりますね。flashをつかっている限り・・・はですが。&lt;br /&gt;
需要としては、flash→mp4変換がproxyでできてしまえばすばらしく良いということになりますが、そちらはおそらく無理でしょう。mp4の作成に必要なデータがflvの先頭だけで収集完了できるとは思えないです。&lt;br /&gt;
４：結局つくらない。&lt;br /&gt;
　wifi環境(使えるところが光回線ばっかりだからだと思うのですが)で何度かFlashの動作を確認しているのですが、4時間ほどあるffのmp4でもDL完了までにかかる時間が50秒程度&lt;br /&gt;
DL済みの部分はシークできるので、まぁストレスはあるものの使えなくはない程度かなぁという感じです。通常の動画だと数秒でDL終わるし&lt;br /&gt;
&lt;br /&gt;
とりあえず、いろいろ試していけそうな予感です。</content><link rel='replies' type='application/atom+xml' href='http://poepoemix.blogspot.com/feeds/6611254820207582590/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://poepoemix.blogspot.com/2013/04/audioplayermp4.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/6611254820207582590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/6611254820207582590'/><link rel='alternate' type='text/html' href='http://poepoemix.blogspot.com/2013/04/audioplayermp4.html' title='audioPlayerでつかっているmp4の話'/><author><name>poepoemix</name><uri>http://www.blogger.com/profile/05463016011577425897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmArlhv0g68lJB1e7v48w7IYddGoy8Cs8CdCdERcrqQs3pFGiA5SsoRZuc5uaBo-74FqMhnS_R34dGfKWD0AIsGj0lZuGflE3qWNLudYZlDPWeoHI4kOYjytiIFIQ6lQ/s220/atsui.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6573067931953719719.post-2301215035170331953</id><published>2013-04-25T19:46:00.000+09:00</published><updated>2013-04-25T19:46:09.239+09:00</updated><title type='text'>jettyのwebSocketServletで古いWebSocketにも対応してみる。</title><content type='html'>webSocketとbookmarkletを利用して、iPhoneみたいな端末上でもwebのデバッグができるプログラムを実は書いて使っています。(chromeのconsoleや要素解析みたいなことができます。簡易的なものだけど)&lt;br /&gt;
で、古いiOSの端末でサーバーへの接続がうまくいかなかったのでなんとかする方法を見つけました。&lt;br /&gt;
&lt;br /&gt;
なんとかする方法はgithubにあげました。&lt;br /&gt;
&lt;a href=&quot;https://github.com/taktod/websocketJetty/commit/bb9502d4040daccae498d805e5e22d40987f9c30&quot;&gt;https://github.com/taktod/websocketJetty/commit/bb9502d4040daccae498d805e5e22d40987f9c30&lt;/a&gt;&lt;br /&gt;
web.xmlの記述にinit-paramのデータを追加して、minVersionの値を-1にすれば、全部のwebSocketに対応するみたいです。(0じゃだめ)&lt;br /&gt;
デフォルトでは、RFC6455以降に対応するみたいになっているみたいですね。&lt;br /&gt;
&lt;br /&gt;
これは推測ですが、webSocketのバージョンによっては、binaryの転送はサポートされていないとかあるので、minVersionの値によっては使えない動作がでてくると思います。&lt;br /&gt;
その点だけは注意しなければいけないです。&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
init-paramの値には他にも&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;bufferSize&lt;/li&gt;
&lt;li&gt;maxIdleTime&lt;/li&gt;
&lt;li&gt;maxTextMessagesSize&lt;/li&gt;
&lt;li&gt;maxBinaryMessagesSize&lt;/li&gt;
&lt;li&gt;minVersion&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
というのがあるみたいです。&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/websocket/WebSocketServlet.html&quot;&gt;http://download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/websocket/WebSocketServlet.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
とりあえず、いまのところ僕が扱っているwebSocketの動作ではtextデータのやり取りができたらそれでいいので、minVersion -1だけをいれておけばいいかなと思っています。&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://poepoemix.blogspot.com/feeds/2301215035170331953/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://poepoemix.blogspot.com/2013/04/jettywebsocketservletwebsocket.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/2301215035170331953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/2301215035170331953'/><link rel='alternate' type='text/html' href='http://poepoemix.blogspot.com/2013/04/jettywebsocketservletwebsocket.html' title='jettyのwebSocketServletで古いWebSocketにも対応してみる。'/><author><name>poepoemix</name><uri>http://www.blogger.com/profile/05463016011577425897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmArlhv0g68lJB1e7v48w7IYddGoy8Cs8CdCdERcrqQs3pFGiA5SsoRZuc5uaBo-74FqMhnS_R34dGfKWD0AIsGj0lZuGflE3qWNLudYZlDPWeoHI4kOYjytiIFIQ6lQ/s220/atsui.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6573067931953719719.post-8250712109685944119</id><published>2013-04-21T15:14:00.006+09:00</published><updated>2013-04-21T15:34:02.493+09:00</updated><title type='text'>MusicTubeのプログラムをbootstrapで書き直してみた。ただしまだ全機能ではないけど</title><content type='html'>&lt;br /&gt;
MusicTubeの音楽を聴くプログラムをbootstrapで書き直してみました。&lt;br /&gt;
&lt;br /&gt;
senchaよりあっさりしてるけど、まぁそこそこな動作になったと思う。&lt;br /&gt;
上の部分にプレーヤーを持ってきて、動作詳細を隠しておくのはいいかもしれないですね。sencha側のプログラムもコレに合わせてしまった方がいいかも。&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;&quot; height=&quot;400px&quot; src=&quot;http://taktodtools.appspot.com/audioPlayer/index.html#list/CN_dJyu8bXI,h8_2-6wMXho,5dO0NwKNQj0,wTInVYp3FF0,gxqLob1G83k,ZcRbfTIR0no,9AS7EAQYa6g,YsyntnalA9Q,TDVaPpFgVC4,Oe2KXWZwo_g,u8mSh_1CeBU,7tr01CXQXvk,aSJ-VMtVfkM,_Mr_kaO12l0,wa6jnOXBShY,wZf5BK2pzno,K06ETHFQ4Vk,-5XxJ4XBm50,V8SSQ3b5mIY,puJkHW_MIk0,T68j6tU422I,yZ95vHy19CQ,UKigNP9KG4o,W8S3WRwRP60,tbi6EOaH0po,S9F7XCTYRcU,52zPBmmDCQo,PARCgURBOOI,yIKoqcFX_Co,toyzLIQSrZM,lSuqmCiJv4I,S9F7XCTYRcU,YgdMHaax_e0,NWbDBhfTAFQ,TpZQBR2NRgM,CEpgRUQhP3Y,DRCX41GSo6U,aoQm8uYNBC8,M-LarOU0Bwk&quot; width=&quot;90%&quot;&gt;&lt;/iframe&gt;

&lt;br /&gt;
いまのところの仕様は&lt;br /&gt;
http://taktodtools.appspot.com/audioPlayer/index.html#list/(youtubeの動画ID),(youtubeの動画ID)....という感じに並べればそれが再生リストになるというものです。&lt;br /&gt;
&lt;br /&gt;
今回はwebkit以外のブラウザでもきちんと動作するように、audioタグでmp4が再生不能なブラウザかどうか判定して無理な場合はFlashで再生するようにしてみました。&lt;br /&gt;
&lt;br /&gt;
bootstrapをつかったとはいえ、やっぱりIEが鬼門ですね。&lt;br /&gt;
とりあえず手元にあるwinXPのIE8での動作確認はやっておきましたが、幅が小さくなったときの動作が気に入らないですね。&lt;br /&gt;
&lt;br /&gt;
上記のiframe内のリストはbeatmaniaの曲で固めてみました。個人的な趣味です。&lt;br /&gt;
ではでは</content><link rel='replies' type='application/atom+xml' href='http://poepoemix.blogspot.com/feeds/8250712109685944119/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://poepoemix.blogspot.com/2013/04/musictubebootstrap.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/8250712109685944119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/8250712109685944119'/><link rel='alternate' type='text/html' href='http://poepoemix.blogspot.com/2013/04/musictubebootstrap.html' title='MusicTubeのプログラムをbootstrapで書き直してみた。ただしまだ全機能ではないけど'/><author><name>poepoemix</name><uri>http://www.blogger.com/profile/05463016011577425897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmArlhv0g68lJB1e7v48w7IYddGoy8Cs8CdCdERcrqQs3pFGiA5SsoRZuc5uaBo-74FqMhnS_R34dGfKWD0AIsGj0lZuGflE3qWNLudYZlDPWeoHI4kOYjytiIFIQ6lQ/s220/atsui.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6573067931953719719.post-3769805386680458765</id><published>2013-04-16T19:54:00.000+09:00</published><updated>2013-04-16T19:54:34.753+09:00</updated><title type='text'>HttpLiveStreamingとmp4の動作の違いについて</title><content type='html'>youtubeの動画をiphoneでみると、mp4のデータが視聴できます。&lt;br /&gt;
&lt;br /&gt;
今回はこのmp4と僕が好きなmpegtsベースのHttpLiveStreamingという形式の違いについてです。&lt;br /&gt;
&lt;br /&gt;
まずはmp4&lt;br /&gt;
mp4はxmlみたいなタグ+データの形式のコンテナです。webmのmatroskaも似た感じです。&lt;br /&gt;
たいていのデータは詰め込むことができますが、一番メジャーなのは、h.264 + aacの組み合わせです。3gpというちょっと前の携帯電話で扱える動画なんかも基本mp4だし、adobeが出しているhttpDynamicStreamingやf4vもベースはmp4です。&lt;br /&gt;
&lt;br /&gt;
データの中身は大きくわけでmoovとmdatに分かれます。moovは本でいうところの目次にあたる部分で、シークしたりするときにどこにデータがあるかという情報が書かれています。mdatはメディアデータの実データ部分になります。&lt;br /&gt;
ffmpegでコンバートした場合、mdatの後にmoovが出力されますが、moovが先頭にある方が、シーク等に有利なので通常はMP4Boxあたりを利用して、入れ替えます。&lt;br /&gt;
例：Flashで再生させるとき、moovが後にあると、全部読み込まないと再生が始まりませんが、moovが前にある場合はすぐに再生が始まります。&lt;br /&gt;
&lt;br /&gt;
iPhoneでmp4にアクセスした場合は、はじめにmoovのデータをダウンロードしようとします。それが完了すると、再生がはじまります。なお、3Gの状態でこのmoovの部分が基底時間以内にDLできない場合timeoutになります。サーバーが原因のtimeoutかクライアントが原因のtimeoutかはまだわかっていません。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
続いてHttpLiveStreaming(略してHLS)&lt;br /&gt;
こちらはmpegをベースにしたストリーミング規格です。内部データとしては、mp3やmpegtsが対応しています。以前mp4でつくろうとしたことがありますが、mp4では残念ながら無理でした。&lt;br /&gt;
こちらはmpegデータを複数のファイルに分割し、それを順番にDLしては再生させることで動作します。また、その複数ファイルを管理するindexファイルが必要になります。&lt;br /&gt;
&lt;br /&gt;
index用のファイルがm3u8ファイル、実データは*.tsもしくは*.mp3となります。&lt;br /&gt;
appleの公式ではたしか、30秒ごとに区切ったデータがよいみたいなことが書いてあったかと思うのですが、別に1秒で区切ってもOKです。&lt;br /&gt;
ライブストリームを配信する場合にはなるべく短くした方がよりリアルタイムになりますが、逆にデータの複合に失敗しやすくなるという問題もあります。(僕がつくった&lt;a href=&quot;https://github.com/taktod/jsegmenter&quot;&gt;jsegmenter&lt;/a&gt;とかの分割プログラムでは、keyFrameに注意してそのあたり対処してあります。)&lt;br /&gt;
&lt;br /&gt;
mp4のmoovと違い、m3u8ファイルは非常にサイズが小さいので、再生開始時のオーバーヘッドが小さく、3Gでもさくさくっと再生開始ができるという利点があります。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
で、どの両者の違いについて・・・特にmusicTubeをやっているのでaudioの場合の違いについて。です。&lt;br /&gt;
１：Flashでの再生&lt;br /&gt;
mp4は再生できて、hlsは再生できない。&lt;br /&gt;
単に対応していないだけです。ただし、iOSアプリをAirから起こした場合は再生可能になります。&lt;br /&gt;
２：iPhoneでの再生&lt;br /&gt;
aacベースのmp4は普通に再生できます。aacのmpegtsベースのhlsは再生できません。&lt;br /&gt;
mp3ベースのhlsは再生できました。もちろんaudio扱いになるので、両者とも、別のアプリに移動しても流しっぱなしにできます。&lt;br /&gt;
前は確かaacのmpegtsベースのhls再生可能だったはずです。動画のBGM再生つぶされたときについでにつぶされたのかもしれません。&lt;br /&gt;
確認したブラウザはchrome Mercury Sleipnir Safariについて調べてあります。operaはたぶん、safariで再生させられることになると思います。&lt;br /&gt;
３：androidでの再生&lt;br /&gt;
nexus7のchrome, opera, firefoxで調べてみました。&lt;br /&gt;
まずmp4&lt;br /&gt;
chrome、OK&lt;br /&gt;
opera、DLになる。&lt;br /&gt;
firefox、OK&lt;br /&gt;
続いてHLS&lt;br /&gt;
chrome、OKだが、accのmpegtsベースのみ、かつ再生中に別のアプリには移動できない。mp3ベースはエラーになる。&lt;br /&gt;
operaとfirefoxはm3u8ファイルのDLになる。&lt;br /&gt;
４：3G状態での再生について(iPhone)&lt;br /&gt;
　mp4は始めのmoovのDLがきついときがある、ただし、それがDLできてしまえばメモリー上に乗るので、その後はメディアデータに専念できる。&lt;br /&gt;
よって、wifi状態でmoovだけ落としてからでかければ比較的快適に視聴できる。&lt;br /&gt;
HLSより先読みがしっかりされるので、地下鉄とか乗っていてもつっかかりにくい感じがする。&lt;br /&gt;
　HLSは開始時の動作がスムーズ。ただし、内部の分割データにも余計な情報が乗っているのであとで落とすデータが少々大きめ。(あまり違いないけど。)&lt;br /&gt;
ファイルベースで先読みするのでmp4より先読みは弱め。(mp4は細かくDL、hlsは大雑把にDL)よって地下鉄等でDLがとまると、つっかかることあり。&lt;br /&gt;
&lt;br /&gt;
youtubeにiphoneでアクセスするとmp4で落ちてくるのでmusicTubeのサーバーサイドアプリでは、iphoneとyoutubeの間に入ってproxyサーバーとしてデータの転送をしつつmp4から映像データを取り去ることで、audioデータとして動作し、bgmとして再生できるようにしています。&lt;br /&gt;
で、いま最大の不満は外出中の3Gの状態でトラック遷移がうまくいかなかったり、長いデータの再生ができないことがある・・・ということです。&lt;br /&gt;
hlsにすると再生のオーバーヘッドが減りますからね。一度試してみたいんですが調査した結果mp3onlyになってしまったのでちょっと難しい話になってきました。&lt;br /&gt;
どうするかなぁ・・・</content><link rel='replies' type='application/atom+xml' href='http://poepoemix.blogspot.com/feeds/3769805386680458765/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://poepoemix.blogspot.com/2013/04/httplivestreamingmp4.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/3769805386680458765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/3769805386680458765'/><link rel='alternate' type='text/html' href='http://poepoemix.blogspot.com/2013/04/httplivestreamingmp4.html' title='HttpLiveStreamingとmp4の動作の違いについて'/><author><name>poepoemix</name><uri>http://www.blogger.com/profile/05463016011577425897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmArlhv0g68lJB1e7v48w7IYddGoy8Cs8CdCdERcrqQs3pFGiA5SsoRZuc5uaBo-74FqMhnS_R34dGfKWD0AIsGj0lZuGflE3qWNLudYZlDPWeoHI4kOYjytiIFIQ6lQ/s220/atsui.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6573067931953719719.post-7706509818041050237</id><published>2013-04-11T22:15:00.002+09:00</published><updated>2013-04-11T22:15:20.977+09:00</updated><title type='text'>htmlの状態を簡単に確認するbookmarkletつくってみた。</title><content type='html'>別件でwebsocket経由で見ているページの内容をdumpするプログラムを書いたので、個人的にはそっちで事足りるのですが、iphoneでページをみているときに、ページのhtmlがどうなっているのか、確認したいことがあるので、調べることができるようにするbookmarkletを書いてみました。&lt;br /&gt;
&lt;br /&gt;








&lt;br /&gt;
&lt;div class=&quot;p1&quot;&gt;
javascript:var d=document,s=d.createElement(&#39;script&#39;);s.src=&quot;http://taktodtools.appspot.com/idump.js&quot;;d.body.appendChild(s);void(0);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;a href=&quot;javascript:var d=document,s=d.createElement(&#39;script&#39;);s.src=&amp;quot;http://taktodtools.appspot.com/idump.js&amp;quot;;d.body.appendChild(s);void(0);&quot;&gt;実行テスト&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
正直websocketで動作するPCとかでdumpと実行ができるプログラムの方が便利。&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
ただ、自分のwebsocketサーバーがないと動作できないので、なかなか公開できないため、とりあえずつくってみたのが今回のbookmarkletとなります。&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://poepoemix.blogspot.com/feeds/7706509818041050237/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://poepoemix.blogspot.com/2013/04/htmlbookmarklet.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/7706509818041050237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/7706509818041050237'/><link rel='alternate' type='text/html' href='http://poepoemix.blogspot.com/2013/04/htmlbookmarklet.html' title='htmlの状態を簡単に確認するbookmarkletつくってみた。'/><author><name>poepoemix</name><uri>http://www.blogger.com/profile/05463016011577425897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmArlhv0g68lJB1e7v48w7IYddGoy8Cs8CdCdERcrqQs3pFGiA5SsoRZuc5uaBo-74FqMhnS_R34dGfKWD0AIsGj0lZuGflE3qWNLudYZlDPWeoHI4kOYjytiIFIQ6lQ/s220/atsui.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6573067931953719719.post-9057511517470527409</id><published>2013-04-04T22:34:00.003+09:00</published><updated>2013-04-04T22:34:33.437+09:00</updated><title type='text'>jettyサーバーでwebsocket動作を組んでみました。</title><content type='html'>会社でやろうとおもったので、mavenとjettyについていろいろと学習しています。&lt;br /&gt;
でいろいろとハマりました。&lt;br /&gt;
今回はそのはまった話。&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://github.com/taktod/websocketJetty/commits/master&quot;&gt;https://github.com/taktod/websocketJetty/commits/master&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
例によってgithubにあげています。&lt;br /&gt;
今回はmaven2をつかってつくっていますので、動作確認したければ、websocketJettyのディレクトリでmvn jetty:run&lt;br /&gt;
を実行してもらえればjettyサーバーが勝手に起動して、確認できるかと思います。&lt;br /&gt;
&lt;br /&gt;
mvn経由でjettyを実行する場合、webアプリケーションのrootは/になります。&lt;br /&gt;
よって、昨日の時点では、web.xmlの記述で設定しているpathをsocket/にしてあります。&lt;br /&gt;
&lt;br /&gt;
で、jettyのtarballをダウンロードしてきて展開した場合の動作ですが、&lt;br /&gt;
warファイルの名前がrootになります。&lt;br /&gt;
コンパイル時には、websocketという名前で実行しているので、rootがwebsocket/になります。&lt;br /&gt;
実験はしていませんが、元のプログラムのままだと、pathにsocketをいれてあるので&lt;br /&gt;
websocket/socket/でアクセスしないとservletのクラスにコネクトしないことになります。&lt;br /&gt;
&lt;br /&gt;
ところが、web.xmlに設定した値でいけると思い込んでしまったため、socket/でずっとアクセステストをしていました。&lt;br /&gt;
で、うごかなかったというわけです。&lt;br /&gt;
&lt;br /&gt;
さて、ハマっていた状態だったわけでそこから脱出できた理由について書いておきます。&lt;br /&gt;
jettyサーバー8.1.10を利用しているのですが、通常モードでつかっているとログがなにもでてきませんが、ログレベルをDEBUGに変更すると、詳細動作ログがでてきます。&lt;br /&gt;
普通にjettyを起動する場合は&lt;br /&gt;
$ java -jar start.jar&lt;br /&gt;
というコマンドになりますが、ログの詳細を出したい場合は&lt;br /&gt;
$ java -Dorg.eclipse.jetty.LEVEL=DEBUG -jar start.jar&lt;br /&gt;
という形で出すことができます。&lt;br /&gt;
この状態でログを出したところ&lt;br /&gt;








&lt;br /&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
2013-04-04 21:29:37.650:DBUG:oeji.nio:created SCEP@5d295c59{l(/0:0:0:0:0:0:0:1:50573)&amp;lt;-&amp;gt;r(/0:0:0:0:0:0:0:1:8080),d=false,open=true,&lt;span class=&quot;s1&quot;&gt;ishut&lt;/span&gt;=false,&lt;span class=&quot;s1&quot;&gt;oshut&lt;/span&gt;=false,&lt;span class=&quot;s1&quot;&gt;rb&lt;/span&gt;=false,&lt;span class=&quot;s1&quot;&gt;wb&lt;/span&gt;=false,w=true,i=0}-{AsyncHttpConnection@466e06d7,g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=-14,l=0,c=0},r=0}&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
2013-04-04 21:29:37.653:DBUG:oejh.HttpParser:filled 303/303&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
2013-04-04 21:29:37.659:DBUG:oejs.Server:REQUEST /socket/ on AsyncHttpConnection@466e06d7,g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=-5,l=22,c=0},r=1&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
2013-04-04 21:29:37.659:DBUG:oejsh.ContextHandler:scope null||/&lt;span class=&quot;s1&quot;&gt;sockettt&lt;/span&gt;/ @ o.e.j.w.WebAppContext{/,null},/Users/&lt;span class=&quot;s1&quot;&gt;todatakahiko&lt;/span&gt;/&lt;span class=&quot;s1&quot;&gt;Downloads&lt;/span&gt;/&lt;span class=&quot;s1&quot;&gt;jetty&lt;/span&gt;-distribution-8.1.10.v20130312/&lt;span class=&quot;s1&quot;&gt;webapps&lt;/span&gt;/test.war&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
こんなログがでてきました。&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
追加しているwarファイルがwebsocket.warなのに、参照しているのがtest.warになっています。&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
このおかげで、見ているservletプログラムが自作したものと違う状態になっているというのに気づけました。&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
ちなみに、&lt;a href=&quot;http://www.websocket.org/echo.html&quot;&gt;http://www.websocket.org/echo.html&lt;/a&gt;こちらのwebsocketのechoアクセステストのページで実行テストをするとエラーだった場合に以下のようなログがでてきます。&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIYLhdtvWNfSC40-wbSSeLlAOHTT5lSmDPsVJxMHGgvhv4rYIGtK6bPDC-nel_XWjsAFqphG5MYdACwR5vl1J5EWI44Oym9IpPMHMDi2UtwoBBBTBTMBmzvGZB7JPzZlZ_Xahyphenhyphen1N7xeaw/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-04-04+22.32.21.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;140&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIYLhdtvWNfSC40-wbSSeLlAOHTT5lSmDPsVJxMHGgvhv4rYIGtK6bPDC-nel_XWjsAFqphG5MYdACwR5vl1J5EWI44Oym9IpPMHMDi2UtwoBBBTBTMBmzvGZB7JPzZlZ_Xahyphenhyphen1N7xeaw/s400/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-04-04+22.32.21.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
あーそれにしてもなんとかなってよかった・・・&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
mvn jetty:runのときとアクセスパスがかわるのは、musicTubeM4aのyoutubeのmp4のコンバートプロキシ書いたときにわかっていたのにハマるとは・・・&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://poepoemix.blogspot.com/feeds/9057511517470527409/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://poepoemix.blogspot.com/2013/04/jettywebsocket.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/9057511517470527409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/9057511517470527409'/><link rel='alternate' type='text/html' href='http://poepoemix.blogspot.com/2013/04/jettywebsocket.html' title='jettyサーバーでwebsocket動作を組んでみました。'/><author><name>poepoemix</name><uri>http://www.blogger.com/profile/05463016011577425897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmArlhv0g68lJB1e7v48w7IYddGoy8Cs8CdCdERcrqQs3pFGiA5SsoRZuc5uaBo-74FqMhnS_R34dGfKWD0AIsGj0lZuGflE3qWNLudYZlDPWeoHI4kOYjytiIFIQ6lQ/s220/atsui.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIYLhdtvWNfSC40-wbSSeLlAOHTT5lSmDPsVJxMHGgvhv4rYIGtK6bPDC-nel_XWjsAFqphG5MYdACwR5vl1J5EWI44Oym9IpPMHMDi2UtwoBBBTBTMBmzvGZB7JPzZlZ_Xahyphenhyphen1N7xeaw/s72-c/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-04-04+22.32.21.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6573067931953719719.post-7005917680487436842</id><published>2013-02-17T09:15:00.003+09:00</published><updated>2013-02-17T09:15:54.280+09:00</updated><title type='text'>いままでつくったHttpLiveStreaming(iPhone用)のまとめ</title><content type='html'>　rtmpをつかったストリーミングサービスを会社で立ち上げ。その後、スマートフォンにも対応するかという話になったところから、iPhone用のストリーミングをつくるということに注力してきました。&lt;br /&gt;
　おかげで動画、音声コンテナについてかなり詳しくなったし、いろいろわかるようになってきました。その振り返りを残しておきたいとおもいます。&lt;br /&gt;
&lt;br /&gt;
第０号：mp4の分割ファイルを順につくってhtml5のvideoタグで再生させるやり方。&lt;br /&gt;
　→一番はじめに上から提案されたやりかた。&lt;br /&gt;
ライブストリーミングとはいえないし、httpLiveStreamingという方式があることがわかったので見送り。&lt;br /&gt;
&lt;br /&gt;
第１号：wowzaのnative変換、ここからhttpLiveStreamingを使い始める&lt;br /&gt;
　→どういうものかとりあえず触ってみたもの。&lt;br /&gt;
以下の弱点があった。&lt;br /&gt;
１：h264 + mp3もしくはaacのコーデックに適合しないとダメ&lt;br /&gt;
２：wowzaのプログラムとしてアクセス制御ができない。&lt;br /&gt;
３：安定性微妙。&lt;br /&gt;
&lt;br /&gt;
注意：最新のwowzaには変換動作がついているので、そちらを使えば問題ない可能性あり&lt;br /&gt;
&lt;br /&gt;
第２号：rtmpdump + ffmpeg + segmenter&lt;br /&gt;
　radikoの音声をこの３つの組み合わせで流しているという記事をみつけた&lt;br /&gt;
&lt;a href=&quot;http://nrglog.net/blog/archives/2010/04/radiko-iphone.html&quot;&gt;http://nrglog.net/blog/archives/2010/04/radiko-iphone.html&lt;/a&gt;&lt;br /&gt;
この記事だったかは不明、まぁでも似たないようだった。&lt;br /&gt;
動作させてみたところ、おおむねだいたいのチャンネルの放送が視聴できた。&lt;br /&gt;
&lt;br /&gt;
第３号：(変換セット) + ftpで転送 + apacheで提供&lt;br /&gt;
　会社でftpとapacheによる提供プログラムを書いた。&lt;br /&gt;
単に生成ファイルをcronで拾ってftpで転送。&lt;br /&gt;
apacheをつかってユーザーにm3u8とtsを提供することで動作。&lt;br /&gt;
確実にコンバートできる自信はなかったため、コンバートできている部屋のみ提供という形だった。&lt;br /&gt;
　初の実践投入&lt;br /&gt;
&lt;br /&gt;
第４号：rtmpClient もしくは flazr + ffmpeg + segmenter&lt;br /&gt;
　red5のrtmpClientの動作をライブストリームを別のサーバーに移して多人数配信させるという動作を別途研究していたので、その研究の流用。&lt;br /&gt;
放送者の接続、切断、リロードその他のコントロールをうまくしたかったため実験する。&lt;br /&gt;
&lt;br /&gt;
第５号：flazr + avconv + segmenter&lt;br /&gt;
　特定のコーデックの場合変換起動をffmpegが実行できないバグがあったため、いろんなバージョンのffmpegとavconvを試してみた。結果としてavconvを選択。&lt;br /&gt;
rtmpのダウンロード動作はflazr一択になる。&lt;br /&gt;
&lt;br /&gt;
第６号：flazr + avconv + segmenter(改造)&lt;br /&gt;
　３号の時点でリアルタイム処理にならなかったため、systemコマンド(だったと思う。)をつかってsegment作成時にphpをキックし、すぐにアップロードする形にした。&lt;br /&gt;
　実践投入第二弾&lt;br /&gt;
&lt;br /&gt;
第７号：flazr + xuggle&lt;br /&gt;
　segmenterの吐き出すファイルをみていたところ、どうも出力がよろしくない感じがしたため、変換まわりにも口をだしたくなったため、ffmpegのjni実装であるxuggleに手をだす。&lt;br /&gt;
　こちらも4号と同じく、rtmpのビットレート変換やコーデック変換技術の研究の副産物。xuggle-xuggler-red5のプログラムをflazr化した。&lt;br /&gt;
　ちなみに出力がよくないとおもった理由は再生を開始したときに、音声だけの時間が微妙にできたり、すぐに開始しなかったりしたため。調査の結果として、どうやらmpegtsの出力ファイルの先頭に動画のキーフレームがきていないっぽいことがわかる。&lt;br /&gt;
　xuggleのファイル出力時に変換後データのタイプとフレーム情報がわかるので、擬似的にキーフレームを選択して、分割候補にすることに成功した。&lt;br /&gt;
(このときにはmpegtsのファイルの内部構造にまでは口をだしてなかった。)&lt;br /&gt;
&lt;br /&gt;
第８号：flazr + xuggle(マルチ出力)&lt;br /&gt;
　xuggleの出力コンテナをいくつか準備することで変換自体は１度しかおこなわないが、いろんなコンテナのファイルを出力できるというものを書いてみた。&lt;br /&gt;
&lt;a href=&quot;https://github.com/taktod/streaming/tree/mediastreaming&quot;&gt;https://github.com/taktod/streaming/tree/mediastreaming&lt;/a&gt;&lt;br /&gt;
いろいろ拡張したところこうなった。&lt;br /&gt;
動作はそこそこだが、ここでいくつか問題があることがわかった。&lt;br /&gt;
　xuggleの変換だと、３つほど同時に変換を実行したら急に動作がわるくなった。&lt;br /&gt;
よってxuggle-xuggler-red5みたいにアクセスのあるストリームを個別に変換するという処理はありえなくなった。(1プロセスで複数変換を走らせることになるため)&lt;br /&gt;
また、プロセスを別にしても動作の改善がみられなかったのでJNIとマルチプロセスの相性がわるいような気がしました。&lt;br /&gt;
　大量のコンテナ出力を実行したところやはり負荷があがった。&lt;br /&gt;
どうやらコンテナ変換動作もあまり得意ではなさそう。&lt;br /&gt;
(rtmp inputでflv中低、mpegts中低)という出力をやってみたところ動作が芳しくなくなった。&lt;br /&gt;
　遅延を抑制するために、javaのプログラムをマルチスレッド化して動作するようにしてみたんですが、今度はxuggleの動作が微妙になってきた。(コンバートがおかしくなったりもした。)ここでだいぶxuggle熱が下がりました。&lt;br /&gt;
　ちなみにwebM出力をつくるためstream-mとmatroskaのドキュメントを解析し、webMについて詳しくなった。&lt;br /&gt;
&lt;br /&gt;
第９号：flazr + avconv + jsegmenter&lt;br /&gt;
　変換動作をいろいろいじってみたところ結果的にavconvやffmpegをそのままプロセスとして実行してもらった方がコストがいいことがわかりました。&lt;br /&gt;
　仕方ないのでmpegtsの分割を自力でやってみることにしました。で、mpegtsがどういうものであるか学習していった。副産物としてmp3もHttpLiveStreamingでながせることがわかった。で、mp3がどういうものであるかも学習した。&lt;br /&gt;
その結果：&lt;br /&gt;
１：キーフレームで分割できるようになった。&lt;br /&gt;
２：mpegts出力ファイルのtimepositionがわかるようになった。&lt;br /&gt;
３：mp3でもHttpLiveStreamingできることがわかった。(appleとしては非公式サポートフォーマットかもしれませんね。)&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://github.com/taktod/jsegmenter&quot;&gt;https://github.com/taktod/jsegmenter&lt;/a&gt;&lt;br /&gt;
で、こんなものができた。&lt;br /&gt;
まぁ、mediaStreamingでつかっていたパケット解析の部分の流用であります。&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
HttpLiveStreamingを「変換して生成する」場合にはキーフレームの挿入タイミングをffmpegのコマンドで調整して、生成mpegtsをキーフレームごとに分割して配置するということをやると一番ライブストリームに適合した動作になることがわかりました。&lt;br /&gt;
また、mpegts出力側のtimepositionがわかるので、ffmpegの変換遅延とCPUの利用状況を確認できるようになりました。&lt;br /&gt;
&lt;br /&gt;
このころのプログラムでは、この３つのプログラムをパイプでつないで動作させてました。入力データのcodecやフレーム状況がかわった場合にプロセスごと作成しなおすという動作をやっていました。&lt;br /&gt;
&lt;br /&gt;
第10号：flazr + avconv&lt;br /&gt;
　第９号の動作をつくったあとに、まだたまに変換動作がうまくいかない放送があることに気づきました。問題点は以下２点&lt;br /&gt;
１：プロセスの作成停止を繰り返すのはサーバーにやさしくない。(ゾンビプロセス等ができる可能性が高い。)&lt;br /&gt;
２：rtmpの入力データは放送している環境に依存して、ffmpegが再生プレーヤーで扱いにくいものになる可能性がある。またそのおかげでコンバート待ちが発生したりする。&lt;br /&gt;
&lt;br /&gt;
　まず１点目、６号でsegmenterからsegment作成時にphpをキックするという動作を書いていましたが、このやり方だと、大量のプロセスが使い捨てになります。また中途で放送がとまった場合や、動作開始後一定時間音声しかこない場合は、あきらめて音声のみのコンバートにまわすなど、いろいろな要素でなにかある度にプロセスを立ち上げ直すという動作を実行していました。&lt;br /&gt;
　→結果としてたまにCPUを占領してしまうプロセスができたりします。&lt;br /&gt;
　CPUのおおいサーバーをつかっている場合はこのままでも問題ないのですが、CPUがそれほどない場合は結構致命的になります。&lt;br /&gt;
　この対策として、１０号では、flazrのプロセスは基本的に止めない形にしました。&lt;br /&gt;
flazrのプロセスが転送データの状態を確認して、必要があれば、avconvのプロセスをProcessBuilderで制御します。&lt;br /&gt;
&lt;br /&gt;
　次に２点目、入力データがよろしくないとコンバートに影響がでる件。&lt;br /&gt;
まずは、silenceLevel問題&lt;br /&gt;
&lt;a href=&quot;http://livedocs.adobe.com/flash/9.0_jp/ActionScriptLangRefV3/flash/media/Microphone.html#setSilenceLevel()&quot;&gt;http://livedocs.adobe.com/flash/9.0_jp/ActionScriptLangRefV3/flash/media/Microphone.html#setSilenceLevel()&lt;/a&gt;&lt;br /&gt;
途中で入力音量が小さくなったら音がないと判定する件。余計な音を拾わないので放送する側にとってはあると助かる機能ですが、ffmpegにとってはあってもらったらこまる機能になります。というのも音声パケットが欠損するとffmpegのコンバートは停止してしまいます。停止するということは、視聴が止まるしどんどん実際の放送との遅れがどんどんのびていきます。&lt;br /&gt;
　続いて映像がない場合の問題。rtmpでライブストリームしているときにUSBカメラを物理的に抜いてしまうと映像側の転送データがなくなります。こうなると音声同様コンバートが止まる訳です。さらにsegmentの作成方法が基本映像データのキーフレームにしてあるので、そもそもsegmentができない(もしくは切れずに大きなものになっていく。)という状況になります。&lt;br /&gt;
というわけでこちらも対処してあります。&lt;br /&gt;
以前の記事で何回か無音mp3をつくるという記事をつくっていますが、flvは構造が単純なため、無音mp3や適当な動画データを織り込んでやることが可能です。&lt;br /&gt;
&lt;br /&gt;
　10号では、さらにリアルタイム性の確認方法も織り込んであります。&lt;br /&gt;
&lt;br /&gt;
というわけで10号は結果的に次のようになっています。&lt;br /&gt;
１：コンバート安定化対策&lt;br /&gt;
　・音声がない場合は無音mp3を挿入する。&lt;br /&gt;
　・映像がない場合は代替flvを挿入する。&lt;br /&gt;
　・音声が中途で欠損した場合は最終音声を1秒ごとに挿入してコンバートが中途でとまらないようにしてある。&lt;br /&gt;
　・コーデック情報を常に監視して変更した場合は速やかにコンバート書け直しを実施する。&lt;br /&gt;
２：動作安定化対策&lt;br /&gt;
　・segmenterやアップロードすべてFlazrにやらせることでプロセスはすくなくしておく。&lt;br /&gt;
　・変換入力データと出力データのtimestampを把握することで変換効率をリアルタイム監視&lt;br /&gt;
　・生成データの転送効率も監視しておく。&lt;br /&gt;
　・プロセス管理の方法をredis等外部kvsに依存させることで他のプロセスで動作レジュームが可能にした。&lt;br /&gt;
　・復旧までにかかるタイミングを2秒以内に設定&lt;br /&gt;
という形に固まりました。&lt;br /&gt;
&lt;br /&gt;
で、この魔改造を施したシステムですが、実際にはこうなりました。&lt;br /&gt;
&lt;a href=&quot;https://github.com/taktod/TakStreaming2/commits/master&quot;&gt;https://github.com/taktod/TakStreaming2/commits/master&lt;/a&gt;&lt;br /&gt;
また、入力するデータにまで口を出せば遅延10秒以内はいけるみたいです。&lt;br /&gt;
&lt;br /&gt;
実践投入の方も去年の終わりぎりぎりに会社のシステムに織り込めて、売り上げもあがりました。&lt;br /&gt;
(注：ちなみにコンバート安定化対策はそのままffmpegのコンバートコスト低減対策になります。)&lt;br /&gt;
&lt;br /&gt;
で次の予定ですが、&lt;br /&gt;
第11号：flazr + avconv(予定)&lt;br /&gt;
　10号で音声が欠如したときに、最終音声をいれてコンバートを促すという手法をとったわけですが、この方法、最終音声が無音ではなかった場合、その音が繰り返されるという問題があります。今のところ無音mp3については研究してあるので、他の無音speexとかをつくれば同じことができるのですが、いろんなコーデックが選択可能だし、bitrateとかの兼ね合いもあるので、その辺りどうすべきか調査して折り込みたいところです。一応、無パケットメディアタグというのがあるみたいなので、そちらをいれて動作するなら、すごくうれしいですね。簡単だし。&lt;br /&gt;
　あとは、再変換要求すべき状態を見極めて、プロセスの再起動が必要ないところがあれば、再起動せず、あたらしいメディアデータを注入したいところ。&lt;br /&gt;
　&lt;a href=&quot;https://github.com/taktod/stdinFlazr&quot;&gt;https://github.com/taktod/stdinFlazr&lt;/a&gt;&lt;br /&gt;
こちらでrtmpによるpublish操作を書いてみましたが、変換したデータをサーバーにあげ直すという動作もやってみたいところです。wowzaでコンバート動作がサポートされてるし、ffmpegで入力出力両方にrtmpdumpプラグインを指定できるので、なくてもよさそうですが、前者はコストが高い、後者は接続の安定性が微妙という問題があるので、まぁ意味はありそうです。&lt;br /&gt;
&lt;br /&gt;
　&lt;a href=&quot;http://poepoemix.blogspot.jp/2013/02/musictubeweb.html&quot;&gt;MusicTubeの件&lt;/a&gt;でmp4の音声部分のみ抜き出しプログラムを書いていますがmp4のmoofというボックスを使えば、再生可能端末が限られますがmp4でもliveStreamingできるみたいですね。また、webMのストリーミングも同じ手法でできるみたいです。&lt;br /&gt;
このあたりのことにも最近は興味あります。webMとmp4とm3u8でライブストリーミングできるようにしておけば、html5だけでライブストリーミングできるようになると思いますね。&lt;br /&gt;
&lt;br /&gt;
　なお、技術協力ほしいという方おりましたら、連絡いただけるとうれしいです。&lt;br /&gt;
上記にあげている内容はほぼすべてこのブログとgithubにあげてますが、細かい微妙な部分での差異等は伝えきれていないと思っています。&lt;br /&gt;
　その辺りどういう情報が必要なのかわかりましたら、ブログの記事にしてどんどん情報公開していきたいですね。</content><link rel='replies' type='application/atom+xml' href='http://poepoemix.blogspot.com/feeds/7005917680487436842/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://poepoemix.blogspot.com/2013/02/httplivestreamingiphone.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/7005917680487436842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/7005917680487436842'/><link rel='alternate' type='text/html' href='http://poepoemix.blogspot.com/2013/02/httplivestreamingiphone.html' title='いままでつくったHttpLiveStreaming(iPhone用)のまとめ'/><author><name>poepoemix</name><uri>http://www.blogger.com/profile/05463016011577425897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmArlhv0g68lJB1e7v48w7IYddGoy8Cs8CdCdERcrqQs3pFGiA5SsoRZuc5uaBo-74FqMhnS_R34dGfKWD0AIsGj0lZuGflE3qWNLudYZlDPWeoHI4kOYjytiIFIQ6lQ/s220/atsui.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6573067931953719719.post-383981271506672855</id><published>2013-02-11T17:53:00.003+09:00</published><updated>2013-02-11T17:53:28.730+09:00</updated><title type='text'>MusicTubeというwebアプリをつくってみました。</title><content type='html'>先日&lt;a href=&quot;http://poepoemix.blogspot.jp/2013/01/mp4off.html&quot;&gt;mp4から映像をOFFにするという記事&lt;/a&gt;を書いたわけですが、それを応用したjettyで書いたプロキシーサーバーと適当なwebアプリを準備してみました。&lt;br /&gt;
&lt;br /&gt;
このwebアプリを使えばyoutubeのデータをiOS6.1の端末でもBGMとして流しつつ別のアプリに移動することができます。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;object width=&quot;320&quot; height=&quot;266&quot; class=&quot;BLOGGER-youtube-video&quot; classid=&quot;clsid:D27CDB6E-AE6D-11cf-96B8-444553540000&quot; codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0&quot; data-thumbnail-src=&quot;http://i.ytimg.com/vi/_9xK37nBT5s/0.jpg&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/_9xK37nBT5s?version=3&amp;f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata&quot; /&gt;&lt;param name=&quot;bgcolor&quot; value=&quot;#FFFFFF&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot; /&gt;&lt;embed width=&quot;320&quot; height=&quot;266&quot;  src=&quot;http://www.youtube.com/v/_9xK37nBT5s?version=3&amp;f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata&quot; type=&quot;application/x-shockwave-flash&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;a href=&quot;http://taktodtools.appspot.com/musicTube/index.html?#main&quot;&gt;http://taktodtools.appspot.com/musicTube/index.html?#main&lt;/a&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5-oiK2Oc1Pg7v4KUURyHE7PUsBLD8RHCO8SN2ctJV9hgwE_e_ZrH-jYAFI6oA8sAd6CsgslF1Fd6Ni17qc5XjYdhI1PI5WQRaFCyqfUtBbmWwgPH_vZYoHLUYCplLuLes-HkfGwgwgCI/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-11+17.16.03.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;331&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5-oiK2Oc1Pg7v4KUURyHE7PUsBLD8RHCO8SN2ctJV9hgwE_e_ZrH-jYAFI6oA8sAd6CsgslF1Fd6Ni17qc5XjYdhI1PI5WQRaFCyqfUtBbmWwgPH_vZYoHLUYCplLuLes-HkfGwgwgCI/s400/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-11+17.16.03.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
iOS 6.1以降のiPhoneで音楽を聴くためにつくったわけですが、上記のようにChromeやSafariでも動作し、ちゃんと音楽聴けるみたいです。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpQm8FHLS9gEkdFY3E8JbqZsXHuVfauF-lhtYzWmJ-ximvXUjzs947V4-ZvGZqcZvdib-kKU8Cy6O5zbBqqNfJBb_xZBPESEsudDBfcOVyZ_fRrcSiDVFyzvwXU5wEScmiBi4nauMAmNI/s1600/IMG_0237.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpQm8FHLS9gEkdFY3E8JbqZsXHuVfauF-lhtYzWmJ-ximvXUjzs947V4-ZvGZqcZvdib-kKU8Cy6O5zbBqqNfJBb_xZBPESEsudDBfcOVyZ_fRrcSiDVFyzvwXU5wEScmiBi4nauMAmNI/s320/IMG_0237.PNG&quot; width=&quot;213&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
まずは使い方&lt;br /&gt;
検索ボックスに適当な検索キーワードをいれて、実行するとyoutubeの検索を実施して、結果が表示されます。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitq3SY5ROWN0_GVI8E-EpfgyBLjahUyDyspIqkPOGdiBedqZptkgGCZIF_IP0zJoZXsZKZfVf-2frN_qvdhemPizLvVELDDT5iya63EHw2i860Ailr9V_Ge9mv_2Pe06VB8-oKTA0wrzA/s1600/IMG_0240.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitq3SY5ROWN0_GVI8E-EpfgyBLjahUyDyspIqkPOGdiBedqZptkgGCZIF_IP0zJoZXsZKZfVf-2frN_qvdhemPizLvVELDDT5iya63EHw2i860Ailr9V_Ge9mv_2Pe06VB8-oKTA0wrzA/s320/IMG_0240.PNG&quot; width=&quot;213&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
ここでSearchのボタンをクリックすれば検索されます。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyD2CHgrVfoP67kitZveYsLy08xLJ26ebZ0DBEXScbamtV_PHRtEE7W-1duaVQ0cZirHI8y_0h6n6GnWOh8TwTrw-ayH-FGH0PjduxlDltqFU8uTHFhDFucXqn-UkGaQE8s1RFo6Bv8No/s1600/IMG_0241.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyD2CHgrVfoP67kitZveYsLy08xLJ26ebZ0DBEXScbamtV_PHRtEE7W-1duaVQ0cZirHI8y_0h6n6GnWOh8TwTrw-ayH-FGH0PjduxlDltqFU8uTHFhDFucXqn-UkGaQE8s1RFo6Bv8No/s320/IMG_0241.PNG&quot; width=&quot;213&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
結果はこんな感じ。この状態で左の画像かタイトルをタップすると音楽の再生がはじまります。&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwL7snBK7DKFygFUUvvK7aZTEk72UHdoQM5qLGIMj6ImtEQ1cVPNnS4luyen8HlYhGvJDPZ3fW7efj4LslAyoj7WWVxQo4hG2QYx_8na6sz8t-_v64NxNxxXdGWPw6jvvvWWcFvVFwtHg/s1600/IMG_0242.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwL7snBK7DKFygFUUvvK7aZTEk72UHdoQM5qLGIMj6ImtEQ1cVPNnS4luyen8HlYhGvJDPZ3fW7efj4LslAyoj7WWVxQo4hG2QYx_8na6sz8t-_v64NxNxxXdGWPw6jvvvWWcFvVFwtHg/s320/IMG_0242.PNG&quot; width=&quot;213&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
右の(+)をタップするとマイリストに登録され、次回からは検索しなくても再生することができます。&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiBAfkQUT26019FQLuZzhtZyna9HDKsQVaGrsskYNs1tJIaw-DQMN_D_eCYk3vFHzlXmY-UlD5Mcv9Pd15TpHe8pGyu9NAky3XTShc3v90VMZkqyxwu8NRaJLmUvogE9u2raY4VELBdAQ/s1600/IMG_0238-1.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiBAfkQUT26019FQLuZzhtZyna9HDKsQVaGrsskYNs1tJIaw-DQMN_D_eCYk3vFHzlXmY-UlD5Mcv9Pd15TpHe8pGyu9NAky3XTShc3v90VMZkqyxwu8NRaJLmUvogE9u2raY4VELBdAQ/s320/IMG_0238-1.PNG&quot; width=&quot;213&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
また、右上の[三]みたいなところをタップすると左にメニューを出すことができます。&lt;br /&gt;
メニューでは、上から順にいくつか項目があります。&lt;br /&gt;
&lt;br /&gt;
musicTube&lt;br /&gt;
・home：はじめの画面および、検索結果画面に移動します。&lt;br /&gt;
・[search youtube...]：youtubeの動画検索を実施する簡易検索ボックス&lt;br /&gt;
・my list：検索結果から、リストを保存した場合のリストを参照できます。&lt;br /&gt;
playing&lt;br /&gt;
・：再生中のタイトルが表示されます。&lt;br /&gt;
setting&lt;br /&gt;
・---：リピートをするかのフラグです。---リピートしない、repeat終わったらサイド再生する。&lt;br /&gt;
・one track：再生の方式を変更します。one trackその曲のみ流す all track my list上の全曲を流す。&lt;br /&gt;
・clear my list：my listのデータを削除します。&lt;br /&gt;
・skin：webアプリのスキンを変更します。&lt;br /&gt;
information&lt;br /&gt;
・version：現在のプレーヤーのバージョンです。&lt;br /&gt;
・contact author：作者へのコンタクト情報です。&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNAlgKeZW8JbzMBN68JopkkFji-ur42Ghal5P47XAKfi29GsPfR4_oOK3qZTH4n0naN6uScDIfOH-XwdVChSMHIXhRld94wtCCqh8jE4JRgSrvOjJ04foMdWjaxYFHF_XJlBcspHMM6qs/s1600/IMG_0239-1.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNAlgKeZW8JbzMBN68JopkkFji-ur42Ghal5P47XAKfi29GsPfR4_oOK3qZTH4n0naN6uScDIfOH-XwdVChSMHIXhRld94wtCCqh8jE4JRgSrvOjJ04foMdWjaxYFHF_XJlBcspHMM6qs/s320/IMG_0239-1.PNG&quot; width=&quot;213&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
スキンを変更するとこんな感じになります。&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihrubaAddkJ2HR9vrHQgCBZbizUzrA6e3VwbX11AikuTCURHlTfLXfoEs4QkAKPYABPq4vPxGDaDCMpCxfnni5m9mdsxle6sTKBakzEIvMH2Mx4qNl-H_PblkC9hvgm_ZR86weg5o-NDI/s1600/IMG_0244.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihrubaAddkJ2HR9vrHQgCBZbizUzrA6e3VwbX11AikuTCURHlTfLXfoEs4QkAKPYABPq4vPxGDaDCMpCxfnni5m9mdsxle6sTKBakzEIvMH2Mx4qNl-H_PblkC9hvgm_ZR86weg5o-NDI/s320/IMG_0244.PNG&quot; width=&quot;213&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
MyListでは(ー)で指定トラックの削除 ▲▼でトラックの入れ替えが実行できます。&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtApbSZo-P7UHYzEI0-40vvBccuuLLheWzMm56jMS4ITEFpbfetY-LfFpoC0HZxMn5RXN8i44upIaFPs_036DS7Z9zKgNye2jKw-MO5zbvNzQqCJ0ICYi0G87eu5pyx4sCfvGfnfdwP1I/s1600/IMG_0246.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtApbSZo-P7UHYzEI0-40vvBccuuLLheWzMm56jMS4ITEFpbfetY-LfFpoC0HZxMn5RXN8i44upIaFPs_036DS7Z9zKgNye2jKw-MO5zbvNzQqCJ0ICYi0G87eu5pyx4sCfvGfnfdwP1I/s320/IMG_0246.PNG&quot; width=&quot;213&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
このように順番を変えたり、必要のないトラックを削除できます。&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga2NCVlnEbufwQxOSdVLqrtpce3B8ShWUW2wHIQugdu7uq-X9tRYAbsYR4mbjUxHfTaw7xo6_qJDF4l2dKLMjdjB7MSt9hSBzicneutms6y4Pc3IlIGGnXnmuIP7eMJ8-fkSBdUoSw0ng/s1600/IMG_0247.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga2NCVlnEbufwQxOSdVLqrtpce3B8ShWUW2wHIQugdu7uq-X9tRYAbsYR4mbjUxHfTaw7xo6_qJDF4l2dKLMjdjB7MSt9hSBzicneutms6y4Pc3IlIGGnXnmuIP7eMJ8-fkSBdUoSw0ng/s320/IMG_0247.PNG&quot; width=&quot;213&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
iPhoneの下のところにあるコントローラーでも&lt;br /&gt;
再生、停止と次のトラックへ移動がコントロールできます。&lt;br /&gt;
&lt;br /&gt;
こんな感じです。&lt;br /&gt;
まだちょっとバグがあるみたいで、(主にjqmobiのバグ)、左のメニューでmyListを選択したのに、home側に強制的に移動してしまったりすることがあるみたいです。そのときは、ブラウザのリロードを実行してみてください。&lt;br /&gt;
&lt;br /&gt;
とりあえずは、こんなところです。&lt;br /&gt;
ではでは</content><link rel='replies' type='application/atom+xml' href='http://poepoemix.blogspot.com/feeds/383981271506672855/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://poepoemix.blogspot.com/2013/02/musictubeweb.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/383981271506672855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/383981271506672855'/><link rel='alternate' type='text/html' href='http://poepoemix.blogspot.com/2013/02/musictubeweb.html' title='MusicTubeというwebアプリをつくってみました。'/><author><name>poepoemix</name><uri>http://www.blogger.com/profile/05463016011577425897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmArlhv0g68lJB1e7v48w7IYddGoy8Cs8CdCdERcrqQs3pFGiA5SsoRZuc5uaBo-74FqMhnS_R34dGfKWD0AIsGj0lZuGflE3qWNLudYZlDPWeoHI4kOYjytiIFIQ6lQ/s220/atsui.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5-oiK2Oc1Pg7v4KUURyHE7PUsBLD8RHCO8SN2ctJV9hgwE_e_ZrH-jYAFI6oA8sAd6CsgslF1Fd6Ni17qc5XjYdhI1PI5WQRaFCyqfUtBbmWwgPH_vZYoHLUYCplLuLes-HkfGwgwgCI/s72-c/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-11+17.16.03.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6573067931953719719.post-6584970067228598391</id><published>2013-02-09T15:29:00.000+09:00</published><updated>2013-02-09T15:29:28.801+09:00</updated><title type='text'>とりあえずそれっぽいjetty開発環境ができた。</title><content type='html'>jettyの開発をeclipse上でうまい感じにする方法をさがしていたところ次のようになりました。&lt;br /&gt;
&lt;br /&gt;
まず、m2eclipseをインストールします。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuny4i2E3DmvA8MFsI3cKeoJl-pqKtWGVhYApeAD0hpW38e4xzXxw0PHwNrvKxujdXAZqtQrNZsWvZ_fZAY3OjGxl3YYbrxedfrvtibgY5QT7swhBYF99Xd_8_RF90IuR2hsHtq9o0Joo/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-09+15.05.17.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;301&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuny4i2E3DmvA8MFsI3cKeoJl-pqKtWGVhYApeAD0hpW38e4xzXxw0PHwNrvKxujdXAZqtQrNZsWvZ_fZAY3OjGxl3YYbrxedfrvtibgY5QT7swhBYF99Xd_8_RF90IuR2hsHtq9o0Joo/s400/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-09+15.05.17.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
新規作成から、その他を選択して、wizardの選択肢から、Maven Projectを選択します。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC88gVRJWu5A4PLwiUD4BWp7lt0jFs-6IkZVeH4ZDXf-R5a20MZBXsHpwESYY8gdy0Yah9PvSAKtttFYxH-vJ9LEDQ1n6MzKLAaEpwoSSmKfGqpR2vcZDxA1nEZX08K8CNqDzs9VrI1Q4/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-09+15.06.33.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;382&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC88gVRJWu5A4PLwiUD4BWp7lt0jFs-6IkZVeH4ZDXf-R5a20MZBXsHpwESYY8gdy0Yah9PvSAKtttFYxH-vJ9LEDQ1n6MzKLAaEpwoSSmKfGqpR2vcZDxA1nEZX08K8CNqDzs9VrI1Q4/s400/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-09+15.06.33.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
次の選択はプロジェクトをどこに置くかなので、そのまま進みます。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9thKphFkBoipJqzbc2nWY1QWa-bIrZENeU-7qtqBDLEkmfpQLDeKTsORlyv1RAP7KCdUhqZzTycQ7FuNLC-dkbv869MUmnKgBAZhwuhWoMYzK_eCM97ta7jtV8RQKIcDZ4fjUSXO7-IM/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-09+15.08.23.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;291&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9thKphFkBoipJqzbc2nWY1QWa-bIrZENeU-7qtqBDLEkmfpQLDeKTsORlyv1RAP7KCdUhqZzTycQ7FuNLC-dkbv869MUmnKgBAZhwuhWoMYzK_eCM97ta7jtV8RQKIcDZ4fjUSXO7-IM/s400/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-09+15.08.23.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
次の選択でprojectのテンプレートを選択します。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2QOdBhlXTII0oB7syF7rhAKVOnBDViYm3RHYG3umXLlyBlH0OFENeWocy981V73LzL14Rv4IqIQvSk3f5nsxdeG14nvNSfxlDTLnhUaou5jO6cJW4tcs0dZsAYlXYj-SRauZVzf01Syo/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-09+15.09.28.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;343&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2QOdBhlXTII0oB7syF7rhAKVOnBDViYm3RHYG3umXLlyBlH0OFENeWocy981V73LzL14Rv4IqIQvSk3f5nsxdeG14nvNSfxlDTLnhUaou5jO6cJW4tcs0dZsAYlXYj-SRauZVzf01Syo/s400/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-09+15.09.28.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
とりあえずjetty用のwebappを作りたいので一番デフォルトと思われる&lt;br /&gt;
maven-archetype-webappを選択します。&lt;br /&gt;
&lt;br /&gt;
続いてプロジェクトの詳細を入力していきます。&lt;br /&gt;
GroupIDは出力ファイルに直結するみたいです。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzlUBDCQzysOo5XjsicOfbPaEoQSRONphpkV18oVEnoZsbMnOaYgfn6W5dO4PC-1d4xpAOUEWbaw181vJ3xh76_pTLlwcBkpTU0We2Ghd6ldlbkn0VVhhwyxrkLbfjQIFa3coxP35mXG8/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-09+15.11.20.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;341&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzlUBDCQzysOo5XjsicOfbPaEoQSRONphpkV18oVEnoZsbMnOaYgfn6W5dO4PC-1d4xpAOUEWbaw181vJ3xh76_pTLlwcBkpTU0We2Ghd6ldlbkn0VVhhwyxrkLbfjQIFa3coxP35mXG8/s400/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-09+15.11.20.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
とりあえずプロジェクトができました。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiadeQpkguj5rfhaWZJhXxp5Sl3w3JCFvECEn8Y9wGIZeMQl31zSw6-5kIcoBtZQOYiBzbYvM0qg53P54kjkEsp0BzAqbSMRgyuSQl99v6AGKXhiH8ECpE3KpAEgVWhL-sDcwXJ2nd9Nhg/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-09+15.12.46.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiadeQpkguj5rfhaWZJhXxp5Sl3w3JCFvECEn8Y9wGIZeMQl31zSw6-5kIcoBtZQOYiBzbYvM0qg53P54kjkEsp0BzAqbSMRgyuSQl99v6AGKXhiH8ECpE3KpAEgVWhL-sDcwXJ2nd9Nhg/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-09+15.12.46.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
必要なものを追加します。&lt;br /&gt;
まず、servletを書くのでservlet用の依存関係を追加します。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhT5NBRSPMm6MuY5xl4W_7dQ2xwgDSktuWaQ3OKD7hBEmCRkhs3mCR1QU8uNGbHlSiNzq1UwkUKXa8kCXAUkU4Um7EQFGEjFWeGushvS2wNjZixx7D5Pc8UKcCPrnGAwrp-auVQHhf4a1I/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-09+15.18.00.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;284&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhT5NBRSPMm6MuY5xl4W_7dQ2xwgDSktuWaQ3OKD7hBEmCRkhs3mCR1QU8uNGbHlSiNzq1UwkUKXa8kCXAUkU4Um7EQFGEjFWeGushvS2wNjZixx7D5Pc8UKcCPrnGAwrp-auVQHhf4a1I/s320/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-09+15.18.00.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3k880ZqQpbm5TvhXHAcGXJqpiDkdGiQfjrq9zJ5QTXlNgE6BhJUV_9Nxhsmz1-E5MbU7l6fCBIG8sz8qXCRYvhXWp0PaEhGgW9zXx2O7PfRgFRvoINNEbAhMmoATr_zMh9aL-8dOFVrc/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-09+15.18.48.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;301&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3k880ZqQpbm5TvhXHAcGXJqpiDkdGiQfjrq9zJ5QTXlNgE6BhJUV_9Nxhsmz1-E5MbU7l6fCBIG8sz8qXCRYvhXWp0PaEhGgW9zXx2O7PfRgFRvoINNEbAhMmoATr_zMh9aL-8dOFVrc/s320/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-09+15.18.48.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
つづいて、pluginとしてjettyを追加 eclipse側の9.0.0を追加したかったんですが、java7必須っぽいので、mortbayのjetty8でいってみることにします。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju_4jYsh_vwNEDecUMandnmLsu6O9ZZvZD5LN_ANZePzTKOelZaJQSegPqC9LoCBRRGzbVdjBCx1Xj1ht554mDthr_V0kuWCHXv7xbXt_t_trDP1LPic3Fj5xR-kbXR_8ZoT2xkXRW2Xs/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-09+15.19.38.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju_4jYsh_vwNEDecUMandnmLsu6O9ZZvZD5LN_ANZePzTKOelZaJQSegPqC9LoCBRRGzbVdjBCx1Xj1ht554mDthr_V0kuWCHXv7xbXt_t_trDP1LPic3Fj5xR-kbXR_8ZoT2xkXRW2Xs/s320/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-09+15.19.38.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
とりあえずコンパイル起動してみたいので、Run Configurationをいじります。&lt;br /&gt;
Maven Buildに新規追加します。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgX4nUELqgyE5RMpM-Ef_YJbOUN_uBHoIdQGJDeGGzTBGKro-h82nMmh_0He6p8ERdfDOGtibBNdkF79jg3aVTTFBghKqnSreVtNyavrUhvSEM_HIWHEdmGakN2u5QLwt2efONg5OnF3ts/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-09+15.23.12.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;292&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgX4nUELqgyE5RMpM-Ef_YJbOUN_uBHoIdQGJDeGGzTBGKro-h82nMmh_0He6p8ERdfDOGtibBNdkF79jg3aVTTFBghKqnSreVtNyavrUhvSEM_HIWHEdmGakN2u5QLwt2efONg5OnF3ts/s400/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-09+15.23.12.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
で実行する。&lt;br /&gt;
ダウンロードがいくつか進んだりしてから、jettyサーバーが起動します。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNrsdOcUyqosh7e8Mciy8wVnzJwZpPEk4XBohhwEZmZBCAnWc01qcwZ8RKLTfn-a9XAMycXzRVb27ztyC2cTNG9kngvgWA-SP0erPk0F1G8xJVUApzFX4Q6aDqyk8a6gh3QG6rY652Gj0/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-09+15.24.45.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;85&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNrsdOcUyqosh7e8Mciy8wVnzJwZpPEk4XBohhwEZmZBCAnWc01qcwZ8RKLTfn-a9XAMycXzRVb27ztyC2cTNG9kngvgWA-SP0erPk0F1G8xJVUApzFX4Q6aDqyk8a6gh3QG6rY652Gj0/s400/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-09+15.24.45.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
アクセスするとこうなります。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiQE9es-qm3hJc0-p5QgDD1CzIe3xILNbYnfTPNjr_BClfwrw77MRrHGOvA9mxFReE9qPcdG-Ze5sRmJarH0QV276TFDat5VbNKGeVhOHlx6ZN6sYmRGwCRTzn_tX6yewB4d3Fh5TZRZ4/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-09+15.25.00.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiQE9es-qm3hJc0-p5QgDD1CzIe3xILNbYnfTPNjr_BClfwrw77MRrHGOvA9mxFReE9qPcdG-Ze5sRmJarH0QV276TFDat5VbNKGeVhOHlx6ZN6sYmRGwCRTzn_tX6yewB4d3Fh5TZRZ4/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-09+15.25.00.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
これで一応開発できるんですが、ちょっとだけpom.xmlをいじっておきます。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj336tdeN_BtBAqevCJ42wQGwKaxUrwpeeqIzWxbiLkQDnThZWrf5dz2n_aVCzEYcxUJCrxzZppTslFTsp-IjGSy3JdT2r869464iGecOO4JwpZEYrCv8S6ap4C3S9HO-ESBsXlomq8OK4/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-09+15.27.00.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;168&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj336tdeN_BtBAqevCJ42wQGwKaxUrwpeeqIzWxbiLkQDnThZWrf5dz2n_aVCzEYcxUJCrxzZppTslFTsp-IjGSy3JdT2r869464iGecOO4JwpZEYrCv8S6ap4C3S9HO-ESBsXlomq8OK4/s320/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-09+15.27.00.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
設定を追加しておきました。&lt;br /&gt;
こうしておくと、自動的にwebAppのプログラムを書き換えたら、読み込み直しが走るようにできるみたいです。&lt;br /&gt;
&lt;br /&gt;
では、servletのプログラムでも書き書きしていこう。</content><link rel='replies' type='application/atom+xml' href='http://poepoemix.blogspot.com/feeds/6584970067228598391/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://poepoemix.blogspot.com/2013/02/jetty_9.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/6584970067228598391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/6584970067228598391'/><link rel='alternate' type='text/html' href='http://poepoemix.blogspot.com/2013/02/jetty_9.html' title='とりあえずそれっぽいjetty開発環境ができた。'/><author><name>poepoemix</name><uri>http://www.blogger.com/profile/05463016011577425897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmArlhv0g68lJB1e7v48w7IYddGoy8Cs8CdCdERcrqQs3pFGiA5SsoRZuc5uaBo-74FqMhnS_R34dGfKWD0AIsGj0lZuGflE3qWNLudYZlDPWeoHI4kOYjytiIFIQ6lQ/s220/atsui.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuny4i2E3DmvA8MFsI3cKeoJl-pqKtWGVhYApeAD0hpW38e4xzXxw0PHwNrvKxujdXAZqtQrNZsWvZ_fZAY3OjGxl3YYbrxedfrvtibgY5QT7swhBYF99Xd_8_RF90IuR2hsHtq9o0Joo/s72-c/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-09+15.05.17.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6573067931953719719.post-253051004463139268</id><published>2013-02-07T21:18:00.000+09:00</published><updated>2013-02-07T21:18:21.998+09:00</updated><title type='text'>ffmpegやavconvのパフォーマンス改善案ってどんなのあったっけ？</title><content type='html'>　ffmpegやavconvは動画を扱うサイトなら、だいたいつかっているopenSource界の重鎮です。で、会社でこのコンバートまわりのチューニングする必要がでてきそうなので、その前にいままでを振り返ってなにができるのか、ブログにまとめておきたいと思います。いままでも何回か書いたことあるので、重複にはなりますが、まぁ自分用のまとめってことで・・・&lt;br /&gt;
　僕の領分はrtmpとflv、mp4、mp3、mpegts、mkvこのあたりです。あとはmidiってのも扱ったことがあります。&lt;br /&gt;
&lt;br /&gt;
　つづいてターゲットとなるソース。rtmpに流れているデータが対象になります。特徴としては、rtmp→flvの変換は非常に容易になっていること。ただし、flvはtimestampが絶対値で書かれているのに対し、rtmpでは相対かつ映像と音声で扱いが独立していること。&lt;br /&gt;
中途で片方のメディアデータが欠損することも別のコーデックや設定に切り替わることも許可していること。こんな感じです。&lt;br /&gt;
　出力周りの要件としては、mp4、webm(mkv)、flv、httpLiveStreaming(mpegts、mp3)といったところです。&lt;br /&gt;
　動作の要件としては、httpLiveStreamingに変換してライブで映像を流すなら、なるべくリアルタイムな動作ができるように調整する必要あるし、同じhttpLiveStreamingにするとしてもVOD用のファイルをつくるなら、セグメントの大きさとかに注意して帯域が乱高下するようなデバイスでも必要なデータバッファが保持できるような構成にするとか考慮できます。&lt;br /&gt;
&lt;br /&gt;
　で、パフォーマンスをあげましょう。&lt;br /&gt;
１：flvデータを事前に修正してやったら負荷が下がる。&lt;br /&gt;
データの欠損や並び順がおかしいことがあるのでcodec copyで一度変換に通してやることでそのあたりの修正をいれることが可能です。&lt;br /&gt;
flvtoolをつかったり、codec copyをつかった変換プログラムに通したり、自力で修正したりすればいいです。&lt;br /&gt;
codec copyを使う場合の注意ですが、できたらコンテナ変換した方が修正できる可能性があがります。(そうでない場合は中途で変換がとまったりする。)&lt;br /&gt;
自力で修正する件に関してはやった実績があります。&lt;br /&gt;
&lt;br /&gt;
２：pthreadを有効にせず負荷をさげる。&lt;br /&gt;
pthreadを使うと、マルチスレッド動作になってパフォーマンスがあがります。&lt;br /&gt;
言い換えると、マルチスレッドになる分、処理の間にthreadごとの動作を調停するための処理が追加されたりするわけです。&lt;br /&gt;
手持ちの動画を最高の画質でコンバートするという要件だったら、つけておくと高速化できていいわけですが、１つのサーバーで複数のデータの変換を実施するみたいなことをやる場合はむしろ余計な処理が増えて邪魔です。&lt;br /&gt;
なので、pthreadを抜いてffmpegを使うのも「あり」だと思っています。&lt;br /&gt;
ただし、目立った改善を目にしたことはありません。xuggleの動作で元々はいっているffmpeg動作側にpthreadはいっているみたいですが、むしろコレが足を引っ張っていたことがあります。&lt;br /&gt;
&lt;br /&gt;
３：ffmpegのパラメーターの順番をかえることで負荷を下げる。&lt;br /&gt;
ffmpegのパラメーター配置では、変換の開始位置を変更したり、入力ソースのフォーマットをあらかじめ指定したりすることで、動作効率をあげることができます。&lt;br /&gt;
-ssパラメーターをいじるのが一番わかりやすい例だと思います。&lt;br /&gt;
&lt;br /&gt;
こんなもんだっけ？なんかもっとあった気がするんだが・・・思い出したら追記していこう。</content><link rel='replies' type='application/atom+xml' href='http://poepoemix.blogspot.com/feeds/253051004463139268/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://poepoemix.blogspot.com/2013/02/ffmpegavconv.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/253051004463139268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/253051004463139268'/><link rel='alternate' type='text/html' href='http://poepoemix.blogspot.com/2013/02/ffmpegavconv.html' title='ffmpegやavconvのパフォーマンス改善案ってどんなのあったっけ？'/><author><name>poepoemix</name><uri>http://www.blogger.com/profile/05463016011577425897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmArlhv0g68lJB1e7v48w7IYddGoy8Cs8CdCdERcrqQs3pFGiA5SsoRZuc5uaBo-74FqMhnS_R34dGfKWD0AIsGj0lZuGflE3qWNLudYZlDPWeoHI4kOYjytiIFIQ6lQ/s220/atsui.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6573067931953719719.post-6632108315734139969</id><published>2013-02-06T21:41:00.003+09:00</published><updated>2013-02-06T21:41:32.129+09:00</updated><title type='text'>jettyやってみる。</title><content type='html'>jettyに手をだしてみます。&lt;br /&gt;
&lt;br /&gt;
基本的には、red5と同じtomcat系列のサーバープログラムみたいです。&lt;br /&gt;
&lt;a href=&quot;http://www.eclipse.org/jetty/&quot;&gt;http://www.eclipse.org/jetty/&lt;/a&gt;&lt;br /&gt;
ここからDownloads - jetty downloads - stable 9のdownloadで&lt;br /&gt;
&lt;a href=&quot;http://download.eclipse.org/jetty/stable-9/dist/&quot;&gt;http://download.eclipse.org/jetty/stable-9/dist/&lt;/a&gt;&lt;br /&gt;
ここまでたどり着き、tar.gzのデータをdownloadしました。&lt;br /&gt;
&lt;br /&gt;
解凍したら、webappsがあってred5と似た感じだなとおもいつつ&lt;br /&gt;
$ java -jar start.jar&lt;br /&gt;
で実行&lt;br /&gt;
&lt;br /&gt;
http://localhost:8080/でトップにアクセスできて、とりあえず問題なしに動作することがわかりました。&lt;br /&gt;
&lt;br /&gt;
で、eclipseで簡単に起動テストしたいので、やってみました。&lt;br /&gt;
&lt;a href=&quot;http://chitan.hateblo.jp/entry/2012/06/30/150604&quot;&gt;http://chitan.hateblo.jp/entry/2012/06/30/150604&lt;/a&gt;&lt;br /&gt;
このサイトによるとjetty wtpというのがつかえるみたいです。&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: black; font-family: TitilliumText22LRegular, &#39;ヒラギノ角ゴ Pro W3&#39;, &#39;Hiragino Kaku Gothic Pro&#39;, メイリオ, Meiryo, &#39;ＭＳ Ｐゴシック&#39;, &#39;MS PGothic&#39;, sans-serif; font-size: 15px; line-height: 27px; margin: 0px; overflow: hidden; padding: 0px; vertical-align: baseline; word-break: break-all; word-wrap: break-word;&quot;&gt;&lt;a href=&quot;http://download.eclipse.org/jetty/updates/jetty-wtp&quot; style=&quot;background-color: white; font-family: TitilliumText22LRegular, &#39;ヒラギノ角ゴ Pro W3&#39;, &#39;Hiragino Kaku Gothic Pro&#39;, メイリオ, Meiryo, &#39;ＭＳ Ｐゴシック&#39;, &#39;MS PGothic&#39;, sans-serif; font-size: 15px; line-height: 27px; margin: 0px; overflow: hidden; padding: 0px; vertical-align: baseline; word-break: break-all; word-wrap: break-word;&quot;&gt;http://download.eclipse.org/jetty/updates/jetty-wtp&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
このアドレスをinstall softwareの部分で指定すればいいみたいですね。&lt;br /&gt;
で、いつものようにDLします。&lt;br /&gt;
&lt;br /&gt;
すると、新規作成のその他の項目のserverを選択すると、jettyの項目が増えています。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv2_1u_uzHcIUx-hC_1lkLslC_AOxa5cTIKTnuEeNXQxp4U7tpzGHN_bha2N0llT5hsC3G-i1ifKqSOE_Z5Y6ZzSCxZjaLinmGupd0SEc_s1VOYVkpDVw4sGYdMbajxK_BSmYDAc19qnE/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-06+21.33.42.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv2_1u_uzHcIUx-hC_1lkLslC_AOxa5cTIKTnuEeNXQxp4U7tpzGHN_bha2N0llT5hsC3G-i1ifKqSOE_Z5Y6ZzSCxZjaLinmGupd0SEc_s1VOYVkpDVw4sGYdMbajxK_BSmYDAc19qnE/s320/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-06+21.33.42.png&quot; width=&quot;156&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8dY9APS5GF0070jmM4-ysYVJuPd81vglfOQM6vRGKwd3dfitY-uzvdmczaaKI82av6Ww7NR-WKTBH6whv2MzSMPZaVeh7fS-UYGhet45pubgXddsyGpwiF8blA9O41MaYUo7auBGvvNc/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-06+21.33.52.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8dY9APS5GF0070jmM4-ysYVJuPd81vglfOQM6vRGKwd3dfitY-uzvdmczaaKI82av6Ww7NR-WKTBH6whv2MzSMPZaVeh7fS-UYGhet45pubgXddsyGpwiF8blA9O41MaYUo7auBGvvNc/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-06+21.33.52.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi09xriEF6yfZNb3Z5WEAHOHmDY5B-fb8Jmxzrb-5psLfaCUSUmt8bKNVEw2vi1tQgSK9hixObWix2LtMgo3O6VeugSQ7VpTRxhIiBfjraU9rrp0n5nz7izqzc9udOZcNbLvbQyugMuZJ0/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-06+21.33.59.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi09xriEF6yfZNb3Z5WEAHOHmDY5B-fb8Jmxzrb-5psLfaCUSUmt8bKNVEw2vi1tQgSK9hixObWix2LtMgo3O6VeugSQ7VpTRxhIiBfjraU9rrp0n5nz7izqzc9udOZcNbLvbQyugMuZJ0/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-06+21.33.59.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
こんな感じ。&lt;br /&gt;
&lt;br /&gt;
v9のserverはないみたいなので、とりあえず、v8.1でいってみたいと思います。&lt;br /&gt;
&lt;a href=&quot;http://download.eclipse.org/jetty/stable-8/dist/&quot;&gt;http://download.eclipse.org/jetty/stable-8/dist/&lt;/a&gt;&lt;br /&gt;
こちらからtar.gzのデータをダウンロードし、解凍します。&lt;br /&gt;
&lt;br /&gt;
あとは起動時のサーバー指定の部分をいじります。&lt;br /&gt;
RuntimeEnvironment:という部分があるのでクリックして&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjULmmVQ1DRK9E91wAmM98yn71mTPQw4E78-6zBhzHQS1eROKxBt4AKMgrnOf3QZBjGmLG0dnVOqUa_lbcPuVEJ4PR7pHQ4wh28tLtFPI2vZAy7bDssu2AYaOk7JTITg-RMQ93ayb-E7tY/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-06+21.38.48.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjULmmVQ1DRK9E91wAmM98yn71mTPQw4E78-6zBhzHQS1eROKxBt4AKMgrnOf3QZBjGmLG0dnVOqUa_lbcPuVEJ4PR7pHQ4wh28tLtFPI2vZAy7bDssu2AYaOk7JTITg-RMQ93ayb-E7tY/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-06+21.38.48.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&amp;nbsp;JettyServerの設定の部分で先ほどダウンロードして解凍したJetty v8.1を指定します。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIf_cUm0gcCeHIX0VpUbiMabzka_9nDDOielFg1yNC76Y_KFWcqixV3f7L9CP50dCesHyWZuY1-b7WGcpZyOdSeEecmFP5cpi7sBT3bQgPTwzWpe5PFfk4xnz3otaI3LFtpG3yDyf-4Y8/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-06+21.39.03.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;237&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIf_cUm0gcCeHIX0VpUbiMabzka_9nDDOielFg1yNC76Y_KFWcqixV3f7L9CP50dCesHyWZuY1-b7WGcpZyOdSeEecmFP5cpi7sBT3bQgPTwzWpe5PFfk4xnz3otaI3LFtpG3yDyf-4Y8/s320/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-06+21.39.03.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&amp;nbsp;起動したらこんな感じで動作します。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAOLhUKFnfP3GqpV2_h_aW5QgfB0AeNGRWyJdTrMHM3nEtpCJbDewPoXtWx0cPwnr1-AVrl9ihxeV1lL3JXDLxv2yC_ehgE5lXsTeZ3IEsp1VGxzVBdzy9_ych227DQyJGK9xC9pJ75Z0/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-06+21.39.18.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;162&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAOLhUKFnfP3GqpV2_h_aW5QgfB0AeNGRWyJdTrMHM3nEtpCJbDewPoXtWx0cPwnr1-AVrl9ihxeV1lL3JXDLxv2yC_ehgE5lXsTeZ3IEsp1VGxzVBdzy9_ych227DQyJGK9xC9pJ75Z0/s320/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-06+21.39.18.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
これでおしまい。あとは、webappを書いていけばよいはず。さぁ、やってくか。</content><link rel='replies' type='application/atom+xml' href='http://poepoemix.blogspot.com/feeds/6632108315734139969/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://poepoemix.blogspot.com/2013/02/jetty.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/6632108315734139969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6573067931953719719/posts/default/6632108315734139969'/><link rel='alternate' type='text/html' href='http://poepoemix.blogspot.com/2013/02/jetty.html' title='jettyやってみる。'/><author><name>poepoemix</name><uri>http://www.blogger.com/profile/05463016011577425897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmArlhv0g68lJB1e7v48w7IYddGoy8Cs8CdCdERcrqQs3pFGiA5SsoRZuc5uaBo-74FqMhnS_R34dGfKWD0AIsGj0lZuGflE3qWNLudYZlDPWeoHI4kOYjytiIFIQ6lQ/s220/atsui.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv2_1u_uzHcIUx-hC_1lkLslC_AOxa5cTIKTnuEeNXQxp4U7tpzGHN_bha2N0llT5hsC3G-i1ifKqSOE_Z5Y6ZzSCxZjaLinmGupd0SEc_s1VOYVkpDVw4sGYdMbajxK_BSmYDAc19qnE/s72-c/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-02-06+21.33.42.png" height="72" width="72"/><thr:total>0</thr:total></entry></feed>