当前位置: 首页 > 知识库问答 >
问题:

当我播放第二个视频时,只显示第一个视频的冻结帧,并且播放音频

怀晋
2023-03-14

我的应用程序有一个片段,播放一秒钟长的视频。播放完视频后,用户必须按下一个按钮,然后应该播放一个新的视频。在播放第二个视频之前,my main activity加载、创建一个新片段并创建新的Exoplayer实例。

我第一次播放视频时,一切都按预期进行。然而,如果我想播放第二个视频,它将显示第一个视频最后一帧的冻结图像,并播放第二个视频的声音。这个bug不出现在Android8(API Level26),而是出现在Android8以下的版本上(我测试了Android6和Android7.1)。

鉴于我有一个新的Surface和一个新的Exoplayer,为什么上一个视频的最后一帧仍然有数据,这对我来说是个谜。我是否可以调用一些功能来删除这些数据,并获得我在Android 8中获得的行为,在Android的早期版本中,第二个视频播放没有问题?

在我使用ExoPlayer之前,普通的MediaPlayer也有同样的问题。我创建了一个问题的最小化示例,其中有:

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button mButton = findViewById(R.id.button1);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                createNewFragment();
            }
        });
    }

    private void createNewFragment() {
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.add(R.id.contentFragment, new VideoFragment());
        ft.commit();
    }
}

public class VideoFragment extends Fragment implements SurfaceHolder.Callback{
    private Context mContext;
    private SimpleExoPlayer mPlayer;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.videolayout, container, false);
        SurfaceView mSurfaceView = (SurfaceView) view.findViewById(R.id.surface_view1);
        SurfaceHolder surfaceHolder = mSurfaceView.getHolder();
        surfaceHolder.setSizeFromLayout();
        surfaceHolder.addCallback(this);

        mContext = inflater.getContext();

        return view;
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
        TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
        TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);

        mPlayer = ExoPlayerFactory.newSimpleInstance(mContext, trackSelector);
        mPlayer.setVideoSurfaceHolder(holder);
        mPlayer.setPlayWhenReady(true);
        playVideo(mContext);
    }

    private void playVideo(Context context){
        final RawResourceDataSource rawResourceDataSource = new RawResourceDataSource(context);

        int raw_res_id = context.getResources().getIdentifier(
                "collect",
                "raw",
                context.getPackageName());
        DataSpec dataSpec = new DataSpec(RawResourceDataSource.buildRawResourceUri(raw_res_id));
        try {
            rawResourceDataSource.open(dataSpec);

            DataSource.Factory factory = new DataSource.Factory() {
                @Override
                public DataSource createDataSource() {
                    return rawResourceDataSource;
                }
            };
            MediaSource media_source = new ExtractorMediaSource.Factory(factory).createMediaSource(rawResourceDataSource.getUri());
            mPlayer.prepare(media_source);

        } catch (RawResourceDataSource.RawResourceDataSourceException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
    }
}

共有1个答案

游安康
2023-03-14

尝试为fragmentchange执行以下代码

 final FragmentTransaction transaction = fragmentManager.beginTransaction();
    Fragment f = new VideoFragment();
    transaction.replace(R.id.contentFragment, f).commit();

只需尝试此代码,并检查是否发生相同的情况

 类似资料:
  • 只是想知道是否有人能告诉我这是怎么回事。当我播放视频时,我可以听到音频,但视频不显示。这是我的代码,我是初学者

  • 我想让应用程序逐帧播放功能。我想这是不可能与标准的Android工具。我尝试了VideoView和search kTo(当前的1000/帧率)方法,但它不起作用(我想它不会在暂停的视频上寻找)。我的问题是:我需要学习和使用什么来使它成为可能,什么工具和/或库?我是Android初学者,我没有工作的视频渲染早,所以我的知识,这是真的很低。

  • 正常模式下不播放同一视频。 我的问题是, 当我尝试播放视频,我得到的只是空白视频,但我得到了所有的音频和字幕。 我的代码有什么错误。请给我任何建议。

  • 以下是在视频框中播放2个mp4视频的代码。 gst-launch-1.0 filesrc location=1。mp4!decodebin!队列视频转换!视频框边框alpha=0右=-100!videomixer name=混音!视频转换!autovideosink文件rc位置=2。mp4!decodebin!队列视频转换!视频框边框alpha=0左=-100!混合 我已尝试使用此代码播放3个视频

  • 我正在开发一个音频播放器,它可以在后台播放音频文件。我的问题是,当录像机或视频播放器启动时,我需要暂停音频播放器。 有什么方法可以处理这个任务吗?例如,我有来处理这些调用。当我接到呼叫或wnat呼叫时,我们可以使用呼叫状态暂停播放器。我想为录像机或视频播放器以及相同的场景。当视频/录制开始时,我需要暂停音频播放器。

  • 主要内容:本节引言:,1.相关方法详解,2.使用代码示例,3.本节示例代码下载:,本节小结:本节引言: 本节带来的是Android多媒体中的——MediaPlayer,我们可以通过这个API来播放音频和视频 该类是Androd多媒体框架中的一个重要组件,通过该类,我们可以以最小的步骤来获取,解码 和播放音视频。它支持三种不同的媒体来源: 本地资源 内部的URI,比如你可以通过ContentResolver来获取 外部URL(流) 对于Android所支持的的媒体格式列表 对于Androi