SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

FFmpeg APIで、さまざまな動画を操る

FFmpeg APIで、さまざまな動画を操る - 後編

自作アプリケーションに動画の書き出し処理を組み込む

利用したメモリを解放し、終了する

 最後に、後処理としてコーデックやファイルを閉じ、今まで使った領域を解放して終了します。

ファイルのクローズ
/* ファイル閉じる */
av_write_trailer(formatCtx);
if (! ( format->flags & AVFMT_NOFILE )) {
    ret = url_fclose(formatCtx->pb);
    if(ret < 0) error("can't close output file.");
}

 av_write_trailer関数を呼ぶと、必要であればファイルのフッター部分が書き出されます。そして、url_fclose関数によってファイルを閉じます。ファイルを開くときと同様に、"image2"フォーマットの場合はこの部分は処理されません。

コーデックのクローズ
/* codecを閉じる */
avcodec_close(stream->codec);

 コーデックを閉じるのは、読み込み時と同様にavcodec_closeを呼ぶだけでOKです。

解放処理
/* 確保した領域の解放 */
av_freep(&buf);

/* ストリームを解放する。(注意: 今回は0しか使っていない) */
for(i = 0; i < formatCtx->nb_streams; i++) {
    av_freep(&formatCtx->streams[i]->codec);
    av_freep(&formatCtx->streams[i]);
}
av_freep(&formatCtx);

 av_freepを利用して、確保したポインタを解放していきます。

 AVFormatContextの解放に関しては、その内部に格納したAVStream、さらにその内部のAVCodecContextも併せて解放するようです。この部分のコードは、ffmpeg.cの終了処理とあわせています。

av_close_output_file ???
 AVFormatContextに関しては、事前にav_alloc_format_contextを呼んでますので、これを自前で解放するのは極自然に見えます。しかし、AVStreamはav_new_streamを呼んだだけなので、これを自前で解放するのかどうかは迷うとこです。AVCodecContextに至っては、AVStream内のフィールドに保存してあった物を借りただけなので、勝手に解放していいとはとても思えません。
 
 一方、出力ではなく読み込みのファイルに関しては、av_close_input_fileが用意されています。実は、今回参照したffmpeg.cの該当部分のコメントを読んでみると、次のように書かれています。
 
ffmpeg.c内のコメント
/* maybe av_close_output_file ??? */
 
 このコメントから考えるて、将来のバージョンではav_open_output_file関数とav_close_output_fileが追加される可能性は極めて高いと言えると思います。

 前編と併せ、これで動画をデコードして読み込み、サムネイルとしてエンコードして書き込む処理が完成しました。今回は読み込みで得たAVFrameをそのまま書き出しましたが、書き込みの前にフレームを加工することでさまざまな動画を作ることができます。画像処理の知識がある方は、ぜひともお試しください。

次のページ
FFmpeg APIの情報源

この記事は参考になりましたか?

FFmpeg APIで、さまざまな動画を操る連載記事一覧
この記事の著者

hiratara(ヒラタラ)

1977年に苫小牧市で生まれる。北海道大学理学部数学科卒。小学生の頃、両親に買い与えられたMZ-2500でプログラミングを始めた。学生時代、CGIの自作に没頭し、それ以降WEB開発の魅力に憑かれる。社会人になっても数学好きは変わらず、専門書を買い集めるのが最近の趣味。id:hirataraにてblogを執筆...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2622 2008/07/14 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー