Why do we need to play at the bottom
The headline in the official documentation for your player features of these points is introduced, which specifically mentioned “side bottom sowing” function, side bottom sowing core purpose is to: provide video broadcast by a player to download the video options, repeat when play the video can play local video files directly, to reduce network traffic, increase stability.
Broadcast network video is the process of the need to pull the video data, then the decapsulation, decoding, and then apply colours to a drawing gives sound and pictures, you first need is the process of network request, edge below information is in the heart of the network request process request down to the local data storage, and so the next time watching video, don’t repeat request is pulled to the local data, It saves traffic and speeds up playback.
The following is the ali Cloud player side below the introduction:
Three advantages of side-seeding:
- 1. Convenient customization and optimization
- 2. Save traffic and open twice quickly
- 3. Stabilize provincial resources
1. Convenient customization and optimization
Normal use player developers may not very familiar with process of the player, they usually just want to have a function of player SDK, but a lot of players the optimization of the network layer is too complex, because the network request is usually a child module of the player, so if I want to optimize network request, need to change the player source code, This is too much of a challenge for the average developer. For example, IF I use the ExoPlayer player, network requests are placed in the DataSource module
The DataSource module is deeply embedded in the ExoPlayer source code. If it’s really too difficult for the average developer to change it, can we take the network module out of the DataSource, separate it from exoPlayer, and optimize the network module on top of exoPlayer?
The answer is yes, with local proxies.
The player acts as the client. A local proxy server is set up between the client and the video source server. The server takes over the requests sent by the client to the server and forwards the data returned by the server to the client.
The benefits of this are:
- The network module of the player is completely independent from the player. If we want to customize the network layer later, for example, I want to reuse links, DNS optimization, independent proxy, etc., there is no need to modify the internal source code of the player.
2. Save traffic and open twice quickly
Play the video itself will request video data, these video data are the request down, will directly start decapsulation, decoding, and rendering process, it doesn’t have to be preserved, play the video again, these processes still need to go again, continue to send web request, if I have been to the local cache, to play this video I direct reading local files again, It’s obviously a lot faster, and it only needs one request, so it doesn’t consume traffic repeatedly.
3. Stabilize provincial resources
Stability saves resources, this is relative to the memory resources, after using edgedownplay, the memory resources will be less. In order to improve speed, we will adopt the way of preloading, the traditional way of preload will create multiple player instance, like trill usually preloaded 6 video, traditional way of preloading to create 6 player instance, after the player instance creation, also creates corresponding MediaCodec, MediaCodec resource is limited. If you create so many MediaCodec instances for no reason at all, it can cause all kinds of problems with ANR/NE/OOM etc.
Now, after using edgeplay, you can start preloading without the player, so that no matter how much video is preloaded, there will be no problem.
The idea of starting preloading without the player instance really saved us a lot of resources.
The pit was sown under the side
Having said all these good things, are there any pits or difficulties that need special explanation? Because these problems more or less affect the promotion and application of underseeding technology.
1. The structure of MP4
MP4 format video is a BOX nested structure, somewhat similar to the Russian dolls, the main structure is shown below:
The most important ones are MOOV and MDAT:
- moov
The box contains the metadata information of the file media. A “MOOv” is a Container box, and the specific content information is interpreted by the subboxes. Like File Type Box, this Box has only one and is contained only in the File layer. Typically, “MOOv” is followed by “FTYP.” Moov defines the data information contained in an MP4 file. The mooV is a container Atom that must contain at least one of the following three Atom tags: MVHD, CMOV, or RMRA. The MOOV is the header information of an MP4 video. Only by parsing the MOOV information can the MP4 video be completely recognized. Otherwise, the core data MDAT of MP4 cannot be analyzed
- mdat
This box is contained in the file layer, which can have multiple or none (when all media data is external file reference), and is used to store media data. Data is directly followed by the box Type field. For details about the data structure, refer to metadata (mainly described in the Sample Table).
The structure of MOOV is as follows, where MVHD is the header information of MOOV, in which other field information stored by this BOX is recorded.
For an MP4 video, it is impossible to play the MP4 video without parsing the MOOV header.
But there are some MP4 video structures in which the MOOV header information is at the end:
The MOOV is at the end of the MP4 video, which in this case can’t be played down, because the network request is only responsible for requesting the data, not parsing the MOOV header, so the data in this case is usually not recognized.
Now douyin and Kuaishou will both process MP4 video on the server ====> move MP4 MOOV before MDAT.
ffmpeg -i input.mp4 -movflags faststart output.mp4
Copy the code
2. What do I do after DRAGGING the progress bar
Playing a video has a common function, dragging a progress bar, and how to manage requests while dragging a progress bar is a big problem.
In the case where I started playing below, and I’ve already cached at cached_position, it’s sequentially cached, what do I do if the user drags the progress bar to a new position, which is beyond the current cacheD_position?
- 1. Continue caching along the cached_position sequence
- 2. As long as the progress bar in the current drag exceeds cached_position, the cache is not continued and subsequent data is purely network requests.
- 3. Drag the progress bar beyond cacheD_position to initiate a Range request from the new position
Compare the advantages and disadvantages of the three methods:
- Solution a:
Continuing down the cached_position sequence, the position where I drag the progress bar is so far away from the cached_position that if I drag the progress bar this way it will play very slowly, so scheme one will be killed.
- Scheme 2:
Scheme two of the approach is also possible, after dragging the progress bar will not card, but there are also problems, is unable to do the real side below play, can only be downloaded in order. At present the hot open source project on the network github.com/danikula/An… This is the scheme that was adopted
- Solution 3:
Solve the drag after the lag, also solved the order to download the problem. This is currently the best solution
The following is the main analysis of solution 3 how to solve the progress bar after dragging the cache management problem.
There are a number of possible scenarios for POS during drag
* pos
* |--------------| |-------------------| |-------------------|
*
* pos
* |--------------| |-------------------| |-------------------|
*
* pos
* |--------------| |-------------------| |-------------------|
*
* pos
* |--------------| |-------------------| |-------------------|
*
* pos
* |--------------| |-------------------| |-------------------|
*
* pos
* |--------------| |-------------------| |-------------------|
Copy the code
First, maintain a VideoRange data structure locally
public class VideoRange { private long mStart; Private long mEnd; // End of fragmentCopy the code
LinkedHashMap<Long, VideoRange> mVideoRangeMap mVideoRangeMap maintains a list of VideoRange, key is the starting position of VideoRange, value is the object of VideoRange, The mVideoRangeMap is arranged in key order.
If two VideoRange are partially overlapping, merge into a new VideoRange.
3. How to play M3U8 video while playing
It makes sense to play the whole video at the bottom, even if there are structural problems with MP4? But after all is a whole file, the Range request is relatively easy to get, M3U8 video how to do side play? Tiaotiao player, Aliyun Player, or many other players on the market that offer edge-to-bottom playback, all explicitly support MP4 videos only.But there are a lot of M3U8 videos on the Internet, and we can play M3U8 videos on the side.
An M3U8 video is a video composed of an M3U8 index file according to specific rules. The M3U8 index file manages many sharding video files. The M3U8 index file is essentially a text file. For example iqiyi.zuidameiju.com/20200227/12…
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-TARGETDURATION:7.0
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000000.ts
#EXTINF:6.255,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000001.ts
#EXTINF:3.753,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000002.ts
#EXTINF:2.919,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000003.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000004.ts
#EXTINF:5.421,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000005.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000006.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000007.ts
#EXTINF:1.9599,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000008.ts
#EXTINF:4.7121,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000009.ts
#EXTINF:6.1716,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000010.ts
#EXTINF:3.5862,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000011.ts
#EXTINF:0.7923,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000012.ts
#EXTINF:5.5878,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000013.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000014.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000015.ts
#EXTINF:2.6271,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000016.ts
#EXTINF:5.1291,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000017.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000018.ts
#EXTINF:4.2117,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000019.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000020.ts
#EXTINF:2.8356,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000021.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000022.ts
#EXTINF:6.0048,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000023.ts
#EXTINF:2.2935,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000024.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000025.ts
#EXTINF:4.3785,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000026.ts
#EXTINF:4.0032,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000027.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000028.ts
#EXTINF:4.6287,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000029.ts
#EXTINF:2.3352,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000030.ts
#EXTINF:3.2943,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000031.ts
#EXTINF:7.1724,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000032.ts
#EXTINF:2.2101,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000033.ts
#EXTINF:3.6279,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000034.ts
#EXTINF:2.9607,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000035.ts
#EXTINF:3.753,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000036.ts
#EXTINF:4.0032,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000037.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000038.ts
#EXTINF:5.5044,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000039.ts
#EXTINF:5.2959,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000040.ts
#EXTINF:0.5421,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000041.ts
#EXTINF:6.255,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000042.ts
#EXTINF:2.2518,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000043.ts
#EXTINF:5.004,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000044.ts
#EXTINF:2.502,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000045.ts
#EXTINF:4.5036,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000046.ts
#EXTINF:4.7955,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000047.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000048.ts
#EXTINF:4.5453,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000049.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000050.ts
#EXTINF:1.8348,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000051.ts
#EXTINF:4.0866,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000052.ts
#EXTINF:7.0473,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000053.ts
#EXTINF:4.0032,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000054.ts
#EXTINF:0.9591,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000055.ts
#EXTINF:6.2133,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000056.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000057.ts
#EXTINF:3.6696,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000058.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000059.ts
#EXTINF:1.8348,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000060.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000061.ts
#EXTINF:5.004,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000062.ts
#EXTINF:4.587,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000063.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000064.ts
#EXTINF:2.2935,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000065.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000066.ts
#EXTINF:1.0425,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000067.ts
#EXT-X-ENDLIST
Copy the code
M3U8 index file has many sharded videos, we parse the M3U8 file, but also request each sharded file, the player is through the index file to find the corresponding sharded file, and then unseal –> decode the separate files, finally achieve the purpose of playing M3U8 video. So we do M3U8 video playback, still can not leave the M3U8 index file, but need to do some changes to the index file:
- 1. Construct an M3U8 index file for the local agent
- 2. Initiate a request for M3U8 sharding files. How to maintain and manage this request will be discussed in the next section ** [whether the network request is placed on the client or local proxy server] **.
- 3. The Local Proxy server reads the downloaded fragment files and sends them to the player client.
M3U8 index file how to construct the local agent: build rule is: http://127.0.0.1:port/base64-info this port is the port of local agent, at the back of the base64 – info is according to certain rules combined data: we decode a look at the data: http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEy MDMwMDAwMDAudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8wLnRzJmplZmZtb255X3NlZyZ1bmtub3du decoding out as follows: Iqiyi.zuidameiju.com/20200227/12… We split several fields with a specific delimiter & Jeffmony_seg & so that the local Proxy server has more information to parse the current shard file.
The local agent M3U8 index file is built as follows:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-TARGETDURATION:7.0
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMDAudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8wLnRzJmplZmZtb255X3NlZyZ1bmtub3du
#EXTINF:6.255,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMDEudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8xLnRzJmplZmZtb255X3NlZyZ1bmtub3du
#EXTINF:3.753,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMDIudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8yLnRzJmplZmZtb255X3NlZyZ1bmtub3du
#EXTINF:2.919,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMDMudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8zLnRzJmplZmZtb255X3NlZyZ1bmtub3du
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMDQudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC80LnRzJmplZmZtb255X3NlZyZ1bmtub3du
#EXTINF:5.421,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMDUudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC81LnRzJmplZmZtb255X3NlZyZ1bmtub3du
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMDYudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC82LnRzJmplZmZtb255X3NlZyZ1bmtub3du
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMDcudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC83LnRzJmplZmZtb255X3NlZyZ1bmtub3du
#EXTINF:1.9599,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMDgudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC84LnRzJmplZmZtb255X3NlZyZ1bmtub3du
#EXTINF:4.7121,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMDkudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC85LnRzJmplZmZtb255X3NlZyZ1bmtub3du
#EXTINF:6.1716,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMTAudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8xMC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:3.5862,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMTEudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8xMS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:0.7923,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMTIudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8xMi50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:5.5878,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMTMudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8xMy50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMTQudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8xNC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMTUudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8xNS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:2.6271,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMTYudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8xNi50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:5.1291,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMTcudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8xNy50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMTgudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8xOC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.2117,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMTkudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8xOS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMjAudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8yMC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:2.8356,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMjEudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8yMS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMjIudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8yMi50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:6.0048,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMjMudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8yMy50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:2.2935,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMjQudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8yNC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMjUudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8yNS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.3785,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMjYudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8yNi50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.0032,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMjcudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8yNy50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMjgudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8yOC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.6287,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMjkudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8yOS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:2.3352,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMzAudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8zMC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:3.2943,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMzEudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8zMS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:7.1724,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMzIudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8zMi50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:2.2101,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMzMudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8zMy50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:3.6279,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMzQudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8zNC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:2.9607,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMzUudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8zNS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:3.753,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMzYudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8zNi50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.0032,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMzcudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8zNy50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMzgudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8zOC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:5.5044,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMzkudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8zOS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:5.2959,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNDAudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC80MC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:0.5421,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNDEudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC80MS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:6.255,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNDIudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC80Mi50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:2.2518,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNDMudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC80My50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:5.004,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNDQudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC80NC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:2.502,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNDUudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC80NS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.5036,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNDYudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC80Ni50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.7955,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNDcudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC80Ny50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNDgudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC80OC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.5453,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNDkudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC80OS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNTAudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC81MC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:1.8348,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNTEudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC81MS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.0866,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNTIudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC81Mi50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:7.0473,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNTMudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC81My50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.0032,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNTQudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC81NC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:0.9591,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNTUudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC81NS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:6.2133,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNTYudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC81Ni50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNTcudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC81Ny50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:3.6696,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNTgudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC81OC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNTkudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC81OS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:1.8348,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNjAudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC82MC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNjEudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC82MS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:5.004,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNjIudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC82Mi50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.587,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNjMudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC82My50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNjQudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC82NC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:2.2935,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNjUudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC82NS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNjYudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC82Ni50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:1.0425,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNjcudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC82Ny50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXT-X-ENDLIST
Copy the code
Here is an example of M3U8 video playing below:
4. Whether the network request is placed on the client or the Local proxy server
Network requests are placed on the client side and also on the local proxy server side, which is a bit odd. We didn’t say that the player is a client at the beginning, the purpose of using local proxy under playback is to separate the video network requests from the player, and now we’re talking about whether the network requests are placed on the client side. Isn’t that a bit of a contradiction?
In fact, there is no contradiction, the player is the client, but the client does not have to be the player. Let me show you the architecture of JeffVideoCache:Initiate request or put on the client side, not put on the server side, put on the client side what is good?
- 1. It is very convenient to maintain the data request of the client. It does not need to be driven to start the work, while the local Proxy server needs to be driven to start the work.
- 2. The flow control of the client is accurate, and it is very convenient to interact with the player interface.
- 3. Put in the client, request data and send data module separation, local proxy control is much more convenient.
How to use JeffVideoCache
Get into the bowl and make your comments so JeffVideoCache can make further improvements. Github.com/JeffMony/Je…