我在Android上使用ffmpeg。并使用RTSP网络摄像头。
我引用here.
我收到了很好的视频。
但是当我结束视频时收到错误。
Fatal signal 11 (SIGSEGV) at 0x8a7c0d04 (code=1), thread 2537 (Thread-13225)
所以我发现了使用日志的错误。但我不知道错误发生的原因。
以下代码是错误的位置。
void closeMovie(){
av_read_pause(gFormatCtx);
if (gVideoBuffer != NULL) {
free(gVideoBuffer);
gVideoBuffer = NULL;
}
if (gFrame != NULL)
av_free(gFrame);
if (gFrameRGB != NULL)
av_free(gFrameRGB);
if (gVideoCodecCtx != NULL) {
avcodec_close(gVideoCodecCtx);
av_free(gVideoCodecCtx);
gVideoCodecCtx = NULL;
}
if (gFormatCtx != NULL) {
**av_close_input_file(gFormatCtx);** //here
gFormatCtx = NULL;
}
}
和
void av_close_input_file(AVFormatContext *s)
{
AVIOContext *pb = (s->iformat->flags & AVFMT_NOFILE) || (s->flags & AVFMT_FLAG_CUSTOM_IO) ?
NULL : s->pb;
**av_close_input_stream(s);**// here
if (pb)
avio_close(pb);
}
和
void av_close_input_stream(AVFormatContext *s)
{
flush_packet_queue(s);
if (s->iformat->read_close)
**s->iformat->read_close(s);** //here
avformat_free_context(s);
}
如果//s->iformat->read_close(s);
没有崩溃
但我无法再次打开视频了。再次打开视频我必须退出应用程序。
抱歉,我不会说英语。 谢谢你的阅读。PS1。 logcat的
12-10 10:08:02.991: D/TAG(21770): TAG - closeMovie1 - in
12-10 10:08:02.991: D/TAG(21770): TAG - avcodec_close - in
12-10 10:08:02.991: D/TAG(21770): av_opt_free - on
12-10 10:08:02.991: D/TAG(21770): av_opt_free - out
12-10 10:08:02.991: D/TAG(21770): TAG - avcodec_close - out
12-10 10:08:02.991: D/TAG(21770): TAG - av_close_input_file - in
12-10 10:08:02.991: D/TAG(21770): TAG - avformat_close_input - in
12-10 10:08:02.991: D/TAG(21770): TAG - flush_packet_queue -
12-10 10:08:02.991: D/TAG(21770): flush_packet_queue - on
12-10 10:08:02.991: D/TAG(21770): flush_packet_queue - out
12-10 10:08:02.991: D/TAG(21770): TAG - s->iformat->read_close : 0
12-10 10:08:02.991: D/TAG(21770): TAG - avformat_free_context
12-10 10:08:02.991: D/TAG(21770): TAG - avformat_free_context - in
12-10 10:08:02.991: D/TAG(21770): av_opt_free - on
12-10 10:08:02.991: D/TAG(21770): av_opt_free - out
12-10 10:08:02.991: D/TAG(21770): av_opt_free - on
12-10 10:08:02.991: D/TAG(21770): av_opt_free - out
12-10 10:08:02.991: D/TAG(21770): TAG - avformat_for_length s->nb_streams - 3
12-10 10:08:02.991: D/TAG(21770): TAG - avformat_for_nb_streams - in
12-10 10:08:02.991: D/TAG(21770): TAG - avformat_for_ nb_streams - out
12-10 10:08:02.991: D/TAG(21770): TAG - avformat_for_nb_streams - in
12-10 10:08:02.991: D/TAG(21770): TAG - avformat_for_ nb_streams - out
12-10 10:08:02.991: D/TAG(21770): TAG - avformat_for_nb_streams - in
12-10 10:08:02.991: D/TAG(21770): TAG - avformat_for_ nb_streams - out
12-10 10:08:02.991: D/TAG(21770): TAG - avformat_for_length s->nb_programs-1 - -1
12-10 10:08:02.991: D/TAG(21770): TAG - freep 1
12-10 10:08:02.991: D/TAG(21770): TAG - freep 2
12-10 10:08:02.991: D/TAG(21770): TAG - while
12-10 10:08:02.991: D/TAG(21770): TAG - freep 3
12-10 10:08:02.991: D/TAG(21770): TAG - dict_free 1
12-10 10:08:02.991: D/TAG(21770): TAG - freep 4
12-10 10:08:02.991: D/TAG(21770): TAG - freep 3
12-10 10:08:02.991: D/TAG(21770): TAG - avformat_free_context - out
12-10 10:08:02.991: D/TAG(21770): TAG - avio_close - in
12-10 10:08:02.991: D/TAG(21770): TAG - avio_close - 1
12-10 10:08:02.991: D/TAG(21770): TAG - avio_close - 2
12-10 10:08:02.991: D/TAG(21770): TAG - avio_close - out
12-10 10:08:02.991: D/TAG(21770): TAG - avio_close(pb) : 0
12-10 10:08:02.991: D/TAG(21770): TAG - avio_close - in
12-10 10:08:02.991: D/TAG(21770): TAG - avio_close - 1
12-10 10:08:02.991: D/TAG(21770): TAG - avio_close - 2
12-10 10:08:02.991: D/TAG(21770): TAG - avio_close - out
12-10 10:08:02.991: D/TAG(21770): TAG - avformat_close_input - out
12-10 10:08:02.991: D/TAG(21770): TAG - av_close_input_file - out
12-10 10:08:02.991: D/TAG(21770): TAG - closeMovie1 - out
12-10 10:08:03.151: D/AbsListView(21770): onVisibilityChanged() is called, visibility : 0
12-10 10:08:03.151: D/AbsListView(21770): unregisterIRListener() is called
12-10 10:08:03.201: D/AbsListView(21770): unregisterIRListener() is called
12-10 10:08:03.221: D/AbsListView(21770): unregisterIRListener() is called
12-10 10:08:03.241: A/libc(21770): Fatal signal 11 (SIGSEGV) at 0x8bb85698 (code=1), thread 21938 (Thread-23561)
ps2。日志的顺序。
(BasicPlayer.c) closeMovie in->
(utils.c) avcodec_close ->
(utils.c) av_close_input_file ->
(utils.c) avformat_close_input ->
(utils.c) flush_packet_queue ->
(utils.c) **s->iformat->read_close(s)** ->
(utils.c) avformat_free_context ->
(utils.c) avio_close(pb) ->
(BasicPlayer.c) closeMovie out
答案 0 :(得分:0)
感谢阅读。
我必须解决。
添加代码utils.c
typedef struct {
int audio_size; /**< audio packet size (bytes) */
int video_size; /**< video packet size (bytes) */
int palette_size; /**< palette size (bytes) */
int video_type; /**< per-frame video compression type */
} JVFrame;
typedef struct {
JVFrame *frames;
enum {
JV_AUDIO = 0,
JV_VIDEO,
JV_PADDING
} state;
int64_t pts;
} JVDemuxContext;
和
static int read_close(AVFormatContext *s)
{
JVDemuxContext *jv = s->priv_data;
av_free(jv->frames);
return 0;
}
并修改代码。
void av_close_input_stream(AVFormatContext *s)
{
flush_packet_queue(s);
if (s->iformat->read_close)
//**s->iformat->read_close(s);** //here fixed -->
read_close(s);
avformat_free_context(s);
}
我不知道。为什么会产生错误。
但是通过修改代码解决了这个问题。
如果您有任何问题,我希望这会有所帮助。
抱歉,我不会说英语。谢谢你的阅读。