我有一个必须在Android和Windows上运行的统一项目。为了能够解码原始H264帧,我使用的是ffmpeg包装器,它在Windows上工作得很好但在Android上我在av_log_default_callback上遇到了分段错误,由avcodec_decode_video2调用。
这是回溯:
05-26 10:47:45.224 24270 24286 F libc : Fatal signal 11 (SIGSEGV), code
1, fault addr 0x0 in tid 24286 (UnityMain)
05-26 10:47:45.224 463 463 W : debuggerd: handling request:
pid=24270 uid=10152 gid=10152 tid=24286
05-26 10:47:45.332 24535 24535 F DEBUG : *** *** *** *** *** *** *** ***
*** *** *** *** *** *** *** ***
05-26 10:47:45.332 24535 24535 F DEBUG : Revision: '0'
05-26 10:47:45.333 24535 24535 F DEBUG : ABI: 'arm'
05-26 10:47:45.333 24535 24535 F DEBUG : pid: 24270, tid: 24286, name:
UnityMain >>> com.my.app <<<
05-26 10:47:45.333 24535 24535 F DEBUG : signal 11 (SIGSEGV), code 1
(SEGV_MAPERR), fault addr 0x0
05-26 10:47:45.333 24535 24535 F DEBUG : r0 cf444220 r1 00000000 r2
00010000 r3 00000000
05-26 10:47:45.333 24535 24535 F DEBUG : r4 e9254b1c r5 00000010 r6
e9254b14 r7 e9255c90
05-26 10:47:45.333 24535 24535 F DEBUG : r8 c860f670 r9 cf444220 sl
e925531c fp e9254f1c
05-26 10:47:45.333 24535 24535 F DEBUG : ip 000003f0 sp e9254ac0 lr
cffa5518 pc 00000000 cpsr a8010010
05-26 10:47:45.339 24535 24535 F DEBUG :
05-26 10:47:45.339 24535 24535 F DEBUG : backtrace:
05-26 10:47:45.339 24535 24535 F DEBUG : #00 pc 00000000 <unknown>
05-26 10:47:45.339 24535 24535 F DEBUG : #01 pc 00018514
/data/app/com.my.app/lib/arm/libavutil-55.so
05-26 10:47:45.339 24535 24535 F DEBUG : #02 pc 000189f4
/data/app/com.my.app/lib/arm/libavutil-55.so
(av_log_default_callback+168)
05-26 10:47:45.339 24535 24535 F DEBUG : #03 pc 00018d38
/data/app/com.my.app/lib/arm/libavutil-55.so (av_log+80)
05-26 10:47:45.339 24535 24535 F DEBUG : #04 pc 001bf538
/data/app/com.my.app/lib/arm/libavcodec-57.so
05-26 10:47:45.339 24535 24535 F DEBUG : #05 pc 001c4eac
/data/app/com.my.app/lib/arm/libavcodec-57.so
05-26 10:47:45.339 24535 24535 F DEBUG : #06 pc 0038cce0
/data/app/com.my.app/lib/arm/libavcodec-57.so
(avcodec_decode_video2+380)
05-26 10:47:45.339 24535 24535 F DEBUG : #07 pc 00003490
<anonymous:cb624000>
我必须在导入的ffmpeg函数的原型中用refs替换指针,以修复Marshal错误,说结构不是blittable而我应该使用refs代替:
avcodec_decode_video2(AVCodecContext *ctx, AVFrame *frame, int *gotPicture,......);
成了:
avcodec_decode_video2(ref AVCodecContext ctx, ref AVFrame frame, ref int gotPicture,.......);
在Windows上一切正常,使用引用代替指针没有发生率,现在在Android上正确导入了函数。
如果有人有可能对我的研究有帮助的信息或知道有这个错误的人,请分享谢谢!