我在我的C ++应用程序中使用ffmpeg。
当尝试播放某些文件时,ffmpeg内部的断言失败,导致它调用abort()
来终止我的应用程序。我不想要这种行为,而是希望有机会恢复,最好是通过例外。
任何人都有任何关于如何解决问题的想法ffmpeg / assert可能会终止我的应用程序?
编辑:
我现在能想到的唯一方法是更改ffmpeg断言宏,以便它导致访问冲突,我可以通过SEH异常捕获。丑陋且可能不好的解决方案?
答案 0 :(得分:1)
如果需要将“异常”编译为C,则可以使用setjmp / longjump对。将setjmp放入错误处理代码中,并将longjmp替换为FFMPG代码中的中止。
如果你真的想要捕获一个真正的异常,除以零可能比随机访问违规更安全。
答案 1 :(得分:0)
此代码来自ffmpeg doxygen documentation
/*
* copyright (c) 2010 Michael Niedermayer <michaelni@gmx.at>
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef AVUTIL_AVASSERT_H
#define AVUTIL_AVASSERT_H
#include <stdlib.h>
#include "avutil.h"
#include "log.h"
#define av_assert0(cond) do { \
if (!(cond)) { \
av_log(NULL, AV_LOG_FATAL, "Assertion %s failed at %s:%d\n", \
AV_STRINGIFY(cond), __FILE__, __LINE__); \
abort(); \
} \
} while (0)
#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 0
#define av_assert1(cond) av_assert0(cond)
#else
#define av_assert1(cond) ((void)0)
#endif
#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 1
#define av_assert2(cond) av_assert0(cond)
#else
#define av_assert2(cond) ((void)0)
#endif
#endif /* AVUTIL_AVASSERT_H */
您可以简单地重新定义av_assert
宏而不是abort()
答案 2 :(得分:0)
如果你不能/不想重新编写ffmpeg代码,那么我会说另一个进程来执行ffmpeg操作然后退出。您可以等待该进程在主进程中以某种方式退出并确定其进展情况,而不会终止主进程的风险。
它可能不是世界上最好的解决方案,但它可以让您获得所需的隔离,并希望知道发生的事情,而无需对ffpmpeg代码进行过多的暴力。