warren-bank / HLS-Proxy

Node.js server to proxy HLS video streams

Home Page:http://webcast-reloaded.surge.sh/proxy.html

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

HLS with mp4 media segment

RedRedFlower opened this issue · comments

The program work fine on HLS with .ts media segment

But it not work on HLS using .mp4 media segment. How to handle this?

Thanks.

Off-hand, I'd say that it should work.. regardless of the convention used for the format of the URLs by the video host. Do you have an example that I can test?

I just made my own manifest w/ mp4 segments.. to request through the proxy.. and check the format of the video segment URLs in the resulting proxied manifest..

master.m3u8:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:20675867
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:36:42.373Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=9.743,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
master_12_20675867.mp4
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:36:48.379Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=15.749,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
master_12_20675868.mp4
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:36:54.385Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=21.755,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
master_12_20675869.mp4
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:37:00.391Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=27.761,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
master_12_20675870.mp4
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:37:06.397Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=33.767,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
master_12_20675871.mp4
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:37:12.403Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=39.773,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
master_12_20675872.mp4
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:37:18.409Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=45.779,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
master_12_20675873.mp4
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:37:24.415Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=51.785,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
master_12_20675874.mp4
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:37:30.421Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=57.791,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
master_12_20675875.mp4
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:37:36.427Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=63.797,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
master_12_20675876.mp4

URL (direct):

http://localhost/master.m3u8

URL (proxied):

http://localhost:8080/aHR0cDovL2xvY2FsaG9zdC9tYXN0ZXIubTN1OA==.m3u8

proxied_master.m3u8:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:20675867
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:36:42.373Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=9.743,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
http://localhost:8080/aHR0cDovL2xvY2FsaG9zdC9tYXN0ZXJfMTJfMjA2NzU4NjcubXA0.ts
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:36:48.379Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=15.749,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
http://localhost:8080/aHR0cDovL2xvY2FsaG9zdC9tYXN0ZXJfMTJfMjA2NzU4NjgubXA0.ts
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:36:54.385Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=21.755,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
http://localhost:8080/aHR0cDovL2xvY2FsaG9zdC9tYXN0ZXJfMTJfMjA2NzU4NjkubXA0.ts
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:37:00.391Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=27.761,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
http://localhost:8080/aHR0cDovL2xvY2FsaG9zdC9tYXN0ZXJfMTJfMjA2NzU4NzAubXA0.ts
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:37:06.397Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=33.767,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
http://localhost:8080/aHR0cDovL2xvY2FsaG9zdC9tYXN0ZXJfMTJfMjA2NzU4NzEubXA0.ts
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:37:12.403Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=39.773,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
http://localhost:8080/aHR0cDovL2xvY2FsaG9zdC9tYXN0ZXJfMTJfMjA2NzU4NzIubXA0.ts
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:37:18.409Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=45.779,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
http://localhost:8080/aHR0cDovL2xvY2FsaG9zdC9tYXN0ZXJfMTJfMjA2NzU4NzMubXA0.ts
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:37:24.415Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=51.785,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
http://localhost:8080/aHR0cDovL2xvY2FsaG9zdC9tYXN0ZXJfMTJfMjA2NzU4NzQubXA0.ts
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:37:30.421Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=57.791,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
http://localhost:8080/aHR0cDovL2xvY2FsaG9zdC9tYXN0ZXJfMTJfMjA2NzU4NzUubXA0.ts
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:37:36.427Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=63.797,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
http://localhost:8080/aHR0cDovL2xvY2FsaG9zdC9tYXN0ZXJfMTJfMjA2NzU4NzYubXA0.ts

version of HLS-Proxy:

3.4.0

conclusions: looks good to me

Thanks for your fast response.
I found out the problem is not related to .mp4, .ts also got the same problem.

The source is Cloudflare's stream.
Sample HLS:
https://customer-wi9sckcs7uxt7lh4.cloudflarestream.com/5d5bc37ffcf54c9b82e996823bffbb81/manifest/video.m3u8

URL proxied:
http://localhost:8080/aHR0cHM6Ly9jdXN0b21lci13aTlzY2tjczd1eHQ3bGg0LmNsb3VkZmxhcmVzdHJlYW0uY29tLzVkNWJjMzdmZmNmNTRjOWI4MmU5OTY4MjNiZmZiYjgxL21hbmlmZXN0L3ZpZGVvLm0zdTg=.m3u8

Maybe the path contain ../../ ?

Thanks.

