Я работаю над этим проектом для клиента, и мы должны передавать потоковое аудио с сервера на устройство под управлением Android Gingerbread.Чтобы получить поток, клиент Android должен сделать запрос на вариант списка воспроизведения, а затем сделать запрос на сам список воспроизведения (тот, у которого есть идентификаторы URI, которые указывают на фрагменты файла TS).После этого клиентское приложение расшифровывает фрагменты и отправляет их на платформу для воспроизведения.
Проблема, которую я имею, вращается вокруг части безопасности.Наш клиент (рассматриваемая компания) использует запатентованную схему шифрования, которая служит ключами для заблаговременного дешифрования фрагментов файла TS посредством HTTP-запроса вместо того, чтобы следовать спецификации HLS и обслуживать файлы ключей через URI, указанные в индексе.сами файлы.Насколько я могу судить, платформа Android Mediaplayer имеет возможность находить эти файлы ключей и генерировать / находить соответствующие IV для расшифровки, ЕСЛИ URI файлов ключей находятся в индексных файлах.
К сожалению, все это означает, что я не могу расшифровать куски файлов и воспроизвести поток без промежутков между каждым сегментом - я выполняю это, отправляя HTTP-запросы GET для каждого сегмента, загружая их во внутреннийхранилище, применяя расшифровку, а затем воспроизводя их, используя следующий код:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
File dir = new File(TS_FILE_DIR);
String [] files = dir.list();
mTsFiles = new ArrayList<File>();
for (String file : files) {
String path = TS_FILE_DIR + file;
mTsFiles.add(new File(path));
}
mMediaController = new MediaController(this);
mVideoView = (VideoView)findViewById(R.id.video_view_1);
mVideoView.setVideoPath(mTsFiles.get(0).getAbsolutePath());
mVideoView.setMediaController(mMediaController);
mVideoView.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.start();
}
});
mVideoView.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.pause();
mp.reset();
if (mIndex < mTsFiles.size()) {
mIndex++;
try {
mp.setDataSource(mTsFiles.get(mIndex).getAbsolutePath());
mp.prepareAsync();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
});
}
Я пробовал:
1) Использование 2 медиаплееров и переключение между 2, но это не такне работают вообще 2) Смотря на исходный код ICS, чтобы получить представление о том, как все это работает, но это очень сложно, и я не очень хорошо разбираюсь в c ++
Есть ли что-то, что я пропустил?