2015-08-27 4 views
1

Я пишу Videoplayer для Android для потокового видео через HLS. На моем сервере у меня есть m3u8-Playlist и .ts-Segments. Мой код выглядит следующим образом:Android HLS-Streaming не удалось извлечь сегмент

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    vidSurface = (SurfaceView) findViewById(R.id.surfView); 
    vidHolder = vidSurface.getHolder(); 
    vidHolder.addCallback(this); 
} 


public void surfaceCreated(SurfaceHolder arg0) { 
    try { 
     mediaPlayer = new MediaPlayer(); 
     mediaPlayer.setDisplay(vidHolder); 
     mediaPlayer.setDataSource(vidAddress); 
     mediaPlayer.prepareAsync(); 
     mediaPlayer.setOnPreparedListener(this); 
     mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
    } 
    catch(Exception e){ 
     e.printStackTrace(); 
    } 
}  

Игрок прекрасно работает на примере компании Apple bipbopall.m3u8. Но когда я пытаюсь играть мой плейлист эта ошибка возникает:

E/PlaylistFetcher﹕ failed to fetch .ts segment at url 'http://example.com/USSM.mp4Frag1Num0.ts' 
E/LiveSession﹕ XXX Received error -1008 from PlaylistFetcher. 
E/MediaPlayer﹕ error (1, -1008) 

Я думаю, что есть проблема с AES-128 дешифрования файлов. Разве MediaPlayer расшифровывает файлы самостоятельно и как я могу проверить, было ли дешифрование успешным? (Я использую последнюю версию Android-версии)

+0

'1008' является' ERROR_OUT_OF_RANGE' при попытке получить файл. Как выглядит ваш плейлист? – aergistal

+0

@aergistal '# EXTM3U' ' # EXT-X-MEDIA-ПОСЛЕДОВАТЕЛЬНОСТИ: 0' '# EXT-X-ALLOW-КЭШ: NO' ' # EXT-X-версия: 2' '# EXT- X-KEY: METHOD = AES-128, URI = "/ hls-vod-enc-key/hlscf.key", IV = 0X99b74007b6254e4bd1c6e03631cad15b' '# EXT-X-TARGETDURATION: 8' ' #EXTINF: 8, ' 'USSM20000051_abr-100.mp4Frag1Num0.ts' ' #EXTINF: 8, '' USSM20000051_abr-100.mp4Frag1Num1.ts' '#EXTINF: 8,' ' USSM20000051_abr-100.mp4Frag2Num2.ts' ' #EXTINF : 8, ' ' USSM20000051_abr-100.mp4Frag3Num3.ts' '# EXT-X-ENDLIST' – henchman21

+0

MediaPlayer умеет t o расшифровать файлы. HLS поддерживает 'AES', так как v1 и Android могут использовать v2 на 3.x и v3 на 4.x. Вы можете попробовать тот же поток в приложении VLC для Android (а не в бета-версии) и посмотреть, работает ли он. Вы также можете включить журнал отладки. – aergistal

ответ

1

Чтобы возобновить обсуждение в комментариях:

1008 является ERROR_OUT_OF_RANGE возвращаемая при попытке прочитать сегмент в буфер. Проверьте, правильно ли сервер отвечает, загружая сегмент, расшифровывая его и пытаясь воспроизвести его (см. Метод ниже).

Другие предметы для проверки: убедитесь, что сегменты MPEG-TS действительны. Если вы использовали поток H.264, содержащийся в файле MP4, чтобы создать сегменты, проверьте, используют ли они формат Annex B (например, в ffmpeg вы можете использовать битовый поток , который работает с закодированным потоком - вы можете использовать его с -c:v copy)

Чтобы проверить правильность шифрования, используйте openssl.

  1. Получить ключ в простом шестнадцатеричном

    xxd -p keyfile.key

  2. расшифровывать .ts сегмент

    openssl aes-128-cbc -d -in encrypted_segment.ts -out decrypted_segment.ts -nosalt -iv <iv_hex> -K <key_hex> 
    

    Если нет определено IV, то она равна последовательности СМИ.

  3. Попытка воспроизведения дешифрованного сегмента.

+0

Спасибо, после использования ffmpeg все работает отлично – henchman21