MythTV Go Android Player Test

Since publishing the MythTV Go app for viewing MythTV recordings on an Android device, I’ve had a lot of feedback from people who’ve had trouble getting the video streams to play.

It seems that a lot of Android players have difficulty playing the HLS streams created by the MythTV backend, so I thought I’d do some thorough investigation into the issue.

Test Result Summary

Player Version Status
BSPlayer 1.5.136
  • Doesn’t work at all
MX Player 1.7.7
  • Only plays first few seconds of stream
    whilst transcoding.
  • Once completely transcoded, plays whole
    stream and skipping within stream works.
VPlayer 3.1
  • Plays stream ok whilst transcoding, but
    doesn’t start at the beginning.
  • Once completely transcoded, plays whole
    stream and skipping within stream works.
DICE Player 2.0.16 TBD

Test Environment

Backend

  • Ubuntu 10.04 (Lucid)
  • MythTV 0.25.2 (mythbuntu repositories)
  • Intel Core2Quad Q8300 2.5GHz
  • 3Gb RAM

Devices

  • Original HTC Desire phone running Android 2.3.7 (CyanogenMod)
  • Advent Vega 10″ tablet running Android 4.1.1 (VegaBean)

VPlayer Detailed Testing

Player Request 1

The player requests the URL passed in from MythTV Go:


GET /Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400
_1024kV_64kA.m3u8 HTTP/1.1
User-Agent: Lavf54.17.100
Accept: */*
Range: bytes=0-
Connection: close
Host: 192.168.1.202:6544

MythTV Response 1

MythTV returns 2 playlists, the first containing audio/video, and the second containing audio only, intended for low bandwidth connections:


HTTP/1.1 206 Partial Content
Date: 12 Nov 2012 21:26:43
Server: Linux 2.6.32-25-generic, UPnP/1.0, MythTV 0.25.20120506-1
Accept-Ranges: bytes
Cache-Control: no-cache="Ext", max-age = 5000
Content-Range: bytes 0-310/311
Connection: Close
Content-Type: application/x-mpegurl
Content-Length: 311

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1196800
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.av.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=35200
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.ao_32kA.m3u8

Player Request 2

The player requests the first m3u8 playlist (audio/video):


GET /Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.av.m3u8 HTTP/1.1
User-Agent: Lavf54.17.100
Accept: */*
Range: bytes=0-
Connection: close
Host: 192.168.1.202:6544

MythTV Response 2

MythTV returns the playlist so far, with links to 66 chunks of audio/video, each 10 seconds long:


HTTP/1.1 206 Partial Content
Date: 12 Nov 2012 21:26:43
Server: Linux 2.6.32-25-generic, UPnP/1.0, MythTV 0.25.20120506-1
Accept-Ranges: bytes
Cache-Control: no-cache="Ext", max-age = 5000
Content-Range: bytes 0-7778/7779
Connection: Close
Content-Type: application/x-mpegurl
Content-Length: 7779

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:10
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.av.000001.ts
#EXTINF:10
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.av.000002.ts
...
#EXTINF:10
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.av.000065.ts
#EXTINF:10
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.av.000066.ts

Player Request 3

The player requests the second m3u8 playlist (audio only):


GET /Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.ao_32kA.m3u8 HTTP/1.1
User-Agent: Lavf54.17.100
Accept: */*
Range: bytes=0-
Connection: close
Host: 192.168.1.202:6544

MythTV Response 3

MythTV returns the playlist so far, with links to 66 chunks of audio, each 10 seconds long:


HTTP/1.1 206 Partial Content
Date: 12 Nov 2012 21:26:43
Server: Linux 2.6.32-25-generic, UPnP/1.0, MythTV 0.25.20120506-1
Accept-Ranges: bytes
Cache-Control: no-cache="Ext", max-age = 5000
Content-Range: bytes 0-8108/8109
Connection: Close
Content-Type: application/x-mpegurl
Content-Length: 8109

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:10
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.ao_32kA.000001.ts
#EXTINF:10
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.ao_32kA.000002.ts
...
#EXTINF:10
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.ao_32kA.000065.ts
#EXTINF:10
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.ao_32kA.000066.ts

Player Request 4

The player requests the 64th segment of audio/video (I expected it to start at the beginning):


GET /Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.av.000064.ts HTTP/1.1
User-Agent: Lavf54.17.100
Accept: */*
Range: bytes=0-
Connection: close
Host: 192.168.1.202:6544

