bilibili / ijkplayer

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

实现 IAndroidIO,播放闪退 #4830

Open WuCh1k1n opened 5 years ago

WuCh1k1n commented 5 years ago

定义回调:类 FileAndroidIO.java

public class FileAndroidIO implements IAndroidIO {

private static String TAG = "ANDROID_IO_TRACE";
private RandomAccessFile file;

public FileAndroidIO() {
}

@Override
public int open(String url) throws IOException {
    Log.i(TAG, "open , url = " + url);

    this.file = new RandomAccessFile(new File(url), "r");
    return 1;
}

@Override
public int read(byte[] buffer, int size) throws IOException {
    int read = file.read(buffer, 0, size);

    Log.i(TAG, "read , size=" + size + " , bufferLength = " + buffer.length + " , read=" + read);
    return read;
}

@Override
public long seek(long offset, int whence) throws IOException {
    Log.i(TAG, "seek , offset=" + offset + ", whence=" + whence);

    file.seek(offset);
    return file.getFilePointer();
}

@Override
public int close() throws IOException {
    Log.i(TAG, "close");

    file.close();
    file = null;
    return 1;
}

}

设置回调: 类 IjkVideoView.java private void openVideo() {

    if (mUri == null || mSurfaceHolder == null) {
        // not ready for playback just yet, will try again later
        return;
    }
    // we shouldn't clear the target state, because somebody might have
    // called start() previously
    release(false);

    AudioManager am = (AudioManager) mAppContext.getSystemService(Context.AUDIO_SERVICE);
    am.requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);

    try {
        mMediaPlayer = createPlayer(mSettings.getPlayer());

        // TODO: create SubtitleController in MediaPlayer, but we need
        // a context for the subtitle renderers
        final Context context = getContext();
        // REMOVED: SubtitleController

        // REMOVED: mAudioSession
        mMediaPlayer.setOnPreparedListener(mPreparedListener);
        mMediaPlayer.setOnVideoSizeChangedListener(mSizeChangedListener);
        mMediaPlayer.setOnCompletionListener(mCompletionListener);
        mMediaPlayer.setOnErrorListener(mErrorListener);
        mMediaPlayer.setOnInfoListener(mInfoListener);
        mMediaPlayer.setOnBufferingUpdateListener(mBufferingUpdateListener);
        mMediaPlayer.setOnSeekCompleteListener(mSeekCompleteListener);
        mMediaPlayer.setOnTimedTextListener(mOnTimedTextListener);
        mCurrentBufferPercentage = 0;
       //-------------------------修改-------------------------
        ((IjkMediaPlayer) mMediaPlayer).setAndroidIOCallback(new FileAndroidIO());
        // mUri = Uri.parse("ijkio:httphook:" + mUri.toString());
        mUri = Uri.parse("ijkio:androidio:" + mUri.toString());
       //-------------------------修改-------------------------
        String scheme = mUri.getScheme();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
                mSettings.getUsingMediaDataSource() &&
                (TextUtils.isEmpty(scheme) || scheme.equalsIgnoreCase("file"))) {
            IMediaDataSource dataSource = new FileMediaDataSource(new File(mUri.toString()));
            mMediaPlayer.setDataSource(dataSource);
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            mMediaPlayer.setDataSource(mAppContext, mUri, mHeaders);
        } else {
            mMediaPlayer.setDataSource(mUri.toString());
        }
        bindSurfaceHolder(mMediaPlayer, mSurfaceHolder);
        mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mMediaPlayer.setScreenOnWhilePlaying(true);
        mPrepareStartTime = System.currentTimeMillis();
        mMediaPlayer.prepareAsync();
        if (mHudViewHolder != null)
            mHudViewHolder.setMediaPlayer(mMediaPlayer);

        // REMOVED: mPendingSubtitleTracks

        // we don't set the target state here either, but preserve the
        // target state that was there before.
        mCurrentState = STATE_PREPARING;
        attachMediaController();
    } catch (IOException ex) {
        Log.w(TAG, "Unable to open content: " + mUri, ex);
        mCurrentState = STATE_ERROR;
        mTargetState = STATE_ERROR;
        mErrorListener.onError(mMediaPlayer, MediaPlayer.MEDIA_ERROR_UNKNOWN, 0);
    } catch (IllegalArgumentException ex) {
        Log.w(TAG, "Unable to open content: " + mUri, ex);
        mCurrentState = STATE_ERROR;
        mTargetState = STATE_ERROR;
        mErrorListener.onError(mMediaPlayer, MediaPlayer.MEDIA_ERROR_UNKNOWN, 0);
    } finally {
        // REMOVED: mPendingSubtitleTracks.clear();
    }
}

@raymond1012 这是我的修改 有错敬请指正~