direct

master:

240p:

1st video segment:


proxied

master:
http://localhost:8080/aHR0cHM6Ly9jdXN0b21lci13aTlzY2tjczd1eHQ3bGg0LmNsb3VkZmxhcmVzdHJlYW0uY29tLzVkNWJjMzdmZmNmNTRjOWI4MmU5OTY4MjNiZmZiYjgxL21hbmlmZXN0L3ZpZGVvLm0zdTg=.m3u8

240p:
http://localhost:8080/aHR0cHM6Ly9jdXN0b21lci13aTlzY2tjczd1eHQ3bGg0LmNsb3VkZmxhcmVzdHJlYW0uY29tLzVkNWJjMzdmZmNmNTRjOWI4MmU5OTY4MjNiZmZiYjgxL21hbmlmZXN0L3N0cmVhbV90YTJkM2M1ZDU2YTlmODUzN2RhYTNiMmI3ZGRhYmQ1YjBfcjE1MjE4MzgwLm0zdTg=.m3u8

  console.log(
    atob('aHR0cHM6Ly9jdXN0b21lci13aTlzY2tjczd1eHQ3bGg0LmNsb3VkZmxhcmVzdHJlYW0uY29tLzVkNWJjMzdmZmNmNTRjOWI4MmU5OTY4MjNiZmZiYjgxL21hbmlmZXN0L3N0cmVhbV90YTJkM2M1ZDU2YTlmODUzN2RhYTNiMmI3ZGRhYmQ1YjBfcjE1MjE4MzgwLm0zdTg=')
  )
  // output: https://customer-wi9sckcs7uxt7lh4.cloudflarestream.com/5d5bc37ffcf54c9b82e996823bffbb81/manifest/stream_ta2d3c5d56a9f8537daa3b2b7ddabd5b0_r15218380.m3u8
  // OK

