FilesBMediaFile及びBMediaTrackクラスを使用すれば、比較的苦労せずにメディアファイルを処理できるようになります。この節では、これらのクラスを使用して、メディアファイルをあるフォーマットから他のフォーマットに変換するサンプルプログラムを見ていきます。space)—を記述するparameterを入力として受け取り、そのフォーマットを記述するmedia_format構造体を返します。私達の用途では、B_RGB32の色空間が要求され、フレームはrawなビデオフォーマットになるでしょう。Files下記のtranscode()関数は、新しいファイルに新たに変換されたメディアを書込むことによって、実際にメディアファイルを他のフォーマットに変換する処理を扱います。私達は、荷を軽くするための下記のコード中に、それを見ることができます。transcode()は、オリジナルのファイルからのビデオトラックを参照するBMediaTrackを入力として受け取り、またオーディオトラックを参照する他のBMediaTrackを受け取ります。outputは、生成される新しいファイルの名前です。family_nameは、新しいファイルを生成する際に使用されるファイルフォーマットのfamilyを指定し、video_name及びaudio_nameは、ビデオ及びオーディオトラックに対してどのエンコーダが使用されるかを名前によって示します。}この関数は、出力ファイルに対してentry_refを生成することから始まります。エラーが生じたら、この関数はエラーメッセージを表示した後に終了します。}次に、要求されたファイルフォーマットのfamilyの為の適切なハンドラを探すためにget_next_file_format()を呼び出すために、ループが使用されます。指定されたfamily_nameが全ての使用可能なファイルフォーマットのshort_nameフィールドに一致しなければ、エラーがプリントされ、関数は中断します。なければ、mfiにファイルフォーマットの記述が収められます。}一旦適切なメディアファイルフォーマットが決定されたら、新しいBMediaFileが生成されます。出力ファイルのentry_refが指定され、選択されたメディアファイルフォーマットが提供されます。これは、トラックを持たない新しいメディアファイルを生成するでしょう。これが失敗したら(BMediaFile::InitCheck()がB_OK以外の何かを返したら)、エラーメッセージが表示され、BMediaFileが削除され、関数が返ります。次のコードは、新しいビデオトラックの生成を扱います。これはオリジナルのBMediaTrackへの参照であるvidtrackがNULLでない場合のみ動作するということに留意して下さい。NULLであれば、ファイル中にビデオトラックがないと想定されます。}もしビデオトラックが存在すれば、BMediaTrack::EncodedFormat()を呼び出すことでエンコードされたフォーマットを決定します。返されたmedia_formatは、元ファイルのビデオフレームのフォーマットを記述します。出力用のビデオエンコーダが指定されたら、先程実装したBuildMediaFormat()関数を用いてmedia_formatがコンストラクトされます。このフォーマットは、元のファイルから得られたフレームをrawでエンコードされないビデオバッファに読み込むために使用されるでしょう。このformatが出力するフレームに使用されるということを指定して、元のビデオトラックに対してBMediaTrack::DecodedFormat()を呼び出します。この点からさらに進めば、vidtrackによって運ばれてきたフレームは、rawなビデオフォーマットになるでしょう。bitmapバッファが生成されます。これは、rawなビデオの各々のフレームがデコードされた後で、なおかつそのフレームが新しいファイルにエンコードされる前、即ちそれらがtranscodeされている間に、そのフレームを格納します。rawなビデオフォーマットを要求された出力フォーマットに変換できるエンコーダを配置するために、もう一つのループが使用されます。これはループ中で、mfiによって指定されたmedia_file_formatでデータを受け取り、formatによって指定されたmedia_formatにフレームを変換するように、get_next_encoder()を呼び出すことで行われます。エンコーダの記述は、mciに返されます。一致するものが見つかったら、それが入力時の引数によって要求されたエンコーダの名前であるvideo_nameに一致するかチェックします。これが行われた場合、found_video_encoderフラグをtrueにセットすることで、それを受け入れます。}もしビデオエンコーダが見つかったら、そのエンコーダであるmciを使用することで新しいビデオトラックが生成されます。なければ、rawなビデオトラックが生成されます。これは、ユーザがエンコードを全く望まない場合(ユーザがvideo_nameにNULLを指定した場合)もカバーします。トラックの生成が不可能であれば、エラーメッセージが表示され、出力用のBMediaFileが削除され、関数が返ります。次に、オーディオトラックが同様の方法で用意されます。エンコードされたフォーマットが決定され、デコードされるフォーマットが指定され、そして新しいトラックの生成に続いてエンコーダが配置されます。sound_bufferは、ソースのトラックが読み込まれるのと同様に、返されたそれぞれのバッファに詰め込まれるオーディオデータの大きさを収められるように領域確保されます。}最後に、新しいファイルにヘッダを置きます。out->CommitHeader();この例では、コピーライト情報がBMediaFile::AddCopyright()呼び出しによって付け加えられます。全ての準備が整ったら、私達がファイルに対してまさにメディアデータを書き込み始めるところであることを示すために、BMediaFile::CommitHeader()を呼び出します。その後、もしトラックがひとつなら、ビデオトラックの書き込みが始まります。}もし使用するビデオエンコーダがあれば(出力データがエンコードされるなら)、BMediaTrack::CountFrames()を呼び出してビデオトラックのフレーム数を数え上げ、その後全てのフレームをループします。それぞれのフレームに対して、ユーザに何をしているか知らせるための状況通知を表示し、その後にBMediaTrack::ReadFrames()を呼び出してソースファイルから次のフレームを読み込みます。フレームが読み込まれるバッファとしてbitmapを指定し、framecountに読み込まれたフレームの数が収められます(ビデオトラックに関しては、常に1です)。media_headerであるmhは、バッファにあるデータの記述を受け取るでしょう。フレームを読み込む際にエラーが生じたら、エラーメッセージがプリントされ、ビデオの変換が中断されます。なければ、出力ビデオトラックであるvidが、BMediaTrack::WriteFrames()呼び出しによって書込まれます。新しいフレームは自動的にエンコードされ、新しいファイルに付け加えられます。これを行っている際にエラーが生じれば、エラーメッセージが表示され、処理が中断されます。}ここでの実際の相違は、BMediaTrack::ReadFrames()及びBMediaTrack::WriteFrames()を使用する代りに、BMediaTrack::ReadChunk()及びBMediaTrack::WriteChunk()を使用するということです。これらはまったくデータを解釈するよう意図せず、メディアデータを処理します。これらのループのうち1つまたはその他のループは、エラーが生じるか或いはビデオトラック全体を変換するまで動作し続けます。次に、もしオーディオトラックがあれば、それが変換されます。見ていただければ分かるように、受け取ったバッファがそれぞれひとつ以上のオーディオフレームを持つことを除いて、これは厳密にほぼ同じ方法で行われます。}一旦オーディオの変換が終了したら、私達が領域確保したビデオとオーディオのバッファを解放し、出力BMediaFileを閉じてそれを削除する他に、残された作業はほとんどありません。}この関数が返された後、呼び出し側はソースのBMediaFileを削除する責任があります。Functionメディアファイルをあるフォーマットから他のフォーマットに変換するコマンドラインユーティリティを提供する、transcode()関数を使用したmain()を見て下さい。}引数の数が2未満であれば、使用方法の情報がプリントされます。}引数は、ここで解釈されます。使用できるメディアファイルフォーマットとエンコードに関する情報をダンプします。この関数は、get_next_file_format()関数の記述の中に見ることができます。出力ファイルをAVIフォーマットに指定します。これはfamily_nameを"avi"にセットします。出力ファイルをWAVフォーマットに指定します。これはfamily_nameを"wav"にセットします。出力ファイルをAIFFフォーマットに指定します。これはfamily_nameを"aiff"にセットします。出力ファイルをQuickTimeムービーに指定します。これはfamily_nameを"quicktime"にセットします。-quicktimeの略式です。myformat"といった具合に、上記以外のビデオエンコーダ名を指定します。audiowonderness"といった具合に、上記以外のオーディオエンコーダ名を指定します。inputは入力ファイルの名前であり、outputは生成される新しいメディアファイルの名前です。}もし出力ファイルの名前が指定されなければ、名前として"output"が想定されます。入力ファイルを参照するentry_refがコンストラクトされます。ファイルが見つからなければ、エラーメッセージがプリントされ、プログラムが中断されます。}その後、inputファイルを参照するBMediaFileのインスタンスが生成されます。エラーが生じたら、エラーが表示されてプログラムが中断されます。copyright);ソースファイルにあるトラックの数はBMediaFile::CountTracks()を呼び出すことによって得られ、ファイルの著作権情報はBMediaFile::Copyright()を呼び出すことで得られます。この情報はユーザに読めるようにプリントされます。}次に、ループは、トラックを参照するBMediaTrackオブジェクトを得るために、ファイルに含まれる全てのトラックをBMediaFile::TrackAt()呼び出しによってひとつずつ繰り返し処理します。これは、変換されるビデオ及びオーディオトラックを全て探しだすのに役立ちます。ほとんどのムービーはいずれかひとつのみトラックを持ちますが、変換する際には無視する必要のある他の情報トラックを持つかも知れません。}もしビデオトラックもオーディオトラックもなければ、ソースファイルは空であり、変換する価値がないため、エラーメッセージが表示され、プログラムは中断されます。"quicktime";もしユーザが出力ファイルのfamilyを指定していなければ、ファイルはビデオトラックを持たず、WAVファイルフォーマットが想定されます。この部分で、"wab"を"aiff"に変更することによって、オーディオのみのファイルに対してAIFFを想定するようプログラムを変更できます。ビデオトラックを持つ任意のファイルに対して、もしfamilyがユーザによって指定されていなければ、QuickTimeフォーマットが想定されます。繰り返しになりますが、もしデフォルトで他のフォーマットになるようにしたいなら、ここで変更することができます。audio_encoder_name);変換は、実際に作業を行うためのtranscode()にこれら全てのparameterを渡すことで行われます。}transcode()が返ってきたら、単純にソースファイルを削除してプログラムを抜けます。(transcode()でエラーが生じなかったと仮定すると)ファイルは変換されています。Application実際にアプリケーションを作る場合、それぞれのフォーマットに対してエンコーダが提供されるとの同じように、使用できる多様なメディアファイルフォーマットのリストをユーザが概観する手段を提供する必要があるでしょう。get_next_file_format()関数の記述内部で討議されるdump_info()サンプル関数は、これをどうやって可能にするかを表します。reserved..。