Originally posted by @shuqiao in https://github.com/bilibili/ijkplayer/issues/3834#issuecomment-350636239

我也定义了 FileAndroidIO.java,并且在 ijkVideoView.java 中 setAndroidIOCallback。但是播放视频的时候就闪退了,报错如下: 08-21 17:49:48.950 20596-20596/tv.danmaku.ijk.media.example V/IJKMEDIA: setDataSource: path ijkio:androidio:/storage/emulated/0/Movies/SD2019-05-06-10-13-32.mp4 08-21 17:49:48.950 20596-20596/tv.danmaku.ijk.media.example D/IJKMEDIA: ijkmp_set_data_source(url="ijkio:androidio:/storage/emulated/0/Movies/SD2019-05-06-10-13-32.mp4") 08-21 17:49:48.950 20596-20596/tv.danmaku.ijk.media.example D/IJKMEDIA: ijkmp_set_data_source(url="ijkio:androidio:/storage/emulated/0/Movies/SD2019-05-06-10-13-32.mp4")=0 08-21 17:49:48.950 20596-20596/tv.danmaku.ijk.media.example D/IJKMEDIA: IjkMediaPlayer_setVideoSurface 08-21 17:49:48.950 20596-20596/tv.danmaku.ijk.media.example D/IJKMEDIA: ijkmp_set_android_surface(surface=0x7ff5000628) 08-21 17:49:48.950 20596-20596/tv.danmaku.ijk.media.example D/IJKMEDIA: ffpipeline_set_surface() 08-21 17:49:48.950 20596-20596/tv.danmaku.ijk.media.example D/IJKMEDIA: ijkmp_set_android_surface(surface=0x7ff5000628)=void 08-21 17:49:48.950 20596-20596/tv.danmaku.ijk.media.example D/IJKMEDIA: IjkMediaPlayer_prepareAsync 08-21 17:49:48.950 20596-20596/tv.danmaku.ijk.media.example D/IJKMEDIA: ijkmp_prepare_async() 08-21 17:49:48.950 20596-20596/tv.danmaku.ijk.media.example I/IJKMEDIA: ===== versions ===== 08-21 17:49:48.950 20596-20596/tv.danmaku.ijk.media.example I/IJKMEDIA: ijkplayer : k0.8.8 08-21 17:49:48.950 20596-20596/tv.danmaku.ijk.media.example I/IJKMEDIA: FFmpeg : ff3.4--ijk0.8.7--20180103--001 08-21 17:49:48.950 20596-20596/tv.danmaku.ijk.media.example I/IJKMEDIA: libavutil : 55.78.100 08-21 17:49:48.950 20596-20659/tv.danmaku.ijk.media.example I/IJKMEDIA: SDL_RunThread: [20659] ff_msg_loop 08-21 17:49:48.950 20596-20596/tv.danmaku.ijk.media.example I/IJKMEDIA: libavcodec : 57.107.100 08-21 17:49:48.950 20596-20659/tv.danmaku.ijk.media.example D/IJKMEDIA: message_loop 08-21 17:49:48.950 20596-20596/tv.danmaku.ijk.media.example I/IJKMEDIA: libavformat : 57.83.100 08-21 17:49:48.950 20596-20596/tv.danmaku.ijk.media.example I/IJKMEDIA: libswscale : 4.8.100 08-21 17:49:48.950 20596-20596/tv.danmaku.ijk.media.example I/IJKMEDIA: libswresample: 2.9.100 08-21 17:49:48.950 20596-20596/tv.danmaku.ijk.media.example I/IJKMEDIA: ===== options ===== 08-21 17:49:48.950 20596-20596/tv.danmaku.ijk.media.example I/IJKMEDIA: player-opts : mediacodec = 0 08-21 17:49:48.950 20596-20596/tv.danmaku.ijk.media.example I/IJKMEDIA: player-opts : opensles = 0 08-21 17:49:48.950 20596-20596/tv.danmaku.ijk.media.example I/IJKMEDIA: player-opts : overlay-format = 842225234 08-21 17:49:48.950 20596-20596/tv.danmaku.ijk.media.example I/IJKMEDIA: player-opts : framedrop = 1 08-21 17:49:48.950 20596-20596/tv.danmaku.ijk.media.example I/IJKMEDIA: player-opts : start-on-prepared = 0 08-21 17:49:48.950 20596-20596/tv.danmaku.ijk.media.example I/IJKMEDIA: format-opts : ijkapplication = 367467380576 08-21 17:49:48.950 20596-20596/tv.danmaku.ijk.media.example I/IJKMEDIA: format-opts : ijkiomanager = 367467380736 08-21 17:49:48.950 20596-20596/tv.danmaku.ijk.media.example I/IJKMEDIA: format-opts : http-detect-range-support = 0 08-21 17:49:48.950 20596-20596/tv.danmaku.ijk.media.example I/IJKMEDIA: format-opts : androidio-inject-callback = 1049930 08-21 17:49:48.950 20596-20596/tv.danmaku.ijk.media.example I/IJKMEDIA: codec-opts : skip_loop_filter = 48 08-21 17:49:48.950 20596-20596/tv.danmaku.ijk.media.example I/IJKMEDIA: =================== 08-21 17:49:48.951 20596-20659/tv.danmaku.ijk.media.example D/IJKMEDIA: FFP_MSG_FLUSH: 08-21 17:49:48.952 20596-20596/tv.danmaku.ijk.media.example D/IJKMEDIA: ijkmp_prepare_async()=0 08-21 17:49:48.952 20596-20660/tv.danmaku.ijk.media.example I/IJKMEDIA: SDL_RunThread: [20660] ff_vout 08-21 17:49:48.952 20596-20661/tv.danmaku.ijk.media.example I/IJKMEDIA: SDL_RunThread: [20661] ff_read 08-21 17:49:48.952 20596-20661/tv.danmaku.ijk.media.example D/IJKMEDIA: Opening 'ijkio:androidio:/storage/emulated/0/Movies/SD2019-05-06-10-13-32.mp4' for reading 08-21 17:49:48.952 20596-20661/tv.danmaku.ijk.media.example D/IJKMEDIA: AVOption type 127 of option async not implemented yet

