제11회 Raspberry Pi로 감시 카메라를 만들자! ~동영상 보존편~
7948 단어 RaspberryPiONVIFIoT카메라라즈파이
이 기사는 링크 정보 시스템 주식회사의 유지가 작성하고 있습니다.
이번에는 동영상 데이터의 파일 저장에 대해 설명합니다.
동영상 저장
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회 기사에
링크 정보 시스템 주식회사 그럼 함께 일하는 동료를 수시 모집 하고 있습니다!
또, 일의 의뢰, 비즈니스 파트너님도 모집하고 있습니다. 부담없이 연락 제발.
Reference
이 문제에 관하여(제11회 Raspberry Pi로 감시 카메라를 만들자! ~동영상 보존편~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/lis-hanzomon/items/91c283c3310b2e0f7858
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
// ファイル出力用のコンテキストを割り当てる
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);
Reference
이 문제에 관하여(제11회 Raspberry Pi로 감시 카메라를 만들자! ~동영상 보존편~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/lis-hanzomon/items/91c283c3310b2e0f7858텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)