1

I Have This Files:

001.ts  014.ts  027.ts  040.ts  053.ts  066.ts  079.ts  092.ts  105.ts  118.ts  131.ts  144.ts  157.ts  170.ts  183.ts  196.ts  209.ts  222.ts  235.ts  248.ts  261.ts  274.ts  287.ts  300.ts  313.ts  326.ts
002.ts  015.ts  028.ts  041.ts  054.ts  067.ts  080.ts  093.ts  106.ts  119.ts  132.ts  145.ts  158.ts  171.ts  184.ts  197.ts  210.ts  223.ts  236.ts  249.ts  262.ts  275.ts  288.ts  301.ts  314.ts  327.ts
003.ts  016.ts  029.ts  042.ts  055.ts  068.ts  081.ts  094.ts  107.ts  120.ts  133.ts  146.ts  159.ts  172.ts  185.ts  198.ts  211.ts  224.ts  237.ts  250.ts  263.ts  276.ts  289.ts  302.ts  315.ts  328.ts
004.ts  017.ts  030.ts  043.ts  056.ts  069.ts  082.ts  095.ts  108.ts  121.ts  134.ts  147.ts  160.ts  173.ts  186.ts  199.ts  212.ts  225.ts  238.ts  251.ts  264.ts  277.ts  290.ts  303.ts  316.ts  329.ts
005.ts  018.ts  031.ts  044.ts  057.ts  070.ts  083.ts  096.ts  109.ts  122.ts  135.ts  148.ts  161.ts  174.ts  187.ts  200.ts  213.ts  226.ts  239.ts  252.ts  265.ts  278.ts  291.ts  304.ts  317.ts  330.ts
006.ts  019.ts  032.ts  045.ts  058.ts  071.ts  084.ts  097.ts  110.ts  123.ts  136.ts  149.ts  162.ts  175.ts  188.ts  201.ts  214.ts  227.ts  240.ts  253.ts  266.ts  279.ts  292.ts  305.ts  318.ts  331.ts
007.ts  020.ts  033.ts  046.ts  059.ts  072.ts  085.ts  098.ts  111.ts  124.ts  137.ts  150.ts  163.ts  176.ts  189.ts  202.ts  215.ts  228.ts  241.ts  254.ts  267.ts  280.ts  293.ts  306.ts  319.ts  332.ts
008.ts  021.ts  034.ts  047.ts  060.ts  073.ts  086.ts  099.ts  112.ts  125.ts  138.ts  151.ts  164.ts  177.ts  190.ts  203.ts  216.ts  229.ts  242.ts  255.ts  268.ts  281.ts  294.ts  307.ts  320.ts  333.ts
009.ts  022.ts  035.ts  048.ts  061.ts  074.ts  087.ts  100.ts  113.ts  126.ts  139.ts  152.ts  165.ts  178.ts  191.ts  204.ts  217.ts  230.ts  243.ts  256.ts  269.ts  282.ts  295.ts  308.ts  321.ts  334.ts
010.ts  023.ts  036.ts  049.ts  062.ts  075.ts  088.ts  101.ts  114.ts  127.ts  140.ts  153.ts  166.ts  179.ts  192.ts  205.ts  218.ts  231.ts  244.ts  257.ts  270.ts  283.ts  296.ts  309.ts  322.ts
011.ts  024.ts  037.ts  050.ts  063.ts  076.ts  089.ts  102.ts  115.ts  128.ts  141.ts  154.ts  167.ts  180.ts  193.ts  206.ts  219.ts  232.ts  245.ts  258.ts  271.ts  284.ts  297.ts  310.ts  323.ts
012.ts  025.ts  038.ts  051.ts  064.ts  077.ts  090.ts  103.ts  116.ts  129.ts  142.ts  155.ts  168.ts  181.ts  194.ts  207.ts  220.ts  233.ts  246.ts  259.ts  272.ts  285.ts  298.ts  311.ts  324.ts
013.ts  026.ts  039.ts  052.ts  065.ts  078.ts  091.ts  104.ts  117.ts  130.ts  143.ts  156.ts  169.ts  182.ts  195.ts  208.ts  221.ts  234.ts  247.ts  260.ts  273.ts  286.ts  299.ts  312.ts  325.ts

That I Downloaded With This Python Program (m3u8 File Does Not Work!):

import requests
import shutil
import os
import subprocess


def strip_end(text, suffix):
    if not text.endswith(suffix):
        return text
    return text[:len(text)-len(suffix)]


