- Timestamp:
- 06/18/08 22:36:22 (5 months ago)
- Location:
- docs/hiratara/20080325-codezine-ffmpeg_api
- Files:
-
- 2 modified
-
FFmpeg_api2.txt (modified) (9 diffs)
-
make_thumb.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
docs/hiratara/20080325-codezine-ffmpeg_api/FFmpeg_api2.txt
r13339 r14223 74 74 続く^^av_alloc_format_context^^では、フォーマット情報を格納するための^^AVFormatContext^^構造体を確保しています。この構造体の^^oformat^^フィールドに^^AVOutputFormat^^を、^^filename^^フィールドにはファイル名をセットします。 75 75 76 なお、ファイル名をセットするために使っている^^av_strlcpy^^はlibavutil/avstring.hで宣言されており、文字列のコピーを行うユーティリティ関数となっています。^^filename^^フィールドには、文字列の先頭文字へのポインタではなく、文字 列の実体を入れる必要があるため、この関数を利用してコピーを行っています。76 なお、ファイル名をセットするために使っている^^av_strlcpy^^はlibavutil/avstring.hで宣言されており、文字列のコピーを行うユーティリティ関数となっています。^^filename^^フィールドには、文字列の先頭文字へのポインタではなく、文字配列のコピーを実際に入れる必要があるため、この関数を利用してコピーを行っています。 77 77 78 78 □ストリームを開き、動画コーデックを割り当てる … … 82 82 前編で説明したように、動画ファイルには音声、動画等、複数のストリームが含まれます。読み込みの場合には、複数のストリームの中から動画を扱うストリームだけを選び出す処理を書き、そのストリームから来たパケットを復号してフレームを得ました。 83 83 84 書き出しでも 同様に、パケットの書き込みはストリームを指定して行うため、ストリームを用意しておく必要があります。先ほど用意した^^AVFormatContext^^へ、パケットを書き込むための^^AVStream^^を追加します。84 書き出しでもパケットの書き込みはストリームを指定して行うため、そのためのストリームを用意しておく必要があります。先ほど用意した^^AVFormatContext^^へ、パケットを書き込むための^^AVStream^^を追加します。 85 85 86 86 [s:c;ストリームを追加] … … 109 109 ^^av_guess_codec^^はlibavformat/avformat.hで宣言されており、ファイルフォーマットやファイル名等の情報から適切なコーデックを予想します。引数は5つあり、順に「出力フォーマット」「コーデック名」「ファイル名」「MIMEタイプ」「コーデック種別」となっています。 110 110 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使用時の注意] 114 114 ^^av_guess_codec^^の引数としてコーデック名も直接指定できるのですが、r13235の実装では利用されてないようです。よって、この関数を利用してもファイルフォーマットのデフォルトのコーデックしか得られません。 115 115 116 116 利用したいコーデックが決まっている場合は^^avcodec_find_encoder_by_name^^を利用する必要があります。ffmpeg.cでも、-vcodecオプションなどでコーデック名が入力されている場合はこちらを利用しています。 117 117 [/c] … … 199 199 [c:出力ファイルを開かない場合もある?] 200 200 実は、今回の出力フォーマットである"image2"フォーマットでは、ファイルを開く必要はありません。"image2"フォーマットでは、出力ファイル名を"image%d.jpeg"等と指定し、image0.jpeg、image1.jpeg、...、と複数ファイルに連続をしてサムネイルを書き込むことができます。そのため、通常の動画ファイルのように一つのファイルを開いてそこにデータを流し込むと言う構造には、うまく適合しないのです。 201 201 202 202 "image2"フォーマットの^^flags^^フィールドには^^AVFMT_NOFILE^^フラグが立っていますので、^^url_fopen^^は実際には飛ばされます。 203 203 [/c] … … 305 305 ○パケットを書き出す 306 306 307 最後に、このパケットを書き出します。読み込みには^^av_read_frame^^を使いましたが、書き込みには^^av_ write_frame^^を使います。307 最後に、このパケットを書き出します。読み込みには^^av_read_frame^^を使いましたが、書き込みには^^av_interleaved_write_frame^^を使います。^^av_write_frame^^と言う関数もありますが、^^av_interleaved_write_frame^^だとパケットの書き出し順が正しくなるのを保証してくれるとのことですので、こちらの方が安心でしょう。 308 308 309 309 [s:c;パケットの書き出し(ループ内)] 310 310 /* パケットを書き込む */ 311 int ret = av_ write_frame(formatCtx, &packet);311 int ret = av_interleaved_write_frame(formatCtx, &packet); 312 312 if(ret != 0) error("can't write frame."); 313 313 … … 368 368 [/c] 369 369 370 前編と併せ、これで動画をデコードして読み込み、サムネイルとしてエンコードして書き込む処理が完成しました。今回 、読み込みから書き込みの受け渡しに利用した^^AVFrame^^を加工することで、様々な動画を作ることができます。お試し下さい。370 前編と併せ、これで動画をデコードして読み込み、サムネイルとしてエンコードして書き込む処理が完成しました。今回は読み込みで得た^^AVFrame^^をそのまま書き出しましたが、書き込みの前にフレームを加工することで様々な動画を作ることができます。画像処理の知識がある方は、ぜひともお試し下さい。 371 371 372 372 … … 385 385 □output_packet 386 386 387 ^^av_encode^^より呼ばれます。読み込んだパケットを1つ受け取り、 復号までを行います。387 ^^av_encode^^より呼ばれます。読み込んだパケットを1つ受け取り、^^avcodec_decode_video^^を利用してフレームを復号するところまでを行います。 388 388 389 389 □do_video_out、do_audio_out 390 390 391 ^^output_packet^^より呼ばれます。復号されたデータを受け取り、 出力フォーマットに併せて符号化してパケットを作成します。動画のサイズ変更やPTSの同期処理なども行っています。391 ^^output_packet^^より呼ばれます。復号されたデータを受け取り、^^avcodec_encode_video^^を利用し、出力フォーマットに併せて符号化してパケットを作成します。動画のサイズ変更やPTSの同期処理なども行っています。 392 392 393 393 □write_frame 394 394 395 ^^do_video_out^^や^^do_audio_out^^等から呼ばれます。パケット の書き込み処理を行います。395 ^^do_video_out^^や^^do_audio_out^^等から呼ばれます。パケットを受け取り、書き込み処理を行います。書き出す直前に、-vbsfや-absfなどのオプションで指定できるbitstream filterの処理が行われています。 396 396 397 397 … … 405 405 動画を吐き出すサンプルです。書き出し部分だけがコンパクトにまとまっているソースなので、ffmpeg.cが複雑過ぎてわからない時に参考にすると良いでしょう。 406 406 407 なお、このソースではパケットの書き出しに、^^av_interleaved_write_frame^^の代わりに^^av_write_frame^^を利用しています。正確な順序でパケットを送り出せる場合は、こちらのほうがパフォーマンスがよくなるそうです。 408 407 409 408 410 ●libavformat/avformat.h、libavcodec/avcodec.h 等ヘッダファイル 409 411 410 412 ヘッダファイルの関数宣言には、doxygen方式で関数コメントが書かれています。引数や戻り値、関数の概要等を調べたい時に便利です。 413 414 [Doxygen[http://www.stack.nl/~dimitri/doxygen/]]がインストールされている場合、FFmpegのソースツリーのrootでdoxygenコマンドを実行すると、doxyディレクトリの下にHTMLドキュメントが吐き出されます。 411 415 412 416 … … 426 430 [l:+] 427 431 +『[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/@@ 428 433 +『[An FFmpeg and SDL Tutorial[http://www.dranger.com/ffmpeg/]]』 429 434 +パイオニア株式会社 『[技術開発【MPEG技術解説】[http://pioneer.jp/crdl/tech/mpeg/1.html]]』 -
docs/hiratara/20080325-codezine-ffmpeg_api/make_thumb.c
r10803 r14223 267 267 268 268 /* パケットを書き込む */ 269 int ret = av_ write_frame(formatCtx, &packet);269 int ret = av_interleaved_write_frame(formatCtx, &packet); 270 270 if(ret != 0) error("can't write frame."); 271 271
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)