【问题标题】:c++ ffmpeg access violationc++ ffmpeg 访问冲突
【发布时间】:2012-03-30 01:41:53
【问题描述】:

这段代码有什么问题?它在 av_find_stream_info 中断(访问冲突)。调试时,ctx->filename 是“3”而不是“1.MP3”:前 4 个字符被省略,也检查其他文件,结果相同。

av_register_all();
AVFormatContext *ctx=0;
ctx=avformat_alloc_context();
avformat_open_input(&ctx,"1.MP3",0,0);
av_find_stream_info(ctx);
int istream;
for(int i=0;i<ctx->nb_streams;i++){
if(ctx->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO){
        istream=i;
        break;
}

【问题讨论】:

  • 您将永远无法调试不包含错误检查的代码。 avformat_open_input 的返回值是多少?
  • avformat_open_input 返回 -2。

标签: c++ ffmpeg


【解决方案1】:

avformat_open_input 失败。

使用av_strerror 找出avformat_open_input 失败的原因。 avformat_open_input 返回的负值表示错误情况。

【讨论】:

    【解决方案2】:

    您的代码包含一个错误——即使avformat_open_input 失败,它仍在调用av_find_stream_info

    -2 可能是-ENOENT——没有这样的文件或目录。也许你在错误的目录中。也许文件名是1.mp3,而不是1.MP3,并且您的文件系统区分大小写。

    但是你不能调试不检查错误的代码。

    【讨论】:

    • 放入完整路径“F:\\1.mp3”后,avformat_open_input返回0(成功),但同时ctx->filename为“.mp3”,前4个字符被剪掉.
    • 你要我调试我看不到的代码。没有办法做到这一点。
    • 问题是 avformatcontext 包含所有错误信息(它显示数百万个流)。有没有其他方法可以读取单个流而不是使用aformat,只使用avcodec?我知道该文件有一个音频流。
    • 我真的不明白你想要做什么。您是否尝试解码音频流?目前尚不清楚您遇到了什么问题。您现在已成功打开文件。您读取文件名的问题可能只是您读错了。
    • 再次,您要我调试我看不到的代码。粘贴显示错误的代码,包括您如何从结构中提取不正确的值。只是继续修复错误。这就是编程的工作原理。
    猜你喜欢
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多