MythTV Response 4

MythTV returns 10 second segment of audio/video:


HTTP/1.1 206 Partial Content
Date: 12 Nov 2012 21:26:43
Server: Linux 2.6.32-25-generic, UPnP/1.0, MythTV 0.25.20120506-1
Accept-Ranges: bytes
Cache-Control: no-cache="Ext", max-age = 5000
Content-Range: bytes 0-462667/462668
Connection: Close
Content-Type: video/mp2t
Content-Length: 462668

*binary data*

Player Request 5

The player requests the 64th segment of audio (I expected it to start at the beginning):


GET /Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.ao_32kA.000064.ts HTTP/1.1
User-Agent: Lavf54.17.100
Accept: */*
Range: bytes=0-
Connection: close
Host: 192.168.1.202:6544

MythTV Response 5

MythTV returns 10 second segment of audio:


HTTP/1.1 206 Partial Content
Date: 12 Nov 2012 21:26:43
Server: Linux 2.6.32-25-generic, UPnP/1.0, MythTV 0.25.20120506-1
Accept-Ranges: bytes
Cache-Control: no-cache="Ext", max-age = 5000
Content-Range: bytes 0-69935/69936
Connection: Close
Content-Type: video/mp2t
Content-Length: 69936

*binary data*

Player Request 6

The player requests the 65th segment of audio:


GET /Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.ao_32kA.000065.ts HTTP/1.1
User-Agent: Lavf54.17.100
Accept: */*
Range: bytes=0-
Connection: close
Host: 192.168.1.202:6544

MythTV Response 6

MythTV returns 10 second segment of audio:


HTTP/1.1 206 Partial Content
Date: 12 Nov 2012 21:26:44
Server: Linux 2.6.32-25-generic, UPnP/1.0, MythTV 0.25.20120506-1
Accept-Ranges: bytes
Cache-Control: no-cache="Ext", max-age = 5000
Content-Range: bytes 0-72755/72756
Connection: Close
Content-Type: video/mp2t
Content-Length: 72756

*binary data*

Player Request 7

The player requests the 65th segment of audio/video:


GET /Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.av.000065.ts HTTP/1.1
User-Agent: Lavf54.17.100
Accept: */*
Range: bytes=0-
Connection: close
Host: 192.168.1.202:6544

MythTV Response 7

MythTV returns 10 second segment of audio/video:


HTTP/1.1 206 Partial Content
Date: 12 Nov 2012 21:26:44
Server: Linux 2.6.32-25-generic, UPnP/1.0, MythTV 0.25.20120506-1
Accept-Ranges: bytes
Cache-Control: no-cache="Ext", max-age = 5000
Content-Range: bytes 0-529783/529784
Connection: Close
Content-Type: video/mp2t
Content-Length: 529784

*binary data*

Player Request 8


Request audio chunk 66

MythTV Response 8


Return audio chunk 66

Player Request 9


Request audio/video chunk 66

MythTV Response 9


Return audio/video chunk 66

Player Request 10

The player has reached the last chunk of audio from the original m3u8 playlist, so it requests it again to see if any new chunks have been added:


GET /Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.ao_32kA.m3u8 HTTP/1.1
User-Agent: Lavf54.17.100
Accept: */*
Range: bytes=0-
Connection: close
Host: 192.168.1.202:6544

MythTV Response 10

MythTV returns the playlist so far, now with links to 70 chunks of audio, each 10 seconds long:


HTTP/1.1 206 Partial Content
Date: 12 Nov 2012 21:26:53
Server: Linux 2.6.32-25-generic, UPnP/1.0, MythTV 0.25.20120506-1
Accept-Ranges: bytes
Cache-Control: no-cache="Ext", max-age = 5000
Content-Range: bytes 0-8596/8597
Connection: Close
Content-Type: application/x-mpegurl
Content-Length: 8597

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:10
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.ao_32kA.000001.ts
#EXTINF:10
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.ao_32kA.000002.ts
...
#EXTINF:10
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.ao_32kA.000069.ts
#EXTINF:10
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.ao_32kA.000070.ts

Player Request 11


Request audio chunk 67

MythTV Response 11


Return audio chunk 67

Player Request 12

