【问题标题】:java.io.IOException: setDataSource failed when play recorded mp4java.io.IOException:播放录制的 mp4 时 setDataSource 失败
【发布时间】:2016-01-21 06:56:15
【问题描述】:

我想用 Android Media Player 播放录制的 mp4 数据,但尝试播放时显示此错误:

java.io.IOException: setDataSource 失败。

在 android.media.MediaPlayer.setDataSource(MediaPlayer.java:1086)

在 android.media.MediaPlayer.setDataSource(MediaPlayer.java:1032)

这是我的代码:

final ImageView play = (ImageView) root.findViewById(R.id.voice_play);
        play.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    player = new MediaPlayer();
                    if (player.isPlaying()) {
                        player.reset();
                    }
                    player.setDataSource("file://mnt/sdcard/Android/data/com.myapp.apptalk/AudioRecorder/22-Oct-2015 11:26:14.mp4");
                    player.prepare();

                    seekbar.setMax(player.getDuration());

                    if (isPlay) {
                        player.stop();
                        play.setImageResource(R.drawable.play);
                        handler.removeCallbacks(runnable);
                        isPlay = false;
                    } else {
                        player.start();

                        runnable = new Runnable() {
                            @Override
                            public void run() {
                                seekbar.setProgress(player.getCurrentPosition());
                                handler.postDelayed(this, 1000);
                            }
                        };
                        handler = new Handler();
                        handler.post(runnable);

                        play.setImageResource(R.drawable.stop);
                        isPlay = true;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

有人可以帮忙吗?

【问题讨论】:

    标签: android android-mediaplayer mpeg-4


    【解决方案1】:

    不要忘记在 AndroidManifest.xml 中添加互联网权限

    <uses-permission android:name="android.permission.INTERNET" /> 
    

    【讨论】:

    • 如果要播放本地 mp4 文件,为什么需要 Internet 权限?
    • 我在构建在线广播应用程序时遇到了同样的问题并且没有正确阅读问题......但这就是我解决它的方法。
    【解决方案2】:

    我昨天刚刚解决了这个问题

    不直接给出 setDataSource 的路径,而是给出 File 的路径

    try 
                {                   
                    Log.d("SetDatasource path", playRecordPath);
    
                     File filePath = new File(playRecordPath);
    
                     if (!filePath.exists()) 
                     {
                         filePath.createNewFile();
                     }
    
                     FileInputStream is = new FileInputStream(filePath);
    
                     mMediaRecordingPlayer.setDataSource(is.getFD());
    
                    mMediaRecordingPlayer.prepare();
    
                    is.close();
                }
                catch (IllegalArgumentException e) 
                {
                    e.printStackTrace();
                } 
                catch (SecurityException e) 
                {
                    e.printStackTrace();
                } 
                catch (IllegalStateException e) 
                {
                    e.printStackTrace();
                } 
                catch (IOException e) 
                {
                    e.printStackTrace();
                }
    

    然后在onPrepared方法中

    @Override
        public void onPrepared(MediaPlayer mp) 
        {
            mMediaRecordingPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    
            mMediaRecordingPlayer.setVolume(1.5f, 1.5f);
    
            mMediaRecordingPlayer.start();
    
            duration = mMediaRecordingPlayer.getDuration();
    
            mSeekBarPlayer.setMax(duration);
    
            mSeekBarPlayer.postDelayed(onEverySecond, 1000);
        }
    

    在初始化您的媒体播放器时执行此操作

    mMediaRecordingPlayer  = new MediaPlayer();
    
    mMediaRecordingPlayer.setOnPreparedListener(this);  
    

    在你的活动中你必须实现这个

    public class MainActivity extends Activity implements OnPreparedListener 
    

    【讨论】:

    • 现在,它不显示以前的错误,但它总是显示:java.io.FileNotFoundException: file:/storage/emulated/0/AudioRecorder/blablabla.mp4: open failed: ENOENT (No such file或目录)
    • 那是因为您正在录制的文件和您提供的文件播放记录的路径不同,记录时记录路径然后再次记录路径同时将其提供给文件播放记录
    • 录制时保存路径,然后在播放时给出完全相同的路径
    猜你喜欢
    • 1970-01-01
    • 2013-07-31
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多