Changeset 14223 for docs

Show
Ignore:
Timestamp:
06/18/08 22:36:22 (5 months ago)
Author:
hiratara
Message:

空白の調整
後編を加筆修正。
av_interleaved_write_frameの方が安全なようなので無難な方に修正。

Location:
docs/hiratara/20080325-codezine-ffmpeg_api
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • docs/hiratara/20080325-codezine-ffmpeg_api/FFmpeg_api2.txt

    r13339 r14223  
    7474続く^^av_alloc_format_context^^では、フォーマット情報を格納するための^^AVFormatContext^^構造体を確保しています。この構造体の^^oformat^^フィールドに^^AVOutputFormat^^を、^^filename^^フィールドにはファイル名をセットします。 
    7575 
    76 なお、ファイル名をセットするために使っている^^av_strlcpy^^はlibavutil/avstring.hで宣言されており、文字列のコピーを行うユーティリティ関数となっています。^^filename^^フィールドには、文字列の先頭文字へのポインタではなく、文字列の実体を入れる必要があるため、この関数を利用してコピーを行っています。 
     76なお、ファイル名をセットするために使っている^^av_strlcpy^^はlibavutil/avstring.hで宣言されており、文字列のコピーを行うユーティリティ関数となっています。^^filename^^フィールドには、文字列の先頭文字へのポインタではなく、文字配列のコピーを実際に入れる必要があるため、この関数を利用してコピーを行っています。 
    7777 
    7878□ストリームを開き、動画コーデックを割り当てる 
     
    8282前編で説明したように、動画ファイルには音声、動画等、複数のストリームが含まれます。読み込みの場合には、複数のストリームの中から動画を扱うストリームだけを選び出す処理を書き、そのストリームから来たパケットを復号してフレームを得ました。 
    8383 
    84 書き出しでも同様に、パケットの書き込みはストリームを指定して行うため、ストリームを用意しておく必要があります。先ほど用意した^^AVFormatContext^^へ、パケットを書き込むための^^AVStream^^を追加します。 
     84書き出しでもパケットの書き込みはストリームを指定して行うため、そのためのストリームを用意しておく必要があります。先ほど用意した^^AVFormatContext^^へ、パケットを書き込むための^^AVStream^^を追加します。 
    8585 
    8686[s:c;ストリームを追加] 
     
    109109^^av_guess_codec^^はlibavformat/avformat.hで宣言されており、ファイルフォーマットやファイル名等の情報から適切なコーデックを予想します。引数は5つあり、順に「出力フォーマット」「コーデック名」「ファイル名」「MIMEタイプ」「コーデック種別」となっています。 
    110110 
    111 コーデックのIDがわかったら、^^AVCodec^^構造体を入手します。^^avcodec_find_encoder^^は、読み込みの時に登場した^^avcodec_find_decoder^^と同じようにコーデックIDを元に^^AVCodec^^を返す関数です。ただし今度はデコーダではなく、エンコーダを返してきます。 
    112  
    113 [c:^^av_guess_codec^^使用時の注意] 
     111コーデックのIDがわかったら、^^AVCodec^^構造体を入手します。^^avcodec_find_encoder^^は、読み込みの時に登場した^^avcodec_find_decoder^^と同じようにコーデックIDを元に^^AVCodec^^を返す関数です。ただし今度はデコーダではなく、エンコーダを返してきます。 
     112 
     113[c:av_guess_codec使用時の注意] 
    114114^^av_guess_codec^^の引数としてコーデック名も直接指定できるのですが、r13235の実装では利用されてないようです。よって、この関数を利用してもファイルフォーマットのデフォルトのコーデックしか得られません。 
    115  
     115  
    116116利用したいコーデックが決まっている場合は^^avcodec_find_encoder_by_name^^を利用する必要があります。ffmpeg.cでも、-vcodecオプションなどでコーデック名が入力されている場合はこちらを利用しています。 
    117117[/c] 
     
    199199[c:出力ファイルを開かない場合もある?] 
    200200実は、今回の出力フォーマットである"image2"フォーマットでは、ファイルを開く必要はありません。"image2"フォーマットでは、出力ファイル名を"image%d.jpeg"等と指定し、image0.jpeg、image1.jpeg、...、と複数ファイルに連続をしてサムネイルを書き込むことができます。そのため、通常の動画ファイルのように一つのファイルを開いてそこにデータを流し込むと言う構造には、うまく適合しないのです。 
    201  
     201  
    202202"image2"フォーマットの^^flags^^フィールドには^^AVFMT_NOFILE^^フラグが立っていますので、^^url_fopen^^は実際には飛ばされます。 
    203203[/c] 
     
    305305○パケットを書き出す 
    306306 
    307 最後に、このパケットを書き出します。読み込みには^^av_read_frame^^を使いましたが、書き込みには^^av_write_frame^^を使います 
     307最後に、このパケットを書き出します。読み込みには^^av_read_frame^^を使いましたが、書き込みには^^av_interleaved_write_frame^^を使います。^^av_write_frame^^と言う関数もありますが、^^av_interleaved_write_frame^^だとパケットの書き出し順が正しくなるのを保証してくれるとのことですので、こちらの方が安心でしょう 
    308308 
    309309[s:c;パケットの書き出し(ループ内)] 
    310310        /* パケットを書き込む */ 
    311         int ret = av_write_frame(formatCtx, &packet); 
     311        int ret = av_interleaved_write_frame(formatCtx, &packet); 
    312312        if(ret != 0) error("can't write frame."); 
    313313 
     
    368368[/c] 
    369369 
    370 前編と併せ、これで動画をデコードして読み込み、サムネイルとしてエンコードして書き込む処理が完成しました。今回、読み込みから書き込みの受け渡しに利用した^^AVFrame^^を加工することで、様々な動画を作ることができます。お試し下さい。 
     370前編と併せ、これで動画をデコードして読み込み、サムネイルとしてエンコードして書き込む処理が完成しました。今回は読み込みで得た^^AVFrame^^をそのまま書き出しましたが、書き込みの前にフレームを加工することで様々な動画を作ることができます。画像処理の知識がある方は、ぜひともお試し下さい。 
    371371 
    372372 
     
    385385□output_packet 
    386386 
    387 ^^av_encode^^より呼ばれます。読み込んだパケットを1つ受け取り、復号までを行います。 
     387^^av_encode^^より呼ばれます。読み込んだパケットを1つ受け取り、^^avcodec_decode_video^^を利用してフレームを復号するところまでを行います。 
    388388 
    389389□do_video_out、do_audio_out 
    390390 
    391 ^^output_packet^^より呼ばれます。復号されたデータを受け取り、出力フォーマットに併せて符号化してパケットを作成します。動画のサイズ変更やPTSの同期処理なども行っています。 
     391^^output_packet^^より呼ばれます。復号されたデータを受け取り、^^avcodec_encode_video^^を利用し、出力フォーマットに併せて符号化してパケットを作成します。動画のサイズ変更やPTSの同期処理なども行っています。 
    392392 
    393393□write_frame 
    394394 
    395 ^^do_video_out^^や^^do_audio_out^^等から呼ばれます。パケットの書き込み処理を行います。 
     395^^do_video_out^^や^^do_audio_out^^等から呼ばれます。パケットを受け取り、書き込み処理を行います。書き出す直前に、-vbsfや-absfなどのオプションで指定できるbitstream filterの処理が行われています。 
    396396 
    397397 
     
    405405動画を吐き出すサンプルです。書き出し部分だけがコンパクトにまとまっているソースなので、ffmpeg.cが複雑過ぎてわからない時に参考にすると良いでしょう。 
    406406 
     407なお、このソースではパケットの書き出しに、^^av_interleaved_write_frame^^の代わりに^^av_write_frame^^を利用しています。正確な順序でパケットを送り出せる場合は、こちらのほうがパフォーマンスがよくなるそうです。 
     408 
    407409 
    408410●libavformat/avformat.h、libavcodec/avcodec.h 等ヘッダファイル 
    409411 
    410412ヘッダファイルの関数宣言には、doxygen方式で関数コメントが書かれています。引数や戻り値、関数の概要等を調べたい時に便利です。 
     413 
     414[Doxygen[http://www.stack.nl/~dimitri/doxygen/]]がインストールされている場合、FFmpegのソースツリーのrootでdoxygenコマンドを実行すると、doxyディレクトリの下にHTMLドキュメントが吐き出されます。 
    411415 
    412416 
     
    426430[l:+] 
    427431+『[FFmpegで作る動画共有サイト[http://www.amazon.co.jp/exec/obidos/ASIN/483992466X/shoeishacom-22/]]』 月村潤・本間雅洋・堀田直孝・原一浩・足立健誌・尾花衣美・堀内康弘・寺田学 著、毎日コミュニケーションズ、2008年1月 
     432@@[ffmpeg_cov.gif]http://www.amazon.co.jp/exec/obidos/ASIN/483992466X/shoeishacom-22/@@ 
    428433+『[An FFmpeg and SDL Tutorial[http://www.dranger.com/ffmpeg/]]』 
    429434+パイオニア株式会社 『[技術開発【MPEG技術解説】[http://pioneer.jp/crdl/tech/mpeg/1.html]]』 
  • docs/hiratara/20080325-codezine-ffmpeg_api/make_thumb.c

    r10803 r14223  
    267267 
    268268        /* パケットを書き込む */ 
    269         int ret = av_write_frame(formatCtx, &packet); 
     269        int ret = av_interleaved_write_frame(formatCtx, &packet); 
    270270        if(ret != 0) error("can't write frame."); 
    271271