これを機能させることができました。これはまだ未解決の問題であるため、ここに完全な解決策を含めます。
圧縮を防ぐためにファイル拡張子を変更するというアイデアは素晴らしいですが、私はsrt
ファイルをリソースからデバイスのアプリ ローカル ディレクトリにコピーすることを好みますが、とにかく完全を期すために、ここにコピーできない拡張子のリストを示します。圧縮されません。
".jpg"、".jpeg"、".png"、".gif"、".wav"、".mp2"、".mp3"、".ogg"、".aac"、".mpg"、 ".mpeg"、".mid"、".midi"、".smf"、".jet"、".rtttl"、".imy"、".xmf"、".mp4"、".m4a"、 ".m4v"、".3gp"、".3gpp"、".3g2"、".3gpp2"、".amr"、".awb"、".wma"、".wmv"
ソリューションの手順は簡単です。
インスタンスを作成し、次のいずれかをMediaPlayer
呼び出して準備します。MediaPlayer.create()
player.setDataSource()
player.prepare()
字幕ファイルが Android デバイスにまだ存在しない場合は、リソース フォルダーからデバイスにコピーします。
デバイス上の字幕ファイルのフル パスを含むplayer.addTimedTextSource()
最初の引数 a を使用して呼び出し、2 番目の引数として呼び出しますString
MediaPlayer.MEDIA_MIMETYPE_TEXT_SUBRIP
TimedText
呼び出してトラックを選択し、返されたから検索してplayer.selectTrack()
渡します(通常は見つかります)the index of timedTextType
TrackInfo[]
player.getTrackInfo()
2
でリスナーを設定しplayer.setOnTimedTextListener()
、メディア ファイルの再生を開始するplayer.start()
完全なクラスは次のとおりです。
この正確なクラスを実行するには、res/raw
フォルダーsub.srt
の下に 2 つのファイルが必要ですvideo.mp4
(または任意の拡張子)。TextView
次に、 id でa を定義しますtxtDisplay
。最後に、プロジェクト/デバイス/エミュレーターがサポートする必要がありますAPI 16
public class MainActivity extends Activity implements OnTimedTextListener {
private static final String TAG = "TimedTextTest";
private TextView txtDisplay;
private static Handler handler = new Handler();
@Override
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 int findTrackIndexFor(int mediaTrackType, TrackInfo[] trackInfo) {
int index = -1;
for (int i = 0; i < trackInfo.length; i++) {
if (trackInfo[i].getTrackType() == mediaTrackType) {
return i;
}
}
return index;
}
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();
}
}
}
}
}
@Override
public void onTimedText(final MediaPlayer mp, final TimedText text) {
if (text != null) {
handler.post(new Runnable() {
@Override
public void run() {
int seconds = mp.getCurrentPosition() / 1000;
txtDisplay.setText("[" + secondsToDuration(seconds) + "] "
+ text.getText());
}
});
}
}
// To display the seconds in the duration format 00:00:00
public String secondsToDuration(int seconds) {
return String.format("%02d:%02d:%02d", seconds / 3600,
(seconds % 3600) / 60, (seconds % 60), Locale.US);
}
}
そして、ここsubtitle
に私が例として使用しているファイルがあります:
1
00:00:00,220 --> 00:00:01,215
First Text Example
2
00:00:03,148 --> 00:00:05,053
Second Text Example
3
00:00:08,004 --> 00:00:09,884
Third Text Example
4
00:00:11,300 --> 00:00:12,900
Fourth Text Example
5
00:00:15,500 --> 00:00:16,700
Fifth Text Example
6
00:00:18,434 --> 00:00:20,434
Sixth Text Example
7
00:00:22,600 --> 00:00:23,700
Last Text Example
TextView
メディア ファイルが進行するにつれて が自動的に変化する (つまり、字幕ファイルからの読み取り) ことを示すテスト アプリのスクリーンショットを次に示します。
編集:
サンプルプロジェクトのコードは次のとおりです