利用したメモリを解放し、終了する
最後に、後処理としてコーデックやファイルを閉じ、今まで使った領域を解放して終了します。
/* ファイル閉じる */ 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_input_fileが用意されています。実は、今回参照したffmpeg.cの該当部分のコメントを読んでみると、次のように書かれています。
/* maybe av_close_output_file ??? */
このコメントから考えるて、将来のバージョンではav_open_output_file関数とav_close_output_fileが追加される可能性は極めて高いと言えると思います。
前編と併せ、これで動画をデコードして読み込み、サムネイルとしてエンコードして書き込む処理が完成しました。今回は読み込みで得たAVFrameをそのまま書き出しましたが、書き込みの前にフレームを加工することでさまざまな動画を作ることができます。画像処理の知識がある方は、ぜひともお試しください。