1st video segment:
http://localhost:8080/aHR0cHM6Ly9jdXN0b21lci13aTlzY2tjczd1eHQ3bGg0LmNsb3VkZmxhcmVzdHJlYW0uY29tLzVkNWJjMzdmZmNmNTRjOWI4MmU5OTY4MjNiZmZiYjgxL21hbmlmZXN0Ly4uLy4uLzVkNWJjMzdmZmNmNTRjOWI4MmU5OTY4MjNiZmZiYjgxL3ZpZGVvLzI0MC9zZWdfMS50cz9wPWV5SjBlWEJsSWpvaWRISmhibk50ZFhnaUxDSjJhV1JsYjBsRUlqb2lOV1ExWW1Nek4yWm1ZMlkxTkdNNVlqZ3laVGs1TmpneU0ySm1abUppT0RFaUxDSnZkMjVsY2tsRUlqb3pOakV6TXpBeExDSmpjbVZoZEc5eVNVUWlPaUlpTENKelpXZHRaVzUwUkhWeVlYUnBiMjVUWldOeklqbzBMQ0oxYzJWV1QwUlBWRVpGSWpwMGNuVmxMQ0ptY205dFRXVjZlbUZ1YVc1bElqcG1ZV3h6WlN3aWRISmhZMnNpT2lKaE1tUXpZelZrTlRaaE9XWTROVE0zWkdGaE0ySXlZamRrWkdGaVpEVmlNQ0lzSW5KbGJtUnBkR2x2YmlJNklqRTFNakU0TXpnd0lpd2liWFY0YVc1bklqb2lNekEwTVRReU56RWlmUSZzPXdvTENpY0s0dzRmQ244S2dhQkxEdTA3Q3ZHekRyMHpDaW1QRG1NS3l3N0RDaVMzQ29jS0RaY0szd3FkLVc4S1d3NFlJUEE=.ts

  console.log(
    atob('aHR0cHM6Ly9jdXN0b21lci13aTlzY2tjczd1eHQ3bGg0LmNsb3VkZmxhcmVzdHJlYW0uY29tLzVkNWJjMzdmZmNmNTRjOWI4MmU5OTY4MjNiZmZiYjgxL21hbmlmZXN0Ly4uLy4uLzVkNWJjMzdmZmNmNTRjOWI4MmU5OTY4MjNiZmZiYjgxL3ZpZGVvLzI0MC9zZWdfMS50cz9wPWV5SjBlWEJsSWpvaWRISmhibk50ZFhnaUxDSjJhV1JsYjBsRUlqb2lOV1ExWW1Nek4yWm1ZMlkxTkdNNVlqZ3laVGs1TmpneU0ySm1abUppT0RFaUxDSnZkMjVsY2tsRUlqb3pOakV6TXpBeExDSmpjbVZoZEc5eVNVUWlPaUlpTENKelpXZHRaVzUwUkhWeVlYUnBiMjVUWldOeklqbzBMQ0oxYzJWV1QwUlBWRVpGSWpwMGNuVmxMQ0ptY205dFRXVjZlbUZ1YVc1bElqcG1ZV3h6WlN3aWRISmhZMnNpT2lKaE1tUXpZelZrTlRaaE9XWTROVE0zWkdGaE0ySXlZamRrWkdGaVpEVmlNQ0lzSW5KbGJtUnBkR2x2YmlJNklqRTFNakU0TXpnd0lpd2liWFY0YVc1bklqb2lNekEwTVRReU56RWlmUSZzPXdvTENpY0s0dzRmQ244S2dhQkxEdTA3Q3ZHekRyMHpDaW1QRG1NS3l3N0RDaVMzQ29jS0RaY0szd3FkLVc4S1d3NFlJUEE=')
  )
  // output: https://customer-wi9sckcs7uxt7lh4.cloudflarestream.com/5d5bc37ffcf54c9b82e996823bffbb81/manifest/../../5d5bc37ffcf54c9b82e996823bffbb81/video/240/seg_1.ts?p=eyJ0eXBlIjoidHJhbnNtdXgiLCJ2aWRlb0lEIjoiNWQ1YmMzN2ZmY2Y1NGM5YjgyZTk5NjgyM2JmZmJiODEiLCJvd25lcklEIjozNjEzMzAxLCJjcmVhdG9ySUQiOiIiLCJzZWdtZW50RHVyYXRpb25TZWNzIjo0LCJ1c2VWT0RPVEZFIjp0cnVlLCJmcm9tTWV6emFuaW5lIjpmYWxzZSwidHJhY2siOiJhMmQzYzVkNTZhOWY4NTM3ZGFhM2IyYjdkZGFiZDViMCIsInJlbmRpdGlvbiI6IjE1MjE4MzgwIiwibXV4aW5nIjoiMzA0MTQyNzEifQ&s=woLCicK4w4fCn8KgaBLDu07CvGzDr0zCimPDmMKyw7DCiS3CocKDZcK3wqd-W8KWw4YIPA
  // resolves to: https://customer-wi9sckcs7uxt7lh4.cloudflarestream.com/5d5bc37ffcf54c9b82e996823bffbb81/video/240/seg_1.ts?p=eyJ0eXBlIjoidHJhbnNtdXgiLCJ2aWRlb0lEIjoiNWQ1YmMzN2ZmY2Y1NGM5YjgyZTk5NjgyM2JmZmJiODEiLCJvd25lcklEIjozNjEzMzAxLCJjcmVhdG9ySUQiOiIiLCJzZWdtZW50RHVyYXRpb25TZWNzIjo0LCJ1c2VWT0RPVEZFIjp0cnVlLCJmcm9tTWV6emFuaW5lIjpmYWxzZSwidHJhY2siOiJhMmQzYzVkNTZhOWY4NTM3ZGFhM2IyYjdkZGFiZDViMCIsInJlbmRpdGlvbiI6IjE1MjE4MzgwIiwibXV4aW5nIjoiMzA0MTQyNzEifQ&s=woLCicK4w4fCn8KgaBLDu07CvGzDr0zCimPDmMKyw7DCiS3CocKDZcK3wqd-W8KWw4YIPA
  // OK

but..
you're right..
if I request the 1st video segment through the proxy.. it responds with 404
so when it requests the URL with "../../" in its path.. it doesn't resolve it properly

hmm..
I'll definitely fix that

rather than fixing this here (in HLS-Proxy)..
I think I might fix it in the upstream "request" library..
TBD..

Thanks for you find out the problem.

all fixed..
you'll just need to reinstall HLS-Proxy from npm.

turned out that it was a bug in the 'request' library..
it did already contain logic to normalize the URL pathname..
but in doing so, it removed the querystring parameters from the URL path..
and this video host required those querystring params to serve the .ts video segments.

in any case..
this commit bumps the version of the library to '2.0.13'..
and it'll get pulled (as a dependency) with a fresh install.

Tested, it work fine.

very appreciate for your help !!