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

MythTV Stream Debugging

In release 0.25, the MythTV developers added some new external APIs with support for HTTP Live Streaming (HLS).

Since I published the MythTV Go app to allow users with Android devices to watch their TV recordings “on the go”, a number of people have contacted me, to say that the video streaming isn’t working. In the majority of these cases, it’s been due to a problem with their backend. This post is to share the information on how to debug your backend streaming problem.

MythTV HLS Overview

When an application requests a new stream for a recording or video, the mythtv backend starts a background job to transcode the video into H.264 format. The resulting video is written to lots of separate numbered files, each containing 10 seconds of video. These files are store in this directory on the mythbackend:

/home/mythtv/.mythtv/tmp/hls

and they look something like this:

1001_20120106192800.mpg.704x400_1024kV_64kA.av.000001.ts
1001_20120106192800.mpg.704x400_1024kV_64kA.av.000002.ts
1001_20120106192800.mpg.704x400_1024kV_64kA.av.000003.ts
...
1001_20120106192800.mpg.704x400_1024kV_64kA.av.000176.ts
1001_20120106192800.mpg.704x400_1024kV_64kA.av.000177.ts
1001_20120106192800.mpg.704x400_1024kV_64kA.av.000178.ts

These files can be played just like any other video file, e.g.

mplayer 1001_20120106192800.mpg.704x400_1024kV_64kA.av.000001.ts

As soon as one file has been written, the player application can start streaming the video whilst the rest of the video is still being transcoded in the background. Depending on the CPU power of the backend, and the speed of the network, it’s generally better to wait for a few files to be ready before starting the player.

Known Problems

The problems I’ve seen so far can be diagnosed by looking at this log file on the mythbackend:

/var/log/mythtv/mythtranscode.log

Missing Deinterlacers

If you see entries like this in the mythtranscode.log:

Jul 17 13:36:37 myth mythtranscode[27691]: E CoreContext
 filtermanager.cpp:93 (FilterManager) Filter dir '/usr/lib/mythtv/filters' doesn't exist?
...
Jul 17 13:36:37 myth mythtranscode[27691]: E CoreContext filtermanager.cpp:243 (LoadFilters) FilterManager: Failed to load filter 'onefield', no such filter exists

You need to install the deinterlacers that are normally installed with the mythfrontend, as mythtranscode is trying to use them. Installing the mythfrontend package is probably enough on most systems (you don’t have to actually run the frontend if your system is a mythbackend only).

On mythbuntu for example:

apt-get install mythtv-frontend

Incorrect Compile Options

If you see entries like this in the mythtranscode.log:

2012-08-14T20:27:55.155813-04:00 myth mythtranscode[11218]: E CoreContext transcode.cpp:1148 (TranscodeFile) avfw->Init() failed

Your myth packages haven’t been built to support HLS. To be able to transcode to the correct video and audio formats for HLS, mythtv needs to be built with the following options:

  --enable-libx264 --enable-libmp3lame

Known working distributions:

Please let me know of any other distributions that have been tested in the comments, and I’ll update this list.