제11회 Raspberry Pi로 감시 카메라를 만들자! ~동영상 보존편~

Raspberry Pi와 전용 카메라 모듈을 사용하여 ONVIF 지원 감시 카메라를 만듭니다 시리즈 기사
이 기사는 링크 정보 시스템 주식회사의 유지가 작성하고 있습니다.

이번에는 동영상 데이터의 파일 저장에 대해 설명합니다.

동영상 저장



ffmpeg를 사용하여 TS 파일 저장



・동영상의 파일 형식에 대해서
H.264 형식의 동영상 파일의 파일 컨테이너로는 MP4, AVI, TS 등을 생각할 수 있습니다.
전체의 재생 시간이나 포함되는 영상 데이터, 음성 데이터의 형식이라고 하는 정보와 실제의 데이터를 보존하는 구조가 파일 컨테이너가 됩니다.



이번에는 복수의 파일을 단순하게 연결하는 것만으로, 하나의 긴 동영상을 작성할 수 있는, TS 형식으로 동영상 파일을 작성합니다.

ffmpeg를 사용한 동영상 파일 작성 처리는 다음과 같은 처리가 됩니다.
// ファイル出力用のコンテキストを割り当てる
ic = avformat_alloc_context();

// フォーマットを設定
AVOutputFormat* fmt = av_guess_format(NULL, "dummy.ts", NULL);
ic->oformat = fmt;

// 動画を追加
AVStream* st = avformat_new_stream(ic, NULL);
st->codec->codec_type     = AVMEDIA_TYPE_VIDEO;
st->codec->codec_id       = AV_CODEC_ID_H264;
st->codec->width          = m_width;
st->codec->height         = m_height;
st->time_base.num         = ts_time_base.num;
st->time_base.den         = ts_time_base.den;
st->codec->extradata_size = video_extradata_size;

st->codec->extradata = (uint8_t*)av_malloc(video_extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
memcpy(st->codec->extradata, video_extradata, video_extradata_size);
memset(st->codec->extradata + video_extradata_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);

if (fmt->flags & AVFMT_GLOBALHEADER)
{
st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
}

// ヘッダを出力
avformat_write_header(ic, NULL);

while(指定された時間繰り返す)
{
  // 動画データを出力
  av_interleaved_write_frame(ic, &inpkt);
}

// フッダを出力
av_write_trailer(ic);

// ストリーム出力を開放する
av_free(ic->pb);
ic->pb = NULL;
avformat_free_context(ic);

위의 예에서는 설명하지 않지만 다양한 재생 앱에서 재생할 수 있는 호환성이 높은 파일을 만들려면 다음과 같은 궁리를 해야 합니다.

· 최초로 출력하는 동화상 데이터는 IDR 프레임의 동화상 데이터로 한다.
· IDR 프레임 앞에는 반드시 SPS, PPS를 부여한다.

이 규칙을 준수하지 않으면 TS 파일로는 정확하지만 응용 프로그램에 따라 재생할 수 없습니다.

그러므로 일정 시간에 파일을 분할하는 경우는 IDR 프레임에 도달했을 때 그때까지의 파일을 닫고 IDR 프레임 이후를 새 파일로 출력해야 합니다.



색인 기사로
제10회 기사에
제12회 기사에

링크 정보 시스템 주식회사 그럼 함께 일하는 동료를 수시 모집 하고 있습니다!
또, 일의 의뢰, 비즈니스 파트너님도 모집하고 있습니다. 부담없이 연락 제발.

좋은 웹페이지 즐겨찾기