Я довольно смущен тем, как сохранить видеопоток в файл mp4. Я использую ffmpeg. Позвольте мне объяснить проблему:Сохранение кадров с сетевой камеры (RTSP) в файл mp4
- Я подключиться к сетевой камере через RTSP (H.264 поток) с avformat_open_input(), avformat_find_stream_info(), av_read_play(), и я получаю кадры с av_read_frame().
- Каждый раз, когда я получаю кадр с av_read_frame(), я сохраняю соответствующий AVPacket в круговом буфере.
- В некоторых случаях в моем приложении выбран диапазон этого кругового буфера. Я нахожу ключевой кадр, используемый для начала.
- Как только у меня есть список AVPacket, начинающийся с ключевого кадра, я пишу заголовок, фреймы и хвост, как я описал ниже в коде.
Проблема заключается в том, что получаемое видео mp4 имеет артефакты, если я пытаюсь посмотреть его с помощью VLC, Windows Media Player или другого.
Я также понял, что точки этих пакетов не являются непрерывными, а dts - непрерывными. Я знаю о кадрах 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);
Спасибо большое,
Вы можете посмотреть rtmpdump для справки (или даже просто использовать librtmp напрямую) - http://rtmpdump.mplayerhq.hu/ – benjymous