请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

使用文件句柄加载视频,seek后无法获取到帧信息

同样的获取帧信息代码,采用绝对路径加载没有问题,可正常seek到任意帧下,但是修改成文件句柄之后,seek返回数据是成功的,且刷新缓存了,但是调用av_read_frame(mFormatContext, packet)一直返回-1094995529错误码,且看ffmpeg打印错误日志如下:
E stream 0, offset 0x205080: partial file
E stream 0, offset 0x205080: partial file
E stream 0, offset 0x205080: partial file
辛苦老师回答下

正在回答 回答被采纳积分+3

1回答

李超 7天前

把你的代码贴一下,我不清楚你说的两种情况的区别是啥

0 回复 有任何疑惑可以回复我~
  • 提问者 慕运维2361320 #1
    if (fileFD >= 0) {
            // 设置文件描述符的位置到文件开始
            lseek(fileFD, 0, SEEK_SET);
            char fd_string[20];
            sprintf(fd_string, "pipe:%d", fileFD);
            if (avformat_open_input(&mFormatContext, fd_string, nullptr, nullptr) < 0) {
                INFO_LOG_FAT(className.c_str(), "avformat open input is fail,filePath:%s",
                             filePath.c_str());
                // 处理错误
                return;
            }
        } else {
            if (avformat_open_input(&mFormatContext, filePath.c_str(), nullptr, nullptr) < 0) {
                INFO_LOG_FAT(className.c_str(), "avformat open input is fail,filePath:%s",
                             filePath.c_str());
                // 处理错误
                return;
            }
        }
    回复 有任何疑惑可以回复我~ 7天前
  • 提问者 慕运维2361320 #2
    回复 慕运维2361320:fileFD是句柄,目前在Android11版本以上采用句柄的方法加载视频,在低版本上使用绝对路径,低版本没啥问题,高版本seek后无法正常加载视频帧
    回复 有任何疑惑可以回复我~ 7天前
  • 提问者 慕运维2361320 #3
    回复 慕运维2361320:seek逻辑
    if (pts < currentPts || pts > currentPts + 1000000) {//太大或者小都要进行seek
            NvTimeUtils::getInstance().recordStart("av_seek_frame");
            int64_t timestamp = av_rescale_q(pts, AV_TIME_BASE_Q,
                                             mFormatContext->streams[mVideoStreamIndex]->time_base);
            if (av_seek_frame(mFormatContext, mVideoStreamIndex, timestamp, AVSEEK_FLAG_BACKWARD) < 0) {
                ERROR_LOG(className.c_str(), "Error while seeking");
                return false;
            }
            avcodec_flush_buffers(mCodecContext);
            INFO_LOG_FAT(className.c_str(), "av_seek_frame pts:%lld,currentPts:%lld", pts,
                         currentPts - 1);
            avFrame->pts = -1;
            NvTimeUtils::getInstance().recordEnd("av_seek_frame");
        }
    回复 有任何疑惑可以回复我~ 7天前
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信