Я совершенно не понимаю, как сохранить видеопоток в файл mp4. Я использую ffmpeg. Позвольте мне объяснить проблему:
Проблема заключается в том, что получающееся в результате видео mp4 имеет артефакты, если я пытаюсь просмотреть его с помощью VLC, Windows Media Player или другого.
Я также понял, что точки этих пакетов не являются непрерывными, в то время как точки непрерывны. Я знаю о B кадрах, но это проблема в моем случае?
// Prepare the output
AVFormatContext* oc = avformat_alloc_context();
oc->oformat = av_guess_format(NULL, "video.mp4", NULL);
// Must write header, packets, and trailing
avio_open2(&oc->pb, "video.mp4", AVIO_FLAG_WRITE, NULL, NULL);
// Write header
AVStream* stream = avformat_new_stream(oc, (AVCodec*) context->streams[video_stream_index]->codec->codec);
avcodec_copy_context(stream->codec, context->streams[video_stream_index]->codec);
stream->sample_aspect_ratio = context->streams[video_stream_index]->codec->sample_aspect_ratio;
avformat_write_header(oc, NULL);
// FOR EACH FRAME...
... av_write_frame(oc, circular[k]); ...
// Write trailer and close the file
av_write_trailer(oc);
avcodec_close(stream->codec);
avio_close(oc->pb);
avformat_free_context(oc);
Огромное спасибо,
Первое: когда вы работаете с камерой, лучше работать через RTP через TCP (TCP как транспортный протокол).
Чтобы включить эту функцию:
AVDictionary *ifmtdict;
av_dict_set(&ifmtdict, "rtsp_transport", "tcp", 0);
...
avformat_open_input (..., &ifmtdict);
Во-вторых:
После того, как пакеты начнут поступать, дождитесь первого ключевого кадра и начните запись в файл с этого момента.
Других решений пока нет …