The player has reached the last chunk of audio/video from the original m3u8 playlist, so it requests it again to see if any new chunks have been added:


GET /Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.av.m3u8 HTTP/1.1
User-Agent: Lavf54.17.100
Accept: */*
Range: bytes=0-
Connection: close
Host: 192.168.1.202:6544

MythTV Response 12

MythTV returns the playlist so far, now with links to 70 chunks of audio/video, each 10 seconds long:


HTTP/1.1 206 Partial Content
Date: 12 Nov 2012 21:26:53
Server: Linux 2.6.32-25-generic, UPnP/1.0, MythTV 0.25.20120506-1
Accept-Ranges: bytes
Cache-Control: no-cache="Ext", max-age = 5000
Content-Range: bytes 0-8246/8247
Connection: Close
Content-Type: application/x-mpegurl
Content-Length: 8247

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:10
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.av.000001.ts
#EXTINF:10
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.av.000002.ts
#EXTINF:10
...
#EXTINF:10
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.av.000069.ts
#EXTINF:10
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.av.000070.ts

Player Request 13


Request audio/video chunk 67

MythTV Response 13


Return audio/video chunk 67

And so on …

Player Behaviour

The player plays the audio/video until the user stops it.

Notes:

  • The player doesn’t start at the beginning of the stream
  • The player retrieves both the audio/video and the audio only streams, rather than just one of them

BSPlayer Detailed Testing

Player Request 1

The player requests the URL passed in from MythTV Go:


GET /Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.m3u8 HTTP/1.1
User-Agent: Dalvik/1.4.0 (Linux; U; Android 2.3.7; HTC Desire Build/GRI40)
Host: 192.168.1.202:6544
Connection: Keep-Alive
Accept-Encoding: gzip

MythTV Response 1

MythTV returns 2 playlists, the first containing audio/video, and the second containing audio only, intended for low bandwidth connections:


HTTP/1.1 200 OK
Date: 12 Nov 2012 21:23:32
Server: Linux 2.6.32-25-generic, UPnP/1.0, MythTV 0.25.20120506-1
Accept-Ranges: bytes
Cache-Control: no-cache="Ext", max-age = 5000
User-Agent: redsonic
Connection: Keep-Alive
Content-Type: application/x-mpegurl
Content-Length: 311

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1196800
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.av.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=35200
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.ao_32kA.m3u8

Player Behaviour

The player doesn’t play anything, but instead opens a file explorer window.

MX Player Detailed Testing

Player Request 1

The player requests the URL passed in from MythTV Go:


GET /Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.m3u8 HTTP/1.1
User-Agent: Lavf54.33.100
Accept: */*
Range: bytes=0-
Connection: close
Host: 192.168.1.202:6544

MythTV Response 1

MythTV returns 2 playlists, the first containing audio/video, and the second containing audio only, intended for low bandwidth connections:


HTTP/1.1 206 Partial Content
Date: 12 Nov 2012 21:25:53
Server: Linux 2.6.32-25-generic, UPnP/1.0, MythTV 0.25.20120506-1
Accept-Ranges: bytes
Cache-Control: no-cache="Ext", max-age = 5000
Content-Range: bytes 0-310/311
Connection: Close
Content-Type: application/x-mpegurl
Content-Length: 311

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1196800
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.av.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=35200
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.ao_32kA.m3u8

Player Request 2

The player requests the first m3u8 playlist (audio/video):


GET /Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.av.m3u8 HTTP/1.1
User-Agent: Lavf54.33.100
Accept: */*
Range: bytes=0-
Connection: close
Host: 192.168.1.202:6544

MythTV Response 2

MythTV returns the playlist so far, with links to 51 chunks of audio/video, each 10 seconds long:


HTTP/1.1 206 Partial Content
Date: 12 Nov 2012 21:25:53
Server: Linux 2.6.32-25-generic, UPnP/1.0, MythTV 0.25.20120506-1
Accept-Ranges: bytes
Cache-Control: no-cache="Ext", max-age = 5000
Content-Range: bytes 0-6023/6024
Connection: Close
Content-Type: application/x-mpegurl
Content-Length: 6024

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:10
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.av.000001.ts
#EXTINF:10
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.av.000002.ts
...
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.av.000050.ts
#EXTINF:10
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.av.000051.ts

Player Request 3

The player requests the second m3u8 playlist (audio only):


GET /Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.ao_32kA.m3u8 HTTP/1.1
User-Agent: Lavf54.33.100
Accept: */*
Range: bytes=0-
Connection: close
Host: 192.168.1.202:6544