--------- beginning of crash

08-21 17:49:48.952 20596-20661/tv.danmaku.ijk.media.example A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x7f00000010 in tid 20661 (ff_read) 08-21 17:49:49.005 551-551/? A/DEBUG: 08-21 17:49:49.005 551-551/? A/DEBUG: Build fingerprint: 'HONOR/CAM-AL00/HWCAM-Q:6.0/HONORCAM-AL00/C00B243:user/release-keys' 08-21 17:49:49.005 551-551/? A/DEBUG: Revision: '0' 08-21 17:49:49.005 551-551/? A/DEBUG: ABI: 'arm64' 08-21 17:49:49.005 551-551/? A/DEBUG: pid: 20596, tid: 20661, name: ff_read >>> tv.danmaku.ijk.media.example <<< 08-21 17:49:49.005 551-551/? A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x7f00000010 08-21 17:49:49.022 551-551/? A/DEBUG: x0 0000007f00000000 x1 0000000000000000 x2 000000558ecc5620 x3 0000000000000000 08-21 17:49:49.022 551-551/? A/DEBUG: x4 0000000000000000 x5 0000007f8eed90b0 x6 000000558ebc2d20 x7 000000558eab5540 08-21 17:49:49.022 551-551/? A/DEBUG: x8 0000000000000000 x9 0000000000000049 x10 0000000000000000 x11 00000000ffffff9f 08-21 17:49:49.022 551-551/? A/DEBUG: x12 0000000000000005 x13 0000007faec99be8 x14 0000000000000000 x15 0000000040051440 08-21 17:49:49.022 551-551/? A/DEBUG: x16 0000007faec92a60 x17 0000000000000000 x18 0000007faec99000 x19 0000000000000000 08-21 17:49:49.022 551-551/? A/DEBUG: x20 000000558ecc5620 x21 0000000000000000 x22 0000000000000000 x23 0000000000000000 08-21 17:49:49.022 551-551/? A/DEBUG: x24 000000558eab5540 x25 0000007f8eed90b0 x26 0000007faec50000 x27 0000007f00000000 08-21 17:49:49.022 551-551/? A/DEBUG: x28 0000007f8eed92d8 x29 0000007f8eed9420 x30 0000007f8fa39038 08-21 17:49:49.022 551-551/? A/DEBUG: sp 0000007f8eed9000 pc 0000007f8fa38964 pstate 0000000020000000 08-21 17:49:49.023 551-551/? A/DEBUG: backtrace: 08-21 17:49:49.023 551-551/? A/DEBUG: #00 pc 0000000000270964 /data/app/tv.danmaku.ijk.media.example-1/lib/arm64/libijkffmpeg.so (av_opt_next+20) 08-21 17:49:49.023 551-551/? A/DEBUG: #01 pc 0000000000271034 /data/app/tv.danmaku.ijk.media.example-1/lib/arm64/libijkffmpeg.so (av_opt_find2+228) @raymond1012 @shuqiao 请问知道是什么问题吗?是有什么东西还没配置吗?

sanerjion commented 1 year ago

你io的写法不对

fancy32w commented 3 months ago

你io的写法不对

请问正确写法该怎么写呢 我也遇到了这个问题