実施の形態1.
実施の形態1では、事前取得用領域の個数Nが、コンテンツのチャプタ数Lと同数以上である場合について記述する。
図1は、本発明の実施の形態1のコンテンツ再生装置の構成を示すブロック図である。図示のコンテンツ再生装置3は、データ取得部21と、制御部22と、バッファ23と、再生部24を備える。
バッファ23は再生開始前にコンテンツのチャプタ数Lに応じて、通常再生用領域31と、複数の事前取得用領域32−1〜32−Nに分割される。以下では、事前取得用領域32−1〜32−Nを互いに区別する必要がないときは単に事前取得用領域32と記述することがある。また、第I(I=1〜N)の事前取得用領域を32−Iで表す。
事前取得用領域32−1〜32−Nの各々の大きさは、コンテンツ再生装置3が再生開始までに蓄積するデータ量と同程度であり、通常再生用領域31より小さい。
事前にデータを取得するジャンプ先の数を2つとした場合の、特許文献1と本発明のバッファ構成の違いを図2(A)及び(B)に示す。特許文献1の再生装置では、図2(A)に示すように、ジャンプ再生後もジャンプ先のデータを蓄積していたバッファBF1〜BF3を用いてストリーミング再生を継続するため、ストリーミング再生に必要なサイズのバッファがさらに2つ必要になるが、本発明においては、図2(B)に示すように、ジャンプ先のデータのうち一定量のみを事前取得用領域32−1及び32−2に蓄積し、その後のストリーミング再生は通常再生用領域31を用いて行うので、新たに必要となる2つのバッファのサイズはストリーミング再生に必要なサイズに比べてはるかに小さいものでよい。
チャプタを含まないコンテンツの場合は、事前取得用領域32のサイズは0としてもよい。この場合バッファ23全てが通常再生用領域31として使われる。
データ取得部21は、IPネットワーク2を介してコンテンツ配信装置1に接続されており、コンテンツ配信装置1からストリーミングデータを取得し、バッファ23に一時的に蓄積する。
再生部24は、バッファ23に蓄積されたストリーミングデータを読み出し、再生する。再生されたストリーミングデータは映像・音声として外部に出力される。
データ取得部21が取得するストリーミングデータ、および取得したデータを書き込むバッファ23中の領域は、制御部22によって指定される。また、再生部24がストリーミングデータを読み出すバッファ23中の領域も、制御部22によって指定される。
コンテンツ再生装置3は、コンテンツの再生を開始すると、バッファ23の通常再生用領域31にストリーミングデータをバッファリングし、コンテンツの再生を行う。バッファリング方法の一例としては、直線状のバッファの両端を論理的に繋ぎ、バッファを輪のように扱う方法(リングバッファ)がある。この方法では、バッファの終端までデータの書き込みまたは読み出しを行うと、バッファの先頭から続けてデータの書き込みまたは読み出しを行う。以下の実施の形態では、通常再生用領域31には、リングバッファ(循環バッファ)を用い、
事前取得用領域32には非循環バッファを用いる。
図3(A)及び(B)は、バッファの構造を表した図である。バッファは先頭アドレスMinPから終端アドレスMaxPまでの領域から成り、データ取得部21がストリーミングデータを書き込んだ最新の領域を書き込みポインタWPとして保持し、再生部24がストリーミングデータを読み出した最新の領域を読み出しポインタRPとして保持する。
書き込みポインタWPと読み出しポインタRPは、最初はともに先頭アドレスMinPを指し、データ取得部21がストリーミングデータを書き込むことにより書き込みポインタWPが更新される。また、再生部24がストリーミングデータを読み出すことにより読み出しポインタRPが更新される。
書き込みポインタWPは読み出しポインタRPを追い越すことはできない。書き込みポインタWPが読み出しポインタRPに追いついた場合には、読み出しポインタRPが更新されるまでデータ取得部21はストリーミングデータの書き込みを行わない。この状態をバッファフルと呼ぶ。
また、読み出しポインタRPも書き込みポインタWPを追い越すことはできない。読み出しポインタRPが書き込みポインタWPに追いついた場合には、書き込みポインタWPが更新されるまで再生部24はストリーミングデータの読み出しを行わない。これは、バッファアンダーフローの状態である。
終端アドレスMaxPまで書き込みまたは読み出しを行うと、書き込みポインタWPまたは読み出しポインタRPの値は先頭アドレスMinPに戻る。
バッファ蓄積量は、読み出しポインタRPから書き込みポインタWPまでの領域の大きさから求めることができる。例えば図3(A)のように書き込みポインタWP(1)が読み出しポインタRP(1)より大きい場合には、バッファ蓄積量はその差(WP(1)−RP(1))から求めることができる。また、図3(B)のように読み出しポインタRP(2)が書き込みポインタWP(2)より大きい場合には、バッファ蓄積量は
(MaxP−RP(2))+(WP(2)−MinP)
から求めることができる。
バッファ23においては、通常再生用領域31には、書き込みポインタWPと読み出しポインタRPを保持する。一方、事前取得用領域32には、書き込みポインタWPのみを保持する。これらにより、各領域のバッファ蓄積量を求めることが可能である。
ただし、事前指定用領域のバッファ蓄積量は書き込みポインタWPの値のみから求める。図3(A)の場合は書き込みポインタWP(1)の値のみを用いてバッファ蓄積量を求める。つまりWP(1)−MinPとなる。これは、リングバッファとして扱うのは通常再生用領域のみで、事前取得用領域はリングバッファとして扱わないからである。
また、バッファ蓄積率は、バッファ蓄積量をその領域のサイズで除算することで算出できる。
本実施の形態におけるコンテンツ再生装置3の、通常再生時のバッファリング手順の一例を、図4を参照して説明する。以下では、事前取得用領域32の数Nが、チャプタの数Lに等しく(L=N)、第1〜第Nの事前取得用領域32−1〜32−Nが、それぞれ第1〜第Nのチャプタに対応して設けられているものとして説明する。
バッファリング開始(ステップS10)後、まずデータ取得部21は、通常再生用領域31のバッファ蓄積量が所定量THa1以上になるまで通常再生用領域31に通常再生用のデータを蓄積する(ステップS11、S12)。
ここで、通常再生用のデータとは、今から再生しようとしている、もしくは再生中のストリーミングデータのことである。
通常再生用領域31のバッファ蓄積量が所定量THa1以上になったら、第1乃至第Nのチャプタのデータをジャンプ先DI(I=1〜N)のデータとして、第1乃至第Nの事前取得用領域32−1〜32−Nに順次データを蓄積する処理(ステップS13)を行う。この処理においては、事前取得用領域32−IのパラメータIを1からNまで順に変化させながら(ステップS13A、S13E)、事前取得用領域32−Iにデータを所定量THb−Iまで蓄積する(ステップS13D)。
また、この処理を行っている最中にも、通常再生用領域31のバッファ蓄積量が所定量THa2以上(THa2<THa1)かどうかのチェックを行い(ステップS14)、所定量THa2未満であれば、ステップS11に戻り、通常再生用領域31へのデータの蓄積を行う(ステップS11、S12)。
事前取得用領域32−1〜32−Nにデータを蓄積する処理(S13)においては、最初にステップS13AでパラメータIを1に設定し、次にステップS13Bに進む。ステップS13Bでは、第Iのジャンプ先DI(最初はI=1)のデータを格納した事前取得用領域32−I(32−1)のバッファ蓄積量が所定量THb−I(THb−1)以上であるかどうかの判定を行う(ステップS13B:I=1)。
ここで第Iのジャンプ先DIのデータとは、先頭からI番目のチャプタから始まるストリーミングデータを指す。
所定量THb−I未満である場合には(ステップS13BでNo)、コンテンツにジャンプ先DI(D1)のデータがあるかどうかの判定を行い(ステップS13C)、データがあれば(ステップS13CでYes)ステップS13Dに進む。
ステップS13Dでは、ジャンプ先DI(D1)のデータを事前取得用領域32−I(32−1)に一定量蓄積する(ステップS13D:I=1)。
その後、ステップS14に進む。
ステップS13Cでデータがなければ(ステップS13CでNo)、直ちにステップS14に進む。
ステップS14では、通常再生用領域31のバッファ蓄積量が所定量THa2以上であるかを判定し、所定量THa2未満であった場合(ステップS14でNo)にはステップS11に戻る。
所定量THa2以上であった場合(ステップS14でYes)には、再びステップS13Bに進み、事前取得用領域32−I(32−1)のバッファ蓄積量が所定量THb−I(THb−1)以上であるかどうかの判定を行う(ステップS13B:I=1)。
事前取得用領域32−I(32−1)のバッファ蓄積量が所定量THb-I以上である場合(ステップS13BでYes)には、ステップS13EでパラメータIに1を加え(この場合、I=1に1を加えることでI=2となる)、新たなパラメータIがNを超えていないかどうかの判定を行い(ステップS13F)、Nを超えていなければステップS13Cに進み、コンテンツにジャンプ先DI(D2)のデータがあることを確認した上で(ステップS13CでYes)、事前取得用領域32−I(32−2)に第Iのジャンプ先DI(D2)のデータを一定量蓄積し(ステップS13D)、その後ステップS14の処理を行い、ステップS11又はステップS13Bに進む。
ステップS13Bでは、ジャンプ先DI(D2)のデータを格納した事前取得用領域32−Iのバッファ蓄積量が所定量THb−I(Thb−2)以上であるかどうかを判定する(ステップS13B:I=2)。所定量THb−I未満であれば、ステップS13Cに進み、コンテンツに第Iのジャンプ先DI(D2)のデータがあることを確認した上で(ステップS13CでYes)、ステップS13Dに進み、ジャンプ先DI(D2)のデータを事前取得用領域32−2に一定量蓄積し(ステップS13D:I=2)、ステップS14にうつる。
以下、第Nの事前取得用領域32−Nまで(N番目のチャプタまで)同様の処理を行い、事前取得用領域32−1〜32−Nのすべてについてバッファ蓄積量がTHb−I以上となったら、ステップS13Gに進み、所定量THb−I(I=1…N)を調整し(一般には増加させ、又は同じ値に維持し)、ステップS11に戻る。
例えば、コンテンツ再生開始時は所定量THb−Iを低めに設定しておき、ステップS13Gにくるたびに高くしていくようにすれば、全ての事前取得用領域を常に同程度のバッファ蓄積量とすることができる。逆に所定量THb−Iを最初から高めに設定しておけば、特定の事前取得用領域のバッファ蓄積量をより早く100%にすることができる。
図4のフローチャートを実施したときの、各領域のバッファ蓄積量の変化を模式的に表したのが図5である。なお図5では、THb−I(I=1〜N)の値は全て同じであるとしている。
通常再生用領域31のバッファ蓄積量はステップS11により増加する(t0〜t1、t2〜t3、t5〜t6)。バッファ蓄積量がTHa1以上となったら、バッファ蓄積量がTHa2未満となるまで通常再生用領域31への蓄積を休止するためバッファ蓄積量は減少する(t1〜t2、t3〜t5、t7〜t8)。通常再生用領域31への蓄積を休止している間に、事前取得用領域32への蓄積が行われる。
通常再生用領域31への蓄積を休止している間、まず事前取得用領域32−1に対してジャンプ先DI(I=1、2、…)のデータの蓄積が行われる(t1〜t2、t3〜t4、t4〜t5、t6〜t7、t7〜t8)。最初は、ジャンプ先D1のデータの蓄積が行われる(t1〜t2、t3〜t4)事前取得用領域32はジャンプ再生を行わない限り再生には使われないので、バッファ蓄積量は減少しない。事前取得用領域32−1のバッファ蓄積量が指定量THbより大きくなると、引き続き事前取得用領域32−2に対してジャンプ先D2のデータの蓄積を開始する(t4〜)。
同様にして事前取得用領域32−Nまで、順にジャンプ先データを蓄積していく。
図5に示す例では、時刻t1以降にジャンプ先D1を指定された場合には、ジャンプ先D1の再生開始時に必要なデータ蓄積量のうち一定量が事前に(そのときまでに)取得されているため、ジャンプ先データの再生開始までのデータ蓄積の時間を短くすることができる。特に、事前取得用領域32−1のバッファ蓄積率が100%であるとき(蓄積量が当該事前取得用領域のバッファ容量に達している場合)には、ジャンプ再生開始までの蓄積待ち時間は0であり、ジャンプ先D1へのジャンプ再生にかかる時間を最も短縮できる。このように、優先的に蓄積されるジャンプ先ほど、ジャンプ先のデータが早い段階で蓄積される可能性が高くなり、ジャンプ再生時にかかる時間を短縮できる可能性が高くなる。
次に、本実施の形態におけるコンテンツ再生装置3の、通常再生時のバッファ23からの読み出し手順の一例を、図6を参照して説明する。
通常再生が指示されると(ステップS20)、再生部24は通常再生用領域31のバッファ蓄積量を確認する(ステップS21)。バッファ蓄積量がTHa3(≦THa2)以上の場合には(ステップS21でYes)、データの読み出しを開始する(ステップS22)。バッファ蓄積量が所定量THa4(≦THa3)以上である場合は読み出しを継続し、THa4を下回った場合はステップS21に戻る(ステップS23)。
次に、本実施の形態におけるコンテンツ再生装置3の、ジャンプ操作時のバッファリング手順の一例を、図7を参照して説明する。
なお、図7及び以下の説明では、指定されたジャンプ先を符号DJで表し、ジャンプ先DJのデータを蓄積している事前取得用領域を符号32−Jで表す。
ジャンプ再生が指示されると(ステップS30)、制御部22は、事前取得用領域32−Jのバッファ蓄積量を確認する(ステップS31)。
ステップS31で、事前取得用領域32−Jにジャンプ先DJのデータが蓄積されている場合には、制御部22は、事前取得用領域32−Jに蓄積されたデータを通常再生用領域31の先頭にコピーする(ステップS32)。続いて通常再生用領域の読み出しポインタRPを初期値に、書き込みポインタWPを初期値からコピーしたサイズ分進めた値に設定し(ステップS33)、その後ステップS35に進む。
ステップS31で、事前取得用領域32−Jが存在しない、もしくは事前取得用領域32−Jにデータが全く蓄積されていない場合には、通常再生用領域の書き込みポインタWP、読み出しポインタRPの初期化(ステップS34)を行い、その後、ステップS35に進む。
ステップS35では、コピー済みフラグFCのセットを行い、通常再生用領域31にジャンプ先DJのデータの蓄積を開始し、
それ以降は図4に示した通常再生時のバッファリング手順と同様にバッファリングを行う(ステップS36)。
次に、本実施の形態におけるコンテンツ再生装置3の、ジャンプ操作時のバッファ23からの読み出し手順の一例を、図8を参照して説明する。
ジャンプ再生が指示されると(ステップS40)、コピー済みフラグFCがセットされるまで待ち(ステップS41)、コピー済みフラグFCセット後は、図6に示した通常再生時の読み出しシーケンスに従い通常再生用領域先頭から読み出しを行う(ステップS42)。このとき、事前取得用領域32−Jのバッファ蓄積率が大きいほど、再生開始までのデータ蓄積待ち時間を短くすることができる。
ジャンプ再生時のバッファ23の状態を図9(A)〜(C)に示す。
図9(A)はジャンプ再生前の状態の一例を示す。通常再生用領域31には通常再生用のデータを、事前取得用領域32−Jにはジャンプ先DJのデータを蓄積している。
図9(B)はジャンプ先DJへのジャンプ再生を指示された直後の状態である。事前取得用領域32−Jに蓄積していたデータを通常再生用領域31にコピーしている。通常再生用領域31の読み出しポインタRPaは初期化され、書き込みポインタWPaはコピーしたデータ分だけ進めた値に設定される。事前取得用領域32−Jのバッファ蓄積量はそのままであるので、書き込みポインタWPbも変化しない。
図9(C)はジャンプ再生のための処理を行った状態である。データ取得部21は、通常再生用領域31に対して、事前取得用領域32−Jからコピーしたデータの続きからデータの蓄積を継続する。再生部24は、通常再生用領域31の先頭からデータを読み出すことによりジャンプ先からの再生を行う。事前取得用領域32−Jには、ジャンプ再生前に蓄積していたデータの続きを、引き続き蓄積する。
ジャンプ再生が指示されたときに、事前取得用領域32−Jのバッファ蓄積率が100%であれば、再生開始までに蓄積するデータ量が蓄積済みであるので、ジャンプ先のデータの蓄積を待つことなく、ジャンプ再生を開始することができる。また、バッファ蓄積率が100%でなかったとしても、事前にある程度蓄積しておくことで、ジャンプ再生までのデータ蓄積時間を短縮することができる。
以上のように実施の形態1によれば、ジャンプ操作が指示されたときに、事前取得用領域32に蓄積されているデータを利用することにより、ジャンプ先のデータ蓄積にかかる時間を短縮できる。
なお、実施の形態1では、コンテンツの先頭のジャンプ先から順に事前取得用領域に蓄積したが、蓄積する順番を変えてもよい。例えば、現在の再生位置に近いジャンプ先から順にデータを蓄積してもよいし、過去のユーザ操作の傾向に応じて蓄積する順番を決定してもよい。こうすることにより、特定のジャンプ先に対してジャンプ再生にかかる時間を短縮できる可能性が高くなる。
また、実施の形態1では、バッファに蓄積するデータ量に対する閾値THb−Iは再生位置に応じて動的に変更してもよい。例えば、再生位置に近いジャンプ先ほど閾値THb−Iを高く設定してもよいし、過去のユーザ操作の傾向に応じて閾値THb−Iを設定してもよい。こうすることにより、特定のジャンプ先に対してジャンプ再生にかかる時間を短縮できる可能性が高くなる。
また、実施の形態1では、あるチャプタの先頭からのデータが通常再生用領域に一定量蓄積され、かつそのチャプタのデータを蓄積する事前取得用領域のバッファ蓄積率が100%でない場合には、チャプタの先頭からのデータを通常再生用領域から該当する事前取得用領域へコピーしてもよい。こうすることにより、同じデータを2度取得することがなくなり、効率よくネットワークからデータを取得できる。
また、実施の形態1では、通常再生用領域にこれから蓄積する予定のデータがすでに事前取得用領域に蓄積済みであった場合に、該当するデータを事前取得用領域から通常再生用領域へコピーしてもよい。こうすることにより、同じデータを2度取得することがなくなり、効率よくネットワークからデータを取得できる。
さらに、実施の形態1では、ジャンプ再生時に事前取得用領域に蓄積したジャンプ先からのデータを通常再生用領域にコピーしたが、コピーせずに再生部24が事前取得用領域から直接読み出してもよい。その場合、再生部24はまず事前取得用領域に蓄積したデータを読み出し、事前取得用領域のデータを全て読み出した後、続きのデータを通常再生用領域から読み出すようにしてもよい。こうすることにより、処理は複雑化するが、バッファ間のコピーに要する時間を省略できるので、ジャンプ再生に要する時間をより短縮できる。
また、実施の形態1では、それぞれの事前取得用領域32の大きさはコンテンツ再生装置3が再生開始までに蓄積するデータ量と同程度としたが、チャプタの数Lが多く十分な事前取得用領域を確保できない場合はこの限りではない。コンテンツ再生装置3が再生開始までに蓄積するデータ量より小さい事前取得用領域しか確保できない場合には、事前取得用領域のバッファ蓄積率が100%である場合にも再生開始までにジャンプ先のデータをさらに蓄積する必要はあるが、本手法を適用しない場合と比較するとデータの蓄積にかかる時間を短縮することは可能である。
また、事前取得用領域の大きさは全て同じとしなくてもよい。例えば現在の再生位置に近いジャンプ先ほど領域を大きくとってもよいし、ユーザが頻繁に行う操作に応じて領域を決定してもよい。こうすることにより、チャプタの数Lが多く十分な領域を確保できない場合でも、特定の操作に対してはジャンプ再生にかかる時間を短くすることができる。
また、実施の形態1では、通常再生用領域31のバッファ蓄積量が指定量THa2以上の場合のみ事前取得用領域32へのデータ蓄積を行っていたが、通常再生用領域31へのデータ蓄積と事前取得用領域32へのデータ蓄積を同時に行ってもよい。こうすることにより、1つのプロセス内でデータ取得先、バッファ書き込み領域、バッファ読み出し領域を頻繁に切り替える必要がなくなるため、処理を簡略化することができる。ただし、事前取得用領域32へのデータ蓄積が通常再生用領域31へのデータ蓄積の妨げとなり、通常再生用領域31でバッファアンダーフローが発生することがないよう注意する必要がある。通常再生用領域31へのデータ蓄積への影響を少なくする方法としては、事前取得用領域32へのデータ蓄積を行う時間間隔を広くすることなどが挙げられる。
例えば、通常再生用領域31へのデータ蓄積といずれかの事前取得用領域32へのデータ蓄積を同時に行う場合を考える。コンテンツ再生装置3のネットワーク2からのデータ取得レートがRa(bps)、現在再生中のコンテンツの再生レートがRb(bps)のときは、事前取得用領域32に蓄積するためのデータ取得レートがRa−Rb(bps)を超えないよう、事前取得用領域32に蓄積するためのデータの取得間隔を大きくする必要がある。
なおまた、実施の形態1では、ジャンプ再生のデータを事前取得の対象としていたが、それ以外のデータを対象としてもよい。例えば、特殊再生用のストリームや、現在再生中のコンテンツの次に再生する予定のコンテンツ、現在再生中のコンテンツに関連付けられたコンテンツなどを事前取得してもよい。
実施の形態2.
実施の形態2では、事前取得用領域32の個数Nが、コンテンツのチャプタの数L以下である場合について記述する。
実施の形態2におけるコンテンツ再生装置の構成は、実施の形態1と同様である。ただし、チャプタの数だけ事前取得用領域32を設けるのではなく、事前取得用領域32の個数Nが、コンテンツのチャプタの数よりも少ない点が実施の形態1と異なる。
以下ではN=2の場合について説明を行う。
本実施の形態においては、事前取得用領域32−1、32−2には、次ジャンプ先のデータと前ジャンプ先のデータを蓄積する。
ここで、次ジャンプ先とは現在の再生位置から見て次のチャプタのことである。また、前ジャンプ先とは現在の再生位置から見て前のチャプタのことである。図10の例では次ジャンプ先がチャプタP+1、前ジャンプ先がチャプタPで表される。再生位置がチャプタP+1の開始点を超えると、次ジャンプ先がチャプタP+2、前ジャンプ先がチャプタP+1となる。
以下では、事前取得用領域32−1、32−2のうち、次ジャンプ先データの蓄積に用いられているものを次ジャンプ先データ用領域32−Next、前ジャンプ先データの蓄積に用いられているものを前ジャンプ先データ用領域32−Prevと呼ぶ。
本実施の形態におけるコンテンツ再生装置3の、通常再生時のバッファ23からの読み出し手順、ジャンプ操作時のバッファ23からの読み出し手順、及びジャンプ操作時のバッファ23からの読み出し手順は実施の形態1と同じである。
本実施の形態におけるコンテンツ再生装置3の、通常再生時のバッファリング手順の一例を、図11を参照して説明する。
バッファリングが開始されると(ステップS50)、まずデータ取得部21は、通常再生用領域31のバッファ蓄積量が所定量THa1以上になるまで通常再生用領域31に通常再生用のデータを蓄積する(ステップS51、S52)。
通常再生用領域31のバッファ蓄積量がTHa1以上の場合には、次ジャンプ先データ用領域32−Nextのバッファ蓄積量が所定量THb−Next以上かどうかを判定する(ステップS54)。所定量THb−Next未満の場合には次ジャンプ先のデータを次ジャンプ先データ用領域32−Nextに一定量蓄積する(ステップS55)。その後、通常再生用領域31のバッファ蓄積量がTHa2以上であるかを判定し(ステップS53)、THa2未満であった場合にはステップS51にうつる。所定量THa2以上であった場合には、再び次ジャンプ先データ用領域32−Nextのバッファ蓄積量が所定量THb−Next以上かどうかを判定する(ステップS54)。
次ジャンプ先データ用領域32−Nextのバッファ蓄積量が所定量THb-Next以上の場合には、次にステップS56に進み、前ジャンプ先データ用領域32−Prevのバッファ蓄積量が所定量THb−Prev以上かどうかを判定する。所定量THb−Prev未満の場合には前ジャンプ先のデータを前ジャンプ先データ用領域32−Prevに一定量蓄積し(ステップS57)、ステップS53にうつる。
ステップS57で、前ジャンプ先データ用領域32−Prevのバッファ蓄積量が所定量THb−Prev以上の場合には、ステップS58に進み、所定量THb−Next、THb−Prevの値を調整し、ステップS51に戻る。
ここで、次ジャンプ先データ用領域32−Next、及び前ジャンプ先データ用領域32−Prevは、事前取得用領域32−1、及び32−2のどちらかに固定されるものではなく、再生位置にともなって変化する。
事前取得用領域の割当ての変化の一例を図12に示す。現在の再生位置がチャプタPの開始位置とチャプタP+1の開始位置の間で、事前取得用領域32−1に前ジャンプ先としてチャプタPからのデータを、事前取得用領域32−2に次ジャンプ先としてチャプタP+1からのデータを蓄積しているとする。この時点では次ジャンプ先データ用領域32−Nextは事前取得用領域32−1、前ジャンプ先データ用領域32−Prevは事前取得用領域32−2である。
この状態から再生位置がチャプタP+1の開始点を超えると、前ジャンプ先はチャプタP+1の開始点に、次ジャンプ先はチャプタP+2の開始点になる。ここで、チャプタP+1からのデータは領域32−2に既に蓄積済みであるので、領域32−2を次ジャンプ先データ用領域32−Nextとすれば、チャプタP+1からのデータを再度取得する必要がなくなる。
このように、次ジャンプ先データ用領域用領域32−Next、及び前ジャンプ先データ用領域32−Prevに該当する事前取得用領域を再生位置に応じて変更することで効率的にデータを取得することができる。
再生位置が新しいチャプタの開始位置を超えたときに次ジャンプ先データ用領域32−Next、及び前ジャンプ先データ用領域32−Prevと、事前取得領域32−1、及び32−2の対応付けを変更する方法を図13を参照して説明する。
以下では、事前取得領域32−1が蓄積しているジャンプ先のチャプタ番号をP1、事前取得領域32−2が蓄積しているジャンプ先のチャプタ番号をP2、前ジャンプ先のチャプタ番号をPprev、次ジャンプ先のチャプタ番号をPnextと記述する。
再生位置が新しいチャプタの開始位置を超えたとき(ステップS60)、制御部22は現在のチャプタ番号を取得し、前ジャンプ先のチャプタ番号Pprevと次ジャンプ先のチャプタ番号Pnextを求める(ステップS61)。
事前取得用領域32−1に蓄積しているデータが前ジャンプ先データであるとき、即ちP1=Pprevであるとき(ステップS62でYes)は事前取得用領域32−1を前ジャンプ先データ用領域32−Prevとして、事前取得用領域32−2を次ジャンプ先データ用領域32−Nextとして設定する(ステップS63)。
事前取得用領域32−1には現在まで蓄積した前ジャンプ先のデータの続きのデータを蓄積する。
このときに事前取得用領域32−2に蓄積しているデータが次ジャンプ先データでなければ、即ちP2=Pnextでなければ(ステップS64でNo)、事前取得用領域32−2には次ジャンプ先のデータではないデータが蓄積されているので、事前取得用領域32−2の書き込みポインタWPを初期化する(ステップS65)。
P2=Pnextであれば、現在まで蓄積した前ジャンプ先のデータの続きのデータを蓄積する。
ステップS62でNoであれば、次にステップS66に進み、P1=Pnextであれば(S66でYES)、事前取得用領域32−1を次ジャンプ先データ用領域32−Nextとして、事前取得用領域32−2を前ジャンプ先データ用領域32−Prevとして設定し(ステップS67)、さらにP2=Pprevでなければ(ステップS68でNo)、事前取得用領域32−2の書き込みポインタWPを初期化する(ステップS69)。
P1がPnextともPprevとも等しくなく(ステップS62でNo、かつS66でNo)かつP2=Pprevの場合には(ステップS70でYes)、事前取得用領域32−1を次ジャンプ先データ用領域32−Nextとして、事前取得用領域32−2を前ジャンプ先データ用領域32−Prevとして設定し(ステップS71)、事前取得用領域32−1の書き込みポインタWPを初期化する(ステップS72)。
P1がPnextともPprevとも等しくなく(ステップS62でNo、かつS66でNo)かつP2=Pnextの場合(ステップS70でNo、S73でYes)には、事前取得用領域32−1を前ジャンプ先データ用領域32−Prevとして、事前取得用領域32−2を次ジャンプ先データ用領域32−Nextとして設定し(ステップS74)、事前取得用領域32−1の書き込みポインタWPを初期化する(ステップS75)。
P1、P2ともにPnext、Pprevと等しくなかった場合(ステップS70、S73でNo)には、事前取得用領域32−1を前ジャンプ先データ用領域32−Prevとして、事前取得用領域32−2を次ジャンプ先データ用領域32−Nextとして設定し(ステップS76)、事前取得用領域32−1および32−1の書き込みポインタWPを初期化する(ステップS77)。これは2つ以上先のジャンプ先を指定されたときなどに起こりうる。
以上のように実施の形態2によれば、事前取得用領域の個数をコンテンツのチャプタ数L以下しか確保できない場合においても、各事前取得用領域の役割を切り替えながら蓄積を行うことにより、前後のチャプタへのジャンプ再生に要する時間を短縮することができる。
なお、実施の形態2では、事前取得用領域に次ジャンプ先のデータを蓄積した後に前ジャンプ先のデータを蓄積していたが、この順番で蓄積しなくてもよい。また、事前取得用領域に蓄積するデータも、次ジャンプ先のデータ及び前ジャンプ先のデータの2つに限定しない。例えば、次ジャンプ先のデータとさらに次のチャプタからのデータを事前取得用領域に蓄積してもよいし、過去のユーザ操作の傾向に応じて事前取得用領域に蓄積するデータを変更してもよい。
また、実施の形態2では、2つの事前取得用領域をもつ場合について説明したが、もちろん事前取得用領域の数は2つでなくてもよい。また2つでないときも同様に各事前取得用領域の役割を切り替えながら効率的に蓄積を行う。より多くの事前取得用領域を設けると、ジャンプ再生にかかる時間を短縮できるジャンプ先を増やせるが、より大きなメモリ容量が必要となる。
また、再生位置が最終チャプタに達したなどの理由で次ジャンプ先がない場合には、本来次ジャンプ先データを蓄積する事前取得用領域に、違うデータを蓄積してもよい。例えば、2つ前のジャンプ先のデータを蓄積してもよいし、先頭チャプタからのデータを蓄積してもよい。後者の場合は、コンテンツ終端に達するとコンテンツ先頭からリピート再生するような場合に有効である。
実施の形態3.
実施の形態3では、通信状態に応じて、バッファ中の各領域のサイズを変更する場合について記述する。実施の形態3におけるコンテンツ再生装置の構成は、実施の形態2と同様である。
通常再生領域31のバッファ蓄積量は図14(a)のようにネットワークの状態に応じて変動する。制御部22は、通常再生用領域31のバッファ蓄積量の最大値Bmax、最小値Bmin、変化幅Bdiffを記憶しておく。
ここで、最大値Bmaxとは再生を開始してからのバッファ蓄積量の最大値である。最小値Bminとは、最大値Bmaxが更新されてからのバッファ蓄積量の最小値である。変化幅Biffは再生を開始してからの最大値Bmaxと最小値Bminの差の最大値である。図14(b)は、最大値Bmax、最小値Bmin、変化幅Bdiffの変化の一例を示す。図14(b)での変化幅Bdiffの最終的な値はB4−B1となる。
制御部22がBmax、Bmin、Bdiffを更新する手順の一例を、図15を参照して説明する。
再生を開始すると(ステップS80)、まずBmax、Bmin、Bdiffを0に初期化する(ステップS81)。続いて一定時間ごとに現在の通常再生用領域31のバッファ蓄積量Bcurrentを取得し(S82)、Bmax、Bminとの比較を行う(S83)。BcurrentがBmaxより大きければ(ステップS83でYes)、Bmaxを更新し、Bminの値をBmaxに設定する(ステップS84)。Bcurrentの値がBmax以下であり(ステップS83でNo)かつBminより小さければ(ステップS85でYes)、Bminの値を更新する(ステップS86)。さらにBmax−Bminの値がBdiffより大きければ(ステップS87でYes)、Bdiffの値を更新する(ステップS88)。
通常再生用領域31のサイズは少なくともBdiffより大きくないとバッファアンダーフローの可能性が高い。実施の形態3においては、ジャンプ再生時に前のデータの再生でのBdiffの値が大きい場合には、その値に応じて通常再生用領域31のサイズをより大きく取ることにより、ネットワーク不調時のバッファアンダーフローの可能性を低減する。
Bdiffと通常再生用領域31のサイズの決め方の一例を図16に示す。平常時には通常再生用領域31の大きさはSdefaultであるが、Bdiffが大きいとき、つまりネットワーク不調時にはBdiffに応じて通常再生用領域31のサイズを拡張する。通常再生用領域31の最大サイズSmaxはバッファ23のサイズと等しくなる。
通常再生用領域31のサイズを拡大する場合には、各事前取得用領域32のサイズを縮小する。このときのバッファ23の領域配置の一例を図17(A)〜(C)に示す。ジャンプ再生時にBdiffの値が大きかったことから、バッファ23の領域の配置を図17(A)から図17(B)のように変更するとする。また、図17(A)では、事前取得用領域32−1、及び32−2が各々4つのメモリブロックBL1〜BL4を用いていたとする。図17(B)のように変更する場合、図17(A)の配置のときに取得していたデータをコピーするが、事前取得用領域32−1のメモリブロックBL4のように新しい領域に収まりきらないデータは破棄する。また、書き込みポインタWPの値が縮小後の事前取得用領域32−1の外部に位置することとなるとき、縮小後の領域に収まるように設定しなおす。
ジャンプ再生時にBdiffの値が小さくなった場合には、バッファ23の領域の配置を図17(B)から図17(C)のように元に戻す。この場合新しく増えた領域(メモリブロック4)は、まだデータが蓄積されていないので空となる。事前取得用領域のバッファ蓄積量は変わらないが、バッファ蓄積率は減少する。
以上のように実施の形態3によれば、通信状態に応じて、バッファ中の各領域のサイズを変更するので、通信状態が一時的に悪化した場合においても通常再生領域におけるバッファアンダーフロー発生の可能性を小さくすることができる。
なお、実施の形態3では、Bdiffの値はジャンプ再生の度に初期化するとしたが、値の信頼性が低い場合には初期化しなくてもよい。信頼性が低い状態としては、再生開始後わずかの時間しか経っていない場合などがある。初期化しない場合は、あらかじめ設定された初期値をBdiffとして用いたり、前回のBdiffの値をそのまま用いたりすることができる。こうすることにより、安定した状態でのバッファ蓄積量の変化を元に、通常再生用領域のサイズを決定できる。
また、実施の形態3では、Bdiffの値は再生を行っている間ずっと有効であったが、有効である期間を限定してもよい。例えば過去所定の指定期間、例えば1時間の間に測定されたBdiffの値のみ有効としてもよい。そのためには、例えば、BmaxとBminの値を一定時間おきに記憶しておき、指定期間内のBmaxとBminからBdiffを求めればよい。こうすることにより、より最近の通信状態を反映したバッファ領域の設定を行うことができる。
また、実施の形態3では、バッファ領域の配置変えを行うのはジャンプ再生を行ったときのみであったが、違うタイミングで行ってもよい。例えば、バッファアンダーフローが発生したときに行ってもよいし、一定時間間隔で行ってもよい。こうすることにより、より最近の通信状態を反映したバッファ領域の設定を行うことができる。
また、実施の形態3では、通常再生用領域を拡大したときに各事前取得用領域のサイズを縮小したが、事前取得用領域の数を減らしてもよい。逆に通常再生用領域を元に戻すときには、新たに事前取得用領域を作成することになる。こうすることにより、特定のジャンプ先に対しては、通常再生用領域を拡大する前と同じようにジャンプ再生に要する時間を短縮することができる。
また、実施の形態3では、Bdiffの値に応じて、ジャンプ再生開始までに蓄積するデータ量を変更してもよい。こうすることにより、例えば、Bdiffの値が大きい場合には蓄積するデータを多くすることでバッファアンダーフローの可能性を小さくし、またBdiffの値が小さい場合には、蓄積するデータを少なくすることでジャンプ再生にかかる時間を短縮することができる。
また、実施の形態3では、Bdiffの値に応じて通常再生用領域のサイズを変更したが、通常再生用領域のサイズが十分に大きい場合には、ネットワーク不調時に逆に事前取得用領域を拡大してもよい。こうすることによりBdiffの値によりジャンプ再生開始までに蓄積するデータ量を大きくした場合にも、それだけのデータ量を事前取得用領域に蓄積しておくことにより、ジャンプ再生に要する時間を短縮することができる。
実施の形態4.
実施の形態4では、ジャンプ再生時の再生部24の処理を高速化する方法について記述する。
実施の形態4におけるコンテンツ再生装置の構成は、実施の形態3と同様である。
図18は再生部24の構成の一例を示すブロック図である。
図18において、バッファ23から読み出したストリーミングデータがデマルチプレクサ41に入力される。デマルチプレクサ41はストリーミングデータに多重化されたビデオストリームとオーディオストリームを抽出し、ビデオストリームをビデオバッファ42−Aに、オーディオストリームをオーディオバッファ42−Bに蓄積する。
ビデオデコーダ43−Aは、ビデオバッファ42−Aからビデオストリームを読み出し、それを復号する。オーディオデコーダ43−Bは、オーディオバッファ42−Bからオーディオストリームを読み出し、それを復号する。
なお、以下では、ビデオやオーディオなど処理するデータの種類を区別する必要が無いときは、ビデオデコーダ43−A、オーディオデコーダ43−Bなど復号を行うモジュールを復号器43と呼び、復号器43が復号するストリームを復号対象ストリームと呼び、ビデオバッファ42−A、オーディオバッファ42−Bなど復号対象ストリームを一時的に蓄積するバッファを復号用バッファ42と呼ぶ。
ジャンプ再生では同一コンテンツ内で再生位置のみ変更する。このような場合には、再生部24の処理を一時停止し、再生部24に入力するストリーミングデータを変更し、再生部24の一時停止を解除する、という処理を行うのが一般的である。
再生部24の一時停止時には、復号部43は、復号用バッファ42からの復号対象ストリーム読み出しを停止し、復号を停止する。また、再生部24の一時停止解除時には、復号部43は、復号対象ストリーム読み出しを一時停止した位置から、復号対象ストリームの読み出しを再開し、復号を再開する。
一般的な(従来の)ジャンプ再生時の、復号用バッファ42の状態の変化の例を図19(A)〜(C)に示す。図19(A)〜(C)では、復号用バッファ42の書き込みポインタをWPdとし、読み出しポインタをRPdとする。
図19(A)の状態でジャンプ再生が指示され、再生部24の処理を一時停止したとする。
再生部24に入力するストリーミングデータが変更され、再生部24の一時停止が解除された時点では、復号用バッファ42の書き込みポインタWPd、読み出しポインタRPdの値は一時停止解除前と同じである。
図19(A)の状態で書き込みポインタWPdが指すアドレスをAwpdとする。
一時停止解除後は、新しい復号対象ストリームがアドレスAwpd以降に書き込まれる。復号用バッファ42の読み出しポインタRPdがアドレスAwpdを超えるまで(図19(B))は、復号器43はジャンプ再生前に復号用バッファ42に蓄積したデータ(ジャンプ再生前蓄積済データ)を読み出し、復号することになる。
読み出しポインタRPdがアドレスAwpdを超えた後(図19(C))は、復号器43はジャンプ再生後に蓄積したデータ(ジャンプ再生後蓄積データ)を取得する。
上記の通り従来手法では、復号用バッファ42の読み出しポインタRPdが、ジャンプ再生を指示された時点での復号用バッファ42の書き込みポインタWPが指すアドレスAwpdを超えるまでは、復号部43ではジャンプ再生前蓄積済データを読み出し、復号する。つまり、ジャンプ再生を指示されてからジャンプ再生後蓄積データを復号し始めるまでに時間がかかってしまい、ジャンプ再生時にユーザが感じる待ち時間の一因となっていた。
それに対して、本実施の形態における復号用バッファ42の状態の変化の一例を図20(A)〜(D)に示す。
図20(A)は、図19(A)と同様、通常再生中に、ジャンプ再生が指示された時点でのバッファの状態を示す。
本実施の形態においては、ジャンプ再生により再生部24の一時停止が指示されたとき、復号部43は復号用バッファ42の書き込みポインタWP、読み出しポインタRPを初期化する(図20(B))。
その後、復号部43は復号用バッファ42のバッファ蓄積量(WPd−RPd)が指定量THd以上となるのを待ち(図20(C))、復号用バッファ42のバッファ蓄積量が指定量THd以上となったら、復号部43は復号用バッファ42の読み出しを開始する(図20(D))。
ここで、指定量THdは、ジャンプ再生前蓄積済データの量(即ち、図20(A)のW(Pd−RPd))と同じ値とする。
従来手法において復号部43がジャンプ再生前蓄積済データを読み出す読み出しレートより、マルチプレクサ41が復号用バッファ42に蓄積する書き込みレートの方が通常は大きい。これは、読み出しレートより書き込みレートの方が大きくないと、復号用バッファがバッファアンダーフローを起こし、正常な復号処理を行えないからである。
再生部24の一時停止が解除されてから復号部43がジャンプ再生後蓄積データを復号開始するまでにかかる時間は、従来手法においては
「ジャンプ再生前蓄積データ量」/「復号用バッファからの読み出しレート」
となり、本実施の形態においては
「指定量THb」/「復号用バッファへの書き込みレート」
となる。上記に説明したように、
「ジャンプ再生前蓄積データ量=指定量THd」
であり、
「復号用バッファからの読み出しレート」<「復号用バッファへの書き込みレート」
であるので、再生部24の一時停止が解除されてから復号部43がジャンプ再生後蓄積データを復号開始するまでの時間は、従来手法より本実施の形態の方が短くなる。
以上のように実施の形態4によれば、ジャンプ再生前に復号用バッファに蓄積したデータを復号せず、ジャンプ再生指示後に蓄積されたデータから復号を開始することにより、ジャンプ再生に要する時間を短縮することができる。
なお、実施の形態4では、復号対象ストリームとしてビデオストリームとオーディオストリームを挙げたが、対象はこの2つに限定しない。例えば字幕ストリームなどを対象にしてもよい。
また、実施の形態4では、ジャンプ再生時に復号用バッファの書き込みポインタWP、読み出しポインタRPを初期化したが、初期化しなくても、読み出しポインタRPが指す値と書き込みポインタWPが指す値が同じとなればよい。例えば、ジャンプ再生時に、書き込みポインタWPの値はそのままで、読み出しポインタRPの値を書き込みポインタWPが指す値に合わせても同様の効果が得られる。
また、実施の形態4では、指定量THdはジャンプ再生前蓄積済データの量と同じ値としたが、違う値に設定してもよい。例えばTHdの値を0にすることにより、一時停止解除時に即座に復号開始するようにしてもよい。こうすることにより、復号用バッファにおいてバッファアンダーフローが発生する可能性は高まるが、ジャンプ再生に要する時間をより短縮することができる。
また、再生部24が再生再開を指示されたときに即座に復号開始するのを、データ取得部21がストリーミングデータを蓄積するバッファのバッファ蓄積量が一定以上である場合、つまり復号用バッファ42へのデータ供給が安定して行われる見込みがある場合に限定してもよい。こうすることにより、復号用バッファ42においてバッファアンダーフローが発生する可能性を低くすることができる。