com.google.android.exoplayer2.upstream.HttpDataSource$HttpDataSourceException:无法连接到 android.resource://

问题描述 投票:0回答:1

尝试在 exoplayer 中播放原始文件,但我收到错误并且该文件不存在,我不太确定为什么,我将不胜感激,谢谢您的帮助。

  • 我遇到错误

Source error
 com.google.android.exoplayer2.upstream.HttpDataSource$HttpDataSourceException: Unable to connect to android.resource://com.onBoarding.app2131689472                                                                                          

  • 我的代码

@UnstableApi public class FirstFragment extends Fragment {
    private TextView titleTextView,descriptionTextView;
    private Button prevButton,nextButton;
    private CustomVideoView videoView;
    private ViewPager viewPager;
    SimpleExoPlayerView exoPlayerView;
    SimpleExoPlayer exoPlayer;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.first_fragment_layout, container, false);
        titleTextView = view.findViewById(R.id.titleTextView);
//        videoView = view.findViewById(R.id.videoView);
        exoPlayerView = view.findViewById(R.id.idExoPlayerVIew);
        descriptionTextView = view.findViewById(R.id.descriptionTextView);
        nextButton = view.findViewById(R.id.nextButton);
        viewPager = requireActivity().findViewById(R.id.viewPager);
        return view;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        titleTextView.setText(Utils.getTitle().get(0));
        descriptionTextView.setText(Utils.getDescriptions().get(0));
        playVideo();

        nextButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewPager.setCurrentItem(1);
            }
        });
    }
    
    private void playVideo() {
        try {
            Uri uri = Uri.parse("android.resource://"+ getContext().getPackageName() +"/"+ R.raw.sample);
            BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
            TrackSelector trackSelector = new DefaultTrackSelector(new AdaptiveTrackSelection.Factory(bandwidthMeter));
            exoPlayer = ExoPlayerFactory.newSimpleInstance(requireContext(), trackSelector);
            DefaultHttpDataSourceFactory dataSourceFactory = new DefaultHttpDataSourceFactory("exoplayer_video");
            ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
            MediaSource mediaSource = new ExtractorMediaSource(uri, dataSourceFactory, extractorsFactory, null, null);
            exoPlayerView.setPlayer(exoPlayer);
            exoPlayer.prepare(mediaSource);
            exoPlayer.setPlayWhenReady(true);
        } catch (Exception e) {
            Log.e("TAG", "Error: " + e.toString());
        }
    }

}


  • 依赖关系

  
    implementation 'com.google.android.exoplayer:exoplayer:r2.4.0'
    implementation 'com.google.android.exoplayer:exoplayer-core:r2.4.0'
    implementation 'com.google.android.exoplayer:exoplayer-dash:r2.4.0'
    implementation 'com.google.android.exoplayer:exoplayer-hls:r2.4.0'
    implementation 'com.google.android.exoplayer:exoplayer-smoothstreaming:r2.4.0'
    implementation 'com.google.android.exoplayer:exoplayer-ui:r2.4.0'
    implementation 'androidx.appcompat:appcompat:1.6.1'
    implementation 'com.google.android.material:material:1.11.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    implementation 'androidx.media3:media3-exoplayer:1.3.0-alpha01'
    testImplementation 'junit:junit:4.13.2'
    implementation 'androidx.core:core:1.12.0'
    androidTestImplementation 'androidx.test.ext:junit:1.1.5'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'

java android kotlin exoplayer
1个回答
0
投票

我认为最好使用资产文件夹来存放媒体文件 我希望这段代码可以帮助你。

String videoPath = "your_video_filename.mp4"; // Replace with your video file name
    AssetFileDescriptor assetFileDescriptor;
    try {
        assetFileDescriptor = getAssets().openFd(videoPath);
        videoView.setVideoURI(Uri.parse("asset:///" + videoPath));
        videoView.setMediaController(new MediaController(this));
        videoView.requestFocus();
        videoView.start();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

它使用videoview 替换为exoplayer

© www.soinside.com 2019 - 2024. All rights reserved.