Android 2.3.4 - Http Live Streaming - PullRequest
3 голосов
/ 21 марта 2012

Я работаю над этим проектом для клиента, и мы должны передавать потоковое аудио с сервера на устройство под управлением 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 ++

Есть ли что-то, что я пропустил?

...