bilibili / ijkplayer

Android/iOS video player based on FFmpeg n3.4, with MediaCodec, VideoToolbox support.
GNU General Public License v2.0
32.46k stars 8.12k forks source link

拖动后 画面停止不动 有声音 #1731

Open iqluoji opened 8 years ago

iqluoji commented 8 years ago

unknown SEI type 37 decode callback -12909 kVTVideoDecoderBadDataErr decodeFrame -12911 kVTVideoDecoderMalfunctionErr HLS request for url 'http://183.61.6.236/677C43DD6524381156E5785A37/03000118095794F63C12162D9B7D2F224F04EF-5263-7817-D117-ACC6F79A2630.flv.ts?ts_start=80&ts_end=90&ts_seg_no=187&ts_keyframe=0', offset 0, playlist 0 No trailing CRLF found in HTTP header. request: GET /677C43DD6524381156E5785A37/03000118095794F63C12162D9B7D2F224F04EF-5263-7817-D117-ACC6F79A2630.flv.ts?ts_start=80&ts_end=90&ts_seg_no=187&ts_keyframe=0 HTTP/1.1

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)

Accept: /

Connection: close

Host: 183.61.6.236

Icy-MetaData: 1

iqluoji commented 8 years ago

iOS平台 模拟器上拖动没问题 真机拖动画面停止 声音还有

iqluoji commented 8 years ago

