auto url = "D:/music/四季ノ唄.mp3";

AVFormatContext* fmt;
auto ret = avformat_open_input(&fmt, url, nullptr, nullptr);
if (ret < 0)
{
    av_log(nullptr, AV_LOG_ERROR, "Cannot open %s format : %s", url, av_err2str(ret));
    exit(EXIT_FAILUE);
}

ret = avformat_find_stream_info(fmt, nullptr);
if (ret < 0)
{
    av_log(nullptr, AV_LOG_ERROR, "Cannot find stream info : %s", av_err2str(ret));
    avformat_close_input(&fmt);
    exit(EXIT_FAILURE);
}

av_dump_format(fmt, 0, url, 0);

avformat_close_input(&fmt);

AVFormatContext用于保存文件的格式信息。

avformat_open_input用于读取文件头信息,第一个参数就是存储返回信息的地方,第二个是要打开的url,第三个和第四个默认nullptr就好。

avformat_find_stream_info去读取媒体文件包去获取流信息。 注意: b站的课程中没有使用这个函数直接用av_dump_format去获取信息。但在7.1版本中需要在调用av_dump_format前调用av_format_find_stream_info,否则av_dump_format会得到无用信息,并且后续的解包解码也是需要这个提前调用这个函数。

关于不使用avformat_find_stream_info的问题,可以参考这里FFmpeg av_dump_format showing incorrect output, but ffprobe displays correct metadata

av_dump_format用于直接输出格式信息。

avformat_close_input则是释放fmt资源防止资源泄露。

Tags:

Categories:

Updated: