我对如何将视频流保存到 mp4 文件感到很困惑。我正在使用 ffmpeg。让我解释一下问题:
问题是,如果我尝试使用 VLC、Windows Media Player 或其他软件观看,生成的 mp4 视频会出现伪影。
我也意识到该数据包的 pts 不是连续的,而 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);
太感谢了,
最佳答案
第一:当您使用相机时,最好通过 RTP over TCP(TCP 作为传输协议(protocol))工作。
要启用此功能:
AVDictionary *ifmtdict;
av_dict_set(&ifmtdict, "rtsp_transport", "tcp", 0);
...
avformat_open_input (..., &ifmtdict);
第二:
数据包开始到来后,等待第一个关键帧并从这一刻开始写入文件。
关于c++ - 将来自网络摄像机 (RTSP) 的帧保存到 mp4 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20522950/