gpt4 book ai didi

c - 将视频输出到文件和管道 : simultaneously using FFmpeg Libav

转载 作者:行者123 更新时间:2023-12-04 23:18:27 28 4
gpt4 key购买 nike

我一直在尝试将视频(来自我的网络摄像头)同时输出到文件('out.mkv')和管道:
文件获取过滤帧,管道:获取未过滤的原始视频。
我的帧速率是 30 fps。但是,我的文件输出中的帧速率要低得多。
附加的是 while 循环,它读取数据包并将它们写入输出:

while (1) {
av_read_frame(ifmt_ctx, packet);
stream_index = packet->stream_index;
StreamContext *stream = &file_stream_ctx[stream_index];
av_packet_rescale_ts(packet,
ifmt_ctx->streams[stream_index]->time_base,
stream->dec_ctx->time_base);
avcodec_send_packet(stream->dec_ctx, packet);

while (ret >= 0) {
avcodec_receive_frame(stream->dec_ctx, stream->dec_frame);
stream->dec_frame->pts = stream->dec_frame->best_effort_timestamp;
ret = filter_encode_write_frame(stream->dec_frame, stream_index,file_stream_ctx,file_filter_ctx, file_ofmt_ctx);
ret = av_interleaved_write_frame(pipe_ofmt_ctx, packet);
}
}
'ifmt_ctx' 是网络摄像头的 AVFormatContext。
“file_ofmt_ctx”是输出文件管道的 AVFormatContext,而 pipe_ofmt_ctx 是 AVFormatContext。
'file_stream_ctx' 和 'file_filter_ctx' 是用于过滤和编码文件输出的流和过滤器上下文。
我的猜测是写入管道花费的时间太长,并且不允许按时读取下一个数据包 - 导致帧速率降低。那有意义吗?如果是这样 - 关于如何解决它的任何建议? (我尝试使用 AVFMT_FLAG_NONBLOCK 但它似乎没有帮助)。
谢谢
希勒尔

最佳答案

没有任何分析很难判断,但鉴于您所看到的,您可能是正确的。如果您看到更好的性能,我很想知道您是否消除了其中一个写出。
我总是将数据包或帧(视情况而定)写入队列并有一个单独的线程进行写入。您甚至可能需要两个线程——一个用于视频(数据包队列),一个用于帧。
顺便说一句,我认为 avcodec_send_packet(stream->dec_ctx, packet); 行消耗数据包,所以当你稍后在 ret = av_interleaved_write_frame(pipe_ofmt_ctx, packet); 中使用它时这似乎行不通。您可以尝试复制数据包,看看是否有帮助:av_packet_ref(new_packet, packet);假设您当然已经分配了 new_packet 。听起来不像你看到的那样,所以你在做什么可能没问题。但是你也可以尝试一下。

关于c - 将视频输出到文件和管道 : simultaneously using FFmpeg Libav,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71688627/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com