MythTV Response 3

MythTV returns the playlist so far, with links to 51 chunks of audio, each 10 seconds long:


HTTP/1.1 206 Partial Content
Date: 12 Nov 2012 21:25:53
Server: Linux 2.6.32-25-generic, UPnP/1.0, MythTV 0.25.20120506-1
Accept-Ranges: bytes
Cache-Control: no-cache="Ext", max-age = 5000
Content-Range: bytes 0-6278/6279
Connection: Close
Content-Type: application/x-mpegurl
Content-Length: 6279

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:10
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.ao_32kA.000001.ts
#EXTINF:10
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.ao_32kA.000002.ts
...
#EXTINF:10
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.ao_32kA.000050.ts
#EXTINF:10
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.ao_32kA.000051.ts

Player Request 4

The player requests the 49th segment of video (I expected it to start at the beginning):


GET /Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_64kA.av.000049.ts HTTP/1.1
User-Agent: Lavf54.33.100
Accept: */*
Range: bytes=0-
Connection: close
Host: 192.168.1.202:6544

MythTV Response 4

MythTV returns 10 second segment of video:


HTTP/1.1 206 Partial Content
Date: 12 Nov 2012 21:25:53
Server: Linux 2.6.32-25-generic, UPnP/1.0, MythTV 0.25.20120506-1
Accept-Ranges: bytes
Cache-Control: no-cache="Ext", max-age = 5000
Content-Range: bytes 0-176531/176532
Connection: Close
Content-Type: video/mp2t
Content-Length: 176532

*binary data*

Player Request 5

The player requests the 49th segment of audio (I believe it should only request one of the two streams):


GET /Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_102
4kV_64kA.ao_32kA.000049.ts HTTP/1.1
User-Agent: Lavf54.33.100
Accept: */*
Range: bytes=0-
Connection: close
Host: 192.168.1.202:6544

MythTV Response 5

MythTV returns 10 second segment of audio:


HTTP/1.1 206 Partial Content
Date: 12 Nov 2012 21:25:53
Server: Linux 2.6.32-25-generic, UPnP/1.0, MythTV 0.25.20120506-1
Accept-Ranges: bytes
Cache-Control: no-cache="Ext", max-age = 5000
Content-Range: bytes 0-72943/72944
Connection: Close
Content-Type: video/mp2t
Content-Length: 72944

*binary data*

Player Request 6

The player re-requests the original URL, presumably to check if anything has changed:


GET /Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_102
4kV_64kA.m3u8 HTTP/1.1
Host: 192.168.1.202
User-Agent: stagefright/1.1 (Linux;Android 2.3.7)

MythTV Response 6

MythTV returns the same 2 playlists as before:


HTTP/1.1 200 OK
Date: 12 Nov 2012 21:25:54
Server: Linux 2.6.32-25-generic, UPnP/1.0, MythTV 0.25.20120506-1
Accept-Ranges: bytes
Cache-Control: no-cache="Ext", max-age = 5000
User-Agent: redsonic
Connection: Keep-Alive
Content-Type: application/x-mpegurl
Content-Length: 311

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1196800
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_
64kA.av.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=35200
/Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_1024kV_
64kA.ao_32kA.m3u8

Player Request 7

The player requests the 50th segment of audio:


GET /Content/GetFile?StorageGroup=Streaming&FileName=1001_20111219202800.mpg.704x400_102
4kV_64kA.ao_32kA.000050.ts HTTP/1.1
User-Agent: Lavf54.33.100
Accept: */*
Range: bytes=0-
Connection: close
Host: 192.168.1.202:6544

MythTV Response 7

MythTV returns 10 second segment of audio:


HTTP/1.1 206 Partial Content
Date: 12 Nov 2012 21:25:55
Server: Linux 2.6.32-25-generic, UPnP/1.0, MythTV 0.25.20120506-1
Accept-Ranges: bytes
Cache-Control: no-cache="Ext", max-age = 5000
Content-Range: bytes 0-69747/69748
Connection: Close
Content-Type: video/mp2t
Content-Length: 69748

*binary data*

Player Behaviour

The player plays the first few seconds of video, and then returns to the MythTV Go app.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s