def download_file(url):
    cwd = os.getcwd()
    command = f"wget -O {cwd}/ts_files/{url.split('/')[-1]} {url}"
    subprocess.call(command, shell=True)


base_url = "https://stream.example.com/video/2021/example/720p_{}.ts"

if not os.path.exists('ts_files'):
    print('ts_file folder is not found, creating the folder.')
    os.makedirs('ts_files')

i = 1
while True:
    if len(str(i)) == 1:
        num = f"00{i}"
    elif len(str(i)) == 2:
        num = f"0{i}"
    else:
        num = str(i)
    url = base_url.replace("{}", num)
    r = requests.get(url, stream=True)
    print(f'downloading {i}')
    if r.status_code != 404:
        download_file(url)  # comment out this line to download ts files.
    else:
        print("404")
        break
    i = i+1

cwd = os.getcwd()  # Get the current working directory (cwd)
TS_DIR = 'ts_files'
with open('merged.ts', 'wb') as merged:
    for ts_file in os.listdir(f'{cwd}/{TS_DIR}'):
        with open(f'{cwd}/{TS_DIR}/{ts_file}', 'rb') as mergefile:
            shutil.copyfileobj(mergefile, merged)

My Problem Is When I Want To Convert All This Files To One .ts File And Then An MP4 File With ffmpeg, I Get An Error:

