gpt4 book ai didi

c++ - 重复 ffmpeg 流(libavcodec/libavformat)

转载 作者:搜寻专家 更新时间:2023-10-31 00:09:01 25 4
gpt4 key购买 nike

我正在使用 ffmpeg 的各种 API 在我的应用程序中绘制视频。到目前为止,这非常有效。因为我也有 gif,所以我想循环播放而不必一遍又一遍地加载文件。

在我的代码中,解码器循环如下所示:

 AVPacket packet = {};
av_init_packet(&packet);
while (mIsRunning) {
int error = av_read_frame(mContext, &packet);
if (error == AVERROR_EOF) {
if(mRepeat) {
logger.info("EOF-repeat");
auto stream = mContext->streams[mVideoStream];
av_seek_frame(mContext, mVideoStream, 0, 0);
continue;
}
if (mReadVideo) {
avcodec_send_packet(mVideoCodec, nullptr);
}
if (mReadAudio) {
avcodec_send_packet(mAudioCodec, nullptr);
}
break;
}

if (error < 0) {
char err[AV_ERROR_MAX_STRING_SIZE];
av_make_error_string(err, AV_ERROR_MAX_STRING_SIZE, error);
logger.error("Failed to read next frame from stream: ", err);
throw std::runtime_error("Stream reading failed");
}

if (packet.stream_index == mVideoStream && mReadVideo) {
int32 err;
{
std::lock_guard<std::mutex> l(mVideoLock);
err = avcodec_send_packet(mVideoCodec, &packet);
}
mImageEvent.notify_all();
while (err == AVERROR(EAGAIN) && mIsRunning) {
{
std::unique_lock<std::mutex> l(mReaderLock);
mReaderEvent.wait(l);
}
{
std::lock_guard<std::mutex> l(mVideoLock);
err = avcodec_send_packet(mVideoCodec, &packet);
}
}
}

av_packet_unref(&packet);
}

将视频读到最后效果非常好,如果我不将 mRepeat 设置为 true,它会正确地结束 EOF 并停止解析。但是,当我使用循环时,会发生以下情况:

  • 视频结束
  • AVERROR_EOF 发生在 av_read_frame
  • EOF-repeat 被打印
  • 从流中读取随机帧(并渲染)
  • AVERROR_EOF 发生在 av_read_frame
  • EOF-repeat 被打印
  • 从流中读取随机帧(并渲染)
  • ...

你可以想象它就像我有一个旋转的地球的 gif,在旋转一整圈后它开始随机跳跃,有时正确地跳几分之一秒,有时向后跳,有时到处随机跳动。

我还尝试了几个版本的 avformat_seek_file 还有什么其他方法可以将所有内容重置为开头并再次从头开始?

最佳答案

我发现我还需要将我的 IO 上下文重置为开头:

if(mRepeat) {
auto stream = mContext->streams[mVideoStream];
avio_seek(mContext->pb, 0, SEEK_SET);
avformat_seek_file(mContext, mVideoStream, 0, 0, stream->duration, 0);
continue;
}

现在视频正确地永远循环 :)

关于c++ - 重复 ffmpeg 流(libavcodec/libavformat),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45526098/

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