compiler-errors - ffmpeg H264 avi 文件获取帧时间戳?? UINT64_C 错误

标签 compiler-errors ffmpeg timestamp uint64

使用 h264 编解码器的 avi 文件。我需要打开它并提取每一帧的时间戳。

我试图在opencv中这样做,但它返回错误的结果。

为了获取时间戳,我修改了 fffmpeg/doc/examples 文件夹中存在的示例 filtering_video.c 的代码。

我有以下代码,但编译它给了我一个关于 UNIT64_C 的奇怪结果。
环顾四周,我发现这是一个 ffmpeg 问题。

所以2个问题:
1. 这段代码看起来是否能够返回和打印帧时间戳
2. UINT64_C问题有什么解决办法??

使用 ubuntu 11.04 和最新的 ffmpeg。

代码

#include <unistd.h>

#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>

static AVFormatContext *fmt_ctx;
static AVCodecContext *dec_ctx;
static int video_stream_index = -1;

static int open_input_file(const char *filename)
{
int ret;
AVCodec *dec;

if ((ret = avformat_open_input(&fmt_ctx, filename, NULL, NULL)) < 0)
{
    printf("Cannot open input file\n");
    return ret;
}

if ((ret = avformat_find_stream_info(fmt_ctx, NULL)) < 0)
{
    printf("Cannot find stream information\n");
    return ret;
}

/* select the video stream */
ret = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_VIDEO, -1, -1, &dec, 0);
if (ret < 0)
{
    printf("Cannot find a video stream in the input file\n");
    return ret;
}
video_stream_index = ret;
dec_ctx = fmt_ctx->streams[video_stream_index]->codec;

/* init the video decoder */
if ((ret = avcodec_open2(dec_ctx, dec, NULL)) < 0)
{
    printf("Cannot open video decoder\n");
    return ret;
}

return 0;
}

int main(int argc, char **argv)
{
int ret;
AVPacket packet;
AVFrame frame;
int got_frame;

if (argc != 2)
{
    fprintf(stderr, "Usage: %s file\n", argv[0]);
    exit(1);
}

avcodec_register_all();
av_register_all();

if ((ret = open_input_file(argv[1])) < 0)
    goto end;

/* read all packets */
while (1)
{
    if ((ret = av_read_frame(fmt_ctx, &packet)) < 0)
        break;

    if (packet.stream_index == video_stream_index)
    {
        avcodec_get_frame_defaults(&frame);
        got_frame = 0;
        ret = avcodec_decode_video2(dec_ctx, &frame, &got_frame, &packet);
        if (ret < 0)
        {
           printf("Error decoding video\n");
            break;
        }

        if (got_frame)
        {
            frame.pts = av_frame_get_best_effort_timestamp(&frame);
            printf("frame timestamp %ld\n", frame.pts);
        }

    }
}
    av_free_packet(&packet);
end:
if (dec_ctx)
    avcodec_close(dec_ctx);
avformat_close_input(&fmt_ctx);

exit(0);
}

编译器错误
/usr/local/include/libavutil/common.h||In function ‘int32_t    av_clipl_int32_c(int64_t)’:|
/usr/local/include/libavutil/common.h|173|error: ‘UINT64_C’ was not declared in this scope|

最佳答案

UINT64_C<stdint.h> 中声明所以在任何其他标题之前包含它,它不应该再提示了。

关于compiler-errors - ffmpeg H264 avi 文件获取帧时间戳?? UINT64_C 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11709883/

相关文章:

python-3.x - Python 3.10 中 ffprobe 的困难

ffmpeg H265 到 H264 颜色关闭?

sql - Ruby Rails - 使用 created_at 列制作表格

c++ - 类模板实例化错误

c++ - 做std::pair a custom class的第二个参数

c++ - ffmpeg ndk 多重定义 libavcodec.a(golomb.o)

javascript - React Firebase 时间戳用法

C++ 预期主表达式错误

c - 错误 "expression must have pointer type"何时发生?

php - MySQL 多向 ORDER BY