nima@funlife:~/ts_files$ cat ./*.ts > all.ts
nima@funlife:~/ts_files$ ffmpeg -i all.ts -acodec copy -vcodec copy all.mp4
ffmpeg version 5.0.1-3+b1 Copyright (c) 2000-2022 the FFmpeg developers
  built with gcc 11 (Debian 11.3.0-4)
  configuration: --prefix=/usr --extra-version=3+b1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librist --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --disable-sndio --enable-pocketsphinx --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libplacebo --enable-libx264 --enable-shared
  libavutil      57. 17.100 / 57. 17.100
  libavcodec     59. 18.100 / 59. 18.100
  libavformat    59. 16.100 / 59. 16.100
  libavdevice    59.  4.100 / 59.  4.100
  libavfilter     8. 24.100 /  8. 24.100
  libswscale      6.  4.100 /  6.  4.100
  libswresample   4.  3.100 /  4.  3.100
  libpostproc    56.  3.100 / 56.  3.100
all.ts: Invalid data found when processing input

.ts Files Content Is Like This:

 }��,.g���}��
             �����c����Ww�c���c���eo��m�����ŧ�  䱉
�b(+��D�FG�zPe��7�&#bz�1ɶ���                      C
�`,��>Ϲc4J��̀��T�I}�"��ކ�R�1��w͋�   "� <�#B`ƪ�̸�co
                                             �9���+��W�
P���N���w��T\5g��
\�E�N�E�v��͑4f��U�@]�ΩX�U�x�E��bwm=ְ�iA�����p���M�����\=�_�I3C�hL�h����0)�ο��*��`���eZ� �ؗ4To�0V��S,�+�>�8_]�W�lNJD�|7e�2s�1X)̃5�0h�������~8ߩg���?e��EK�>۷�L
             ��:6|������>\  �N�WW��,�w
bk��1?*��/��/�5��k����~��                 Lޕ}�a���2�{��l��$�d=����g�{a2��L�����
                         jҫַ��ʿ�"1`ZZ.he)�=�x��E_4:Vg�����H=���x1�����}��W::y�

Are They Encrypted Or Something? I'm Trying To Do This Works With Debian 11.3.0-4, Python 3.10.5

Edit: Thanks Johnny, I Saw This Post: How to concatenate two MP4 files using FFmpeg? I Tried But I Get An Error Again!

nima@funlife:~/ts_files$ ffmpeg -f concat -i file.txt -c copy output.ts
ffmpeg version 5.0.1-3+b1 Copyright (c) 2000-2022 the FFmpeg developers
  built with gcc 11 (Debian 11.3.0-4)
  configuration: --prefix=/usr --extra-version=3+b1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librist --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --disable-sndio --enable-pocketsphinx --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libplacebo --enable-libx264 --enable-shared
  libavutil      57. 17.100 / 57. 17.100
  libavcodec     59. 18.100 / 59. 18.100
  libavformat    59. 16.100 / 59. 16.100
  libavdevice    59.  4.100 / 59.  4.100
  libavfilter     8. 24.100 /  8. 24.100
  libswscale      6.  4.100 /  6.  4.100
  libswresample   4.  3.100 /  4.  3.100
  libpostproc    56.  3.100 / 56.  3.100
[concat @ 0x55932dbf2500] Impossible to open '001.ts'
file.txt: Invalid data found when processing input

Same Error With ffmpeg -f concat -safe 0 -i file.txt -c copy output.ts

file.txt is The List Of Files!

smartnima
  • 35
  • 8
  • 1
    Your question is already answered here: https://stackoverflow.com/questions/7333232/how-to-concatenate-two-mp4-files-using-ffmpeg Don't do that: cat ./*.ts > all.ts – johnny b Jul 28 '22 at 13:00
  • For kind of "sanity check", you may create synthetic video segments using shell command: `ffmpeg -f lavfi -i testsrc=size=192x108:rate=1:duration=100 -vcodec libx264 -g 10 -f segment -segment_time 10 -segment_list list.txt -segment_list_type ffconcat %03d.ts`. Then concatenate and convert to MP4: `ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4` – Rotem Jul 28 '22 at 15:45
  • It Worked! But I Don't Know It's Not Working With My Files! – smartnima Jul 28 '22 at 15:50
  • Could you post the .m3u8 file? – zzwei Jul 31 '22 at 16:51
  • I don't have it. – smartnima Aug 01 '22 at 18:36

2 Answers2

0
  1. .ts file is not a plain text file, so you can’t see anything when open it with vim.
  2. You can check the m3u8 file, if there is a license url, if yes, the .ts is encrypted. Also you can try to open the ts file with a media player, like VLC, it is playable if not encrypted.
zzwei
  • 81
  • 5
0

Use this command:

ffmpeg -i downloaded.m3u8 -acodec copy -bsf:a aac_adtstoasc -vcodec copy Output.mp4

If u can get the m3u8 file by:

  1. Trying to find it again through the url (if u have it) by replacing001.ts to index.m3u8
    E.g.(https://stream.example.com/video/2021/example/index.m3u8)
  2. Make your own m3u8 file:
    An example of an m3u8 file:
    #EXTM3U
    #EXT-X-TARGETDURATION:13
    #EXT-X-ALLOW-CACHE:YES
    #EXT-X-PLAYLIST-TYPE:VOD
    #EXT-X-VERSION:3
    #EXT-X-MEDIA-SEQUENCE:1
    #EXTINF:4.171,
    seg-1-v1-a1.ts
    #EXTINF:3.295,
    seg-2-v1-a1.ts
    #EXTINF:2.211,
    seg-3-v1-a1.ts
    #EXTINF:6.006,
    seg-4-v1-a1.ts
    ...
    #EXT-X-ENDLIST
    
    The numbers after #EXTINF: is basically the length of the .ts file in seconds.
    The numbers after EXT-X-TARGETDURATION specifies a maximum duration for the segments in the playlist. The actual duration specified by EXTINF may be less so change this value if necessary.
    Thus, a very simple script can be written.
    1. Move all of your .ts files to a folder
    2. Make a .py file and try this:
    import os
    import subprocess
    m3u8File = """#EXTM3U
    #EXT-X-TARGETDURATION:13
    #EXT-X-ALLOW-CACHE:YES
    #EXT-X-PLAYLIST-TYPE:VOD
    #EXT-X-VERSION:3
    #EXT-X-MEDIA-SEQUENCE:1
    """
    tsPath = "./tsFiles"
    tsFiles = next(os.walk(tsPath), (None, None, []))[2]
    for ts in tsFiles:
        length = subprocess.check_output(['ffprobe', '-i', ts, '-show_entries', 'format=duration', '-v', 'quiet', '-of', 'csv="p=0"'])
        m3u8File += "#EXTINF:"+length+",\n"
        m3u8File += ts + "\n"
    m3u8File += "#EXT-X-ENDLIST"
    with open("output.m3u8",'wb') as output:
        output.write(m3u8File)
        output.close()
    
    I haven't tested the code above, but I trust that you will be able to debug it yourself, also I've never used subprocess.checkOutput() before so I'm not sure if it will run properly. But anyway, make sure you have ffmpeg binary folder added to Path environmental variable, otherwise the ffprobe command won't work. ffprobe should come with ffmpeg. Let me know if it works along with the error message if it doesn't.

Please Accept this answer if it helped you. Thanks!
References:

  1. Live playlist, must #EXT-X-TARGETDURATION and #EXTINF be equal?
  2. How to extract duration time from ffmpeg output?
  3. How do I list all files of a directory?
  4. Running shell command and capturing the output

Spelling and grammar corrected by Microsoft Editor ;)

AzlanCoding
  • 209
  • 2
  • 11