Question

I want to show subtitle (.srt) with my videos (.mp4) I'm fetching datas as a JSON and decoding it, E.g

Video Url : http://www.example.com/wp-content/uploads/Amshrstry.S02E01.HDTV.x264.mp4

Subtile Url :http://www.example.com/wp-content/uploads/Amshrstry.S02E01.HDTV.x264.srt

I tried this, it works like a charm, but i cant use raw folder to read subtitle, my all data fetchin from my website (Video Url and Subtitle Url) so i want to read subtitle from url.

Tried code :

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

txtDisplay = (TextView) findViewById(R.id.txtDisplay);
MediaPlayer player = MediaPlayer.create(this, R.raw.video);

try {
    player.addTimedTextSource(getSubtitleFile(R.raw.sub),
            MediaPlayer.MEDIA_MIMETYPE_TEXT_SUBRIP);
    int textTrackIndex = findTrackIndexFor(
            TrackInfo.MEDIA_TRACK_TYPE_TIMEDTEXT, player.getTrackInfo());
    if (textTrackIndex >= 0) {
        player.selectTrack(textTrackIndex);
    } else {
        Log.w(TAG, "Cannot find text track!");
    }
    player.setOnTimedTextListener(this);
    player.start();
} catch (Exception e) {
    e.printStackTrace();
}
}


private String getSubtitleFile(int resId) {
String fileName = getResources().getResourceEntryName(resId);
File subtitleFile = getFileStreamPath(fileName);
if (subtitleFile.exists()) {
    Log.d(TAG, "Subtitle already exists");
    return subtitleFile.getAbsolutePath();
}
Log.d(TAG, "Subtitle does not exists, copy it from res/raw");

// Copy the file from the res/raw folder to your app folder on the
// device
InputStream inputStream = null;
OutputStream outputStream = null;
try {
    inputStream = getResources().openRawResource(resId);
    outputStream = new FileOutputStream(subtitleFile, false);
    copyFile(inputStream, outputStream);
    return subtitleFile.getAbsolutePath();
} catch (Exception e) {
    e.printStackTrace();
} finally {
    closeStreams(inputStream, outputStream);
}
return "";
}


private void copyFile(InputStream inputStream, OutputStream outputStream)
    throws IOException {
final int BUFFER_SIZE = 1024;
byte[] buffer = new byte[BUFFER_SIZE];
int length = -1;
while ((length = inputStream.read(buffer)) != -1) {
    outputStream.write(buffer, 0, length);
}
}


// A handy method I use to close all the streams
private void closeStreams(Closeable... closeables) {
if (closeables != null) {
    for (Closeable stream : closeables) {
        if (stream != null) {
            try {
                stream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
      }
    }

I want to use Uri instead of R.raw.sub. How can i convert getSubtitleFile(R.raw.sub) method.

Was it helpful?

Solution

For reading file from network use for e.g. URLConnection (you can use .getInputStream()). For details see http://developer.android.com/reference/java/net/URLConnection.html .

You can call then

File dest = new File("destination on SD card");
copyFile(urlConnection.getInputStream(), new FileOutputStream(dest));

and later use same file in player as:

player.addTimedTextSource(dest.getAbsolutePath(),
            MediaPlayer.MEDIA_MIMETYPE_TEXT_SUBRIP);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top