gpt4 book ai didi

java - VideoView 在通过套接字接收文件时播放文件

转载 作者:行者123 更新时间:2023-12-01 11:42:57 25 4
gpt4 key购买 nike

我有一个应用程序正在从另一个充当服务器的应用程序接收视频文件。当应用程序保存在套接字上接收到的文件时,视频流开始播放该文件(正在构建中)。在代码示例中,按下 btnStream 后,按下 btnPlay 并且应用程序成功运行。但是,如果播放速率大于下载速率,就会出现错误。我想避免这种情况。因此,我需要在视频播放上有一个监听器,当它预测会发生此错误时,它将暂停视频 View 。我知道一个解决方案,如果我知道视频大小,我可以计算收到的字节数并监视缓冲了多少秒,并查看视频 View 是否应该暂停。但是,在不知道视频文件大小的情况下是否可以做到这一点?或者有两个相互依赖的线程?谢谢。

注意:使用的VideoView是自定义的,它可以播放FileDescriptor。

btnStream.setOnClickListener(new View.OnClickListener() {


@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String s = etURL.getText().toString();
String ip = "10.0.0.24";
int port = 7878;
mct= new VideoDownloadTask(ip,port);
mct.execute();

}});
final MediaController mediaController = new MediaController(this);
mediaController.setAnchorView(mVideoView);


Button btnPlay = (Button) findViewById(R.id.button2);
btnPlay.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try {
mVideoView.setVideoFD((new FileInputStream(new File("/sdcard/tempVideo.mp4")).getFD()));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mVideoView.seekTo(0);
mVideoView.start();

}
});
}

public class VideoDownloadTask extends AsyncTask<Void, Void, Void> {

String dstAddress;
int dstPort;
String response = "";
Socket socket=null;

VideoDownloadTask(String addr, int port){
dstAddress = addr;
dstPort = port;
}

@Override
protected Void doInBackground(Void... arg0) {

try {
socket = new Socket(InetAddress.getByName(dstAddress), dstPort);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
try {
if(socket!=null)socket.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}


File f = new File("/sdcard/tempVideo.mp4");

try {
f.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
DataInputStream in=null;
try {
in = new DataInputStream (socket.getInputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
FileOutputStream videoFile = null;
try {
videoFile = new FileOutputStream(f);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int len;
byte buffer[] = new byte[8192];

try {
while((len = in.read(buffer)) != -1) {
videoFile.write(buffer, 0, len);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

try {
videoFile.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return null;
}

@Override
protected void onPostExecute(Void result) {
Toast.makeText(getApplicationContext(), "Done Downloading File",
Toast.LENGTH_LONG).show();
super.onPostExecute(result);
}

}

}

最佳答案

我应用了一个简单的解决方案来解决该问题。如果有人遇到同样的问题,我会分享它。解决方案只是向 videoView 添加一个错误监听器,该监听器将阻止错误弹出窗口并暂停视频。

mVideoView.setOnErrorListener(new OnErrorListener(){
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
// TODO Auto-generated method stub
statusText.setText("ERROR PLAYING VIDEO");
mVideoView.pause();
return true;
}
});

关于java - VideoView 在通过套接字接收文件时播放文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29372319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com