FFP_MSG_SAR_CHANGED: 1, 1 2016-07-27 14:33:13.448 videoSearch[75125:3896524] FFP_MSG_PREPARED: ijkmp_get_meta_l ijkmp_get_meta_l()=void [ffplay_abuffer @ 0x7fdd01324210] Setting 'sample_rate' to value '44100' 2016-07-27 14:33:13.449 videoSearch[75125:3896524] fps in meta 23.976024 [ffplay_abuffer @ 0x7fdd01324210] Setting 'sample_fmt' to value 'fltp' [ffplay_abuffer @ 0x7fdd01324210] Setting 'channels' to value '2' [ffplay_abuffer @ 0x7fdd01324210] Setting 'time_base' to value '1/44100' [ffplay_abuffer @ 0x7fdd01324210] Setting 'channel_layout' to value '0x3' 2016-07-27 14:33:13.449 videoSearch[75125:3896524] mediaIsPreparedToPlayDidChange [ffplay_abuffer @ 0x7fdd01324210] tb:1/44100 samplefmt:fltp samplerate:44100 chlayout:0x3 [ffplay_abuffersink @ 0x7fdd01444620] auto-inserting filter 'auto-inserted resampler 0' between the filter 'ffplay_abuffer' and the filter 'ffplay_abuffersink' [AVFilterGraph @ 0x7fdd01471b20] query_formats: 2 queried, 0 merged, 3 already done, 0 delayed [auto-inserted resampler 0 @ 0x7fdd01324380] [SWR @ 0x7fdcfd2d8800] Using fltp internally between filters [auto-inserted resampler 0 @ 0x7fdd01324380] ch:2 chl:stereo fmt:fltp r:44100Hz -> ch:2 chl:stereo fmt:s16 r:44100Hz 2016-07-27 14:33:13.449 videoSearch[75125:3896524] loadStateDidChange: IJKMPMovieLoadStatePlaythroughOK: 3 2016-07-27 14:33:13.449 videoSearch[75125:3896524] IJKMPMoviePlayBackStateDidChange 1: playing SDL_VoutVideoToolBox_CreateOverlay(w=960, h=540, fmt=_VTB(0x4254565f, dp=0x7fdcfe687b80) Video: first frame decoded 2016-07-27 14:33:13.479 videoSearch[75125:3896524] FFP_MSG_VIDEO_SIZE_CHANGED: 960, 540 SDL_VoutVideoToolBox_CreateOverlay(w=960, h=540, fmt=_VTB(0x4254565f, dp=0x7fdcfe687b80) 2016-07-27 14:33:13.486 videoSearch[75125:3896524] FFP_MSG_VIDEO_SIZE_CHANGED: 960, 540 2016-07-27 14:33:13.487 videoSearch[75125:3897608] OK use NV12 GL renderer 2016-07-27 14:33:13.490 videoSearch[75125:3897608] OK setup GL programm 2016-07-27 14:33:13.492 videoSearch[75125:3897608] OK setup GL framebuffer 750:480 2016-07-27 14:33:13.496 videoSearch[75125:3896524] FFP_MSG_VIDEO_SIZE_CHANGED: 960, 540 avcodec/Audio: first frame decoded 2016-07-27 14:33:13.502 videoSearch[75125:3896524] FFP_MSG_AUDIO_RENDERING_START: [mpegts @ 0x7fdcfca8f800] first_dts 900000 not matching first dts 987771 (pts 987771, duration 2089) in the queue SDL_VoutVideoToolBox_CreateOverlay(w=960, h=540, fmt=_VTB(0x4254565f, dp=0x7fdcfe687b80) 2016-07-27 14:33:13.516 videoSearch[75125:3896524] FFP_MSG_VIDEO_RENDERING_START: [hls,applehttp @ 0x7fdcfd123a00] HLS request for url 'http://175.6.234.18/6774E7F88023C7307749D38CC/03000118005794F63C12162D9B7D2F224F04EF-5263-7817-D117-ACC6F79A2630.flv.ts?ts_start=5&ts_end=15&ts_seg_no=1&ts_keyframe=0', offset 0, playlist 0 [http @ 0x7fdcfe93b840] No trailing CRLF found in HTTP header. [http @ 0x7fdcfe93b840] request: GET /6774E7F88023C7307749D38CC/03000118005794F63C12162D9B7D2F224F04EF-5263-7817-D117-ACC6F79A2630.flv.ts?ts_start=5&ts_end=15&ts_seg_no=1&tskeyframe=0 HTTP/1.1 User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) Accept: /_ Connection: close Host: 175.6.234.18 Icy-MetaData: 1

[NULL @ 0x7fdcfca83800] unknown SEI type 37 [hls,applehttp @ 0x7fdcfd123a00] HLS request for url 'http://175.6.234.18/6774E7F88023C7307749D38CC/03000118005794F63C12162D9B7D2F224F04EF-5263-7817-D117-ACC6F79A2630.flv.ts?ts_start=15&ts_end=25&ts_seg_no=2&ts_keyframe=0', offset 0, playlist 0 [http @ 0x7fdcfe93b840] No trailing CRLF found in HTTP header. [http @ 0x7fdcfe93b840] request: GET /6774E7F88023C7307749D38CC/03000118005794F63C12162D9B7D2F224F04EF-5263-7817-D117-ACC6F79A2630.flv.ts?ts_start=15&ts_end=25&ts_seg_no=2&tskeyframe=0 HTTP/1.1 User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) Accept: /_ Connection: close Host: 175.6.234.18 Icy-MetaData: 1

2016-07-27 14:33:16.104 videoSearch[75125:3896524] IJKMPMoviePlayBackStateDidChange 4: seeking ijkmp_seek_to(1388776) ijkmp_seek_to(1388776)=0 ijkmp_get_msg: FFP_REQ_SEEK [FFPlayer @ 0x7fdd01572f60] stream_seek 1398776000(1388776) + 10000000, [FFPlayer @ 0x7fdd01572f60] ijkmp_get_msg: FFP_REQ_SEEK: seek to 1388776 [FFPlayer @ 0x7fdd01572f60] ffp_toggle_buffering_l: start aout_pause_audio(1) 2016-07-27 14:33:16.161 videoSearch[75125:3896524] FFP_MSG_BUFFERING_START: 2016-07-27 14:33:16.161 videoSearch[75125:3896524] loadStateDidChange: IJKMPMovieLoadStateStalled: 4 ijkmp_get_msg: FFP_MSG_SEEK_COMPLETE [hls,applehttp @ 0x7fdcfd123a00] HLS request for url 'http://121.12.95.11/6578FE9C94E3F748136FB3592/03000118075794F63C12162D9B7D2F224F04EF-5263-7817-D117-ACC6F79A2630.flv.ts?ts_start=40&ts_end=50&ts_seg_no=143&ts_keyframe=0', offset 0, playlist 0 2016-07-27 14:33:16.162 videoSearch[75125:3896524] FFP_MSG_SEEK_COMPLETE: [http @ 0x7fdd0149b550] No trailing CRLF found in HTTP header. [http @ 0x7fdd0149b550] request: GET /6578FE9C94E3F748136FB3592/03000118075794F63C12162D9B7D2F224F04EF-5263-7817-D117-ACC6F79A2630.flv.ts?ts_start=40&ts_end=50&ts_seg_no=143&tskeyframe=0 HTTP/1.1 User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) Accept: /_ Connection: close Host: 121.12.95.11 Icy-MetaData: 1

这是模拟器的log

LSLdalong commented 8 years ago

hls 目前硬解不支持拖动,ijk没做处理,可能默认认为hls是实时流,不需要支持拖动,我自己跟踪代码,找了个方法解决,目前没有发生其他问题

int videotoolbox_decode_video(VideoToolBoxContext* context, AVCodecContext avctx, const AVPacket *avpkt, int got_picture_ptr) 在这个函数里,加上 context->recovery_drop_packet = false;

加上这行代码后,hls,ts流就都可以seek了

iqluoji commented 8 years ago

@LSLdalong 请问在哪个类里面的呢...

iqluoji commented 8 years ago

int videotoolbox_decode_video(VideoToolBoxContext* context, AVCodecContext avctx, const AVPacket *avpkt, int got_picture_ptr) { if (!avpkt || !avpkt->data) { return 0; }

if (ff_avpacket_is_idr(avpkt) == true) {
    context->idr_based_identified = true;
}
if (ff_avpacket_i_or_idr(avpkt, context->idr_based_identified) == true) {
    ResetPktBuffer(context);
    context->recovery_drop_packet = false;
}
if (context->recovery_drop_packet == true) {
    return -1;
}

DuplicatePkt(context, avpkt);

if (context->refresh_session) {
    int ret = 0;
    if (context->m_vt_session) {
        VTDecompressionSessionWaitForAsynchronousFrames(context->m_vt_session);
        VTDecompressionSessionInvalidate(context->m_vt_session);
        CFRelease(context->m_vt_session);
    }

    CreateVTBSession(context, context->ffp->is->viddec.avctx->width, context->ffp->is->viddec.avctx->height);

    if ((context->m_buffer_deep > 0) &&
        ff_avpacket_i_or_idr(&context->m_buffer_packet[0], context->idr_based_identified) == true ) {
        for (int i = 0; i < context->m_buffer_deep; i++) {
            AVPacket* pkt = &context->m_buffer_packet[i];
            ret = videotoolbox_decode_video_internal(context, avctx, pkt, got_picture_ptr);
        }
    } else {
        context->recovery_drop_packet = true;
        ret = -1;
        ALOGE("recovery error!!!!\n");
    }
    context->refresh_session = false;
    return ret;
}
return videotoolbox_decode_video_internal(context, avctx, avpkt, got_picture_ptr);

}

@LSLdalong 这个方法里有做判断呀...

LSLdalong commented 8 years ago

是的

fenglinxiu commented 7 years ago

@iqluoji 哪个类?

befovy commented 5 years ago

https://github.com/befovy/ijkplayer/commit/313ea5e0c34e18f9ab08e94fc7a8c4ecc7a79e29

这样修改也可以

static bool ff_avpacket_i_or_idr(const AVPacket* pkt,bool isIdr) {
        if (isIdr == true) {
---         return ff_avpacket_is_idr(pkt);
+++         return ff_avpacket_is_idr(pkt) || ff_avpacket_is_key(pkt);
        } else {
            return ff_avpacket_is_key(pkt);
        }
}