ffmpeg吧 关注:1,296贴子:4,691
  • 47回复贴,共1

fmpeg批量无损合并700个ts视频,快速实用

只看楼主收藏回复

在腾讯客户端上发现好的电影又想保留,下载后发现里面竟然是ts格式的而且分了近700个P!!!!
于是发现了万能的ffmpeg大法
#!/bin/sh
mkdir -p tsmov
#用find找出所有ts文件,当然mp4等其他格式也行,这里可以视情况而修改成*.mp4.然后把找到的符合规则的视频文件转移到tsmov文件夹下.
find -name "*.ts"| xargs -i mv {} tsmov
cd tsmov
#下面就是生成filelist.txt视频名字列表.注意我这里缓存视频文件是从0.ts到699.ts,如果你的缓存是其他名称可能还要批量改名字.我这里没写批量改名字的命令,因为我不需要.
each=0
#这个循环里面的数子694是需要手动修改的,如果缓存是899就改成你的缓存文件的实际数.
while(( $each <= 694 ))
do
echo file \'$each.ts\'
let "each++"
done > filelist.txt
#这才是ffmpeg最终执行的合并命令,上面的只是准备条件.
ffmpeg -f concat -i filelist.txt -c copy -bsf:a aac_adtstoasc output.mkv
保存为mege_video.sh 给这个脚本权限就能执行了


IP属地:山东1楼2018-07-16 21:39回复
    山东枣庄三线BGP机房,q291049739 有需要请咨询


    IP属地:山东2楼2018-08-27 16:44
    回复
      2025-06-09 16:50:24
      广告
      楼主…不是很懂…最后合并的是什么格式的?


      来自Android客户端3楼2018-12-10 09:19
      回复(10)
        好好


        来自Android客户端4楼2018-12-13 03:29
        回复
          牛笔


          来自Android客户端5楼2018-12-14 13:58
          回复
            666


            来自Android客户端6楼2018-12-14 13:58
            回复
              [concat @ 0000000000598080] Line 1: unknown keyword ''
              filelist.txt: Invalid data found when processing input
              这个提示是filelist。txt内容错误吗。。。请问具体一点的怎么操作


              8楼2019-05-06 15:28
              收起回复
                楼主,我是win10系统,有几百个ts文件排列好了,电脑里也有ffmpeg.exe
                如何使用啊 在DOS下敲命令copy /b这种合出来视频可能不能跳转播放,只能不快进从头看到尾


                IP属地:北京10楼2019-05-09 09:55
                收起回复
                  2025-06-09 16:44:24
                  广告
                  经本人多方查证,应楼主请求,现将Windows下通过FFmpeg合成多段视频的方法公布出来
                  视频目录下创建filelist.txt 文件
                  然后罗列文件列表file '001.ts' (可用excel循环)
                  形式如下:
                  file '001.ts'
                  file '002.ts'
                  ...
                  以上可以用DOS写入命令完成,不过网上代码%%a有些问题,这里层主用的excel复制粘贴到txt
                  然后在FFmpeg程序位置打开DOS窗口(设置了环境变量可以无视,更加方便)
                  输入命令ffmpeg -f concat -i filelist.txt -c copy output.mp4
                  官网说在concat后的 save 0 参数在当前多个ts目录下时可以不用,我就给去了


                  IP属地:北京11楼2019-05-13 11:45
                  收起回复
                    @echo off
                    cd /d "%~dp0"
                    setlocal enabledelayedexpansionecho logstart >"%~dp0log.txt"for /L %%j in (1,1,24) do (
                    cd /d "%~dp0"
                    if exist ".\ipt\%%j" (
                    cd /d ".\ipt\%%j"
                    call :rename1
                    echo %%j rename >>"%~dp0log.txt"
                    )
                    )for /L %%k in (1,1,24) do (
                    cd /d "%~dp0"
                    if exist ".\ipt\%%k" (
                    cd /d ".\ipt\%%k"
                    call :ecp1
                    call :ecp2
                    cd /d "%~dp0"
                    del "%~dp0stg1\*.ts"
                    del "%~dp0stg2\*.ts"
                    ren "%~dp0\output\tmp.mp4" %%k.mp4
                    echo %%k hevc >>"%~dp0log.txt"
                    if not exist "%~dp0output\%%k.mp4" (
                    cd /d "%~dp0"
                    cd /d ".\ipt\%%k"
                    call :ecp3
                    call :ecp2
                    cd /d "%~dp0"
                    del "%~dp0stg1\*.ts"
                    del "%~dp0stg2\*.ts"
                    ren "%~dp0output\tmp.mp4" %%k.mp4
                    echo %%k h264 >>"%~dp0log.txt"
                    )
                    )
                    )
                    pause
                    exit:ecp1
                    for /r "." %%i in (*.ts) do (
                    set "fn1=%%~ni"
                    %~dp0ffmpeg -i !fn1!.ts -vcodec copy -acodec copy -vbsf hevc_mp4toannexb %~dp0stg1\!fn1!.ts
                    )
                    goto :eof
                    pause:ecp2
                    cd /d "%~dp0"
                    copy /b "%~dp0stg1\*.ts" "%~dp0stg2\cbed.ts"
                    ffmpeg -i "%~dp0stg2\cbed.ts" -acodec copy -vcodec copy -absf aac_adtstoasc "%~dp0output\tmp.mp4"
                    goto :eof
                    pause:ecp3
                    for /r "." %%i in (*.ts) do (
                    set "fn1=%%~ni"
                    %~dp0ffmpeg -i !fn1!.ts -vcodec copy -acodec copy -vbsf h264_mp4toannexb %~dp0stg1\!fn1!.ts
                    )
                    goto :eof
                    pause:rename1
                    for /r "." %%i in (*.ts) do (
                    set "fn1=%%~ni"
                    set "con1=!fn1:~1,1!"
                    set "con2=!fn1:~-2,1!"
                    set "con3=!fn1:~2,1!"
                    set "con4=!fn1:~-3,1!"
                    if "!con1!"=="_" (
                    if "!con2!"=="_" (
                    ren "%%i" "00!fn1:~0,1!_00!fn1:~-1,1!.ts"
                    echo 00!fn1:~0,1!_00!fn1:~-1,1!.ts
                    ) else (
                    ren "%%i" "00!fn1:~0,1!_0!fn1:~-2,2!.ts"
                    echo 00!fn1:~0,1!_0!fn1:~-2,2!.ts
                    )
                    )
                    if "!con3!"=="_" (
                    if "!con2!"=="_" (
                    ren "%%i" "0!fn1:~0,2!_00!fn1:~-1,1!.ts"
                    echo 0!fn1:~0,2!_00!fn1:~-1,1!.ts
                    ) else (
                    ren "%%i" "0!fn1:~0,2!_0!fn1:~-2,2!.ts"
                    echo 0!fn1:~0,2!_0!fn1:~-2,2!.ts
                    )
                    )
                    echo !fn1!
                    )
                    goto :eof
                    pause
                    发个以前用copy /b 笨办法合并百度云的脚本=_=


                    IP属地:上海12楼2019-05-13 14:17
                    收起回复
                      @echo off
                      cd /d "%~dp0"
                      setlocal enabledelayedexpansion
                      for /L %%j in (1,1,24) do (
                      cd /d "%~dp0"
                      if exist ".\ipt\%%j" (
                      cd /d ".\ipt\%%j"
                      call :rename1
                      )
                      )for /L %%k in (1,1,24) do (
                      cd /d "%~dp0"
                      if exist ".\ipt\%%k" (
                      cd /d ".\ipt\%%k"
                      call :lstf1
                      call :ecp4
                      cd /d "%~dp0"
                      ren "%~dp0\output\tmp.mp4" %%k.mp4
                      )
                      )
                      pause
                      exit
                      :rename1
                      for /r "." %%i in (*.ts) do (
                      set "fn1=%%~ni"
                      set "con1=!fn1:~1,1!"
                      set "con2=!fn1:~-2,1!"
                      set "con3=!fn1:~2,1!"
                      set "con4=!fn1:~-3,1!"
                      if "!con1!"=="_" (
                      if "!con2!"=="_" (
                      ren "%%i" "00!fn1:~0,1!_00!fn1:~-1,1!.ts"
                      echo 00!fn1:~0,1!_00!fn1:~-1,1!.ts
                      ) else (
                      ren "%%i" "00!fn1:~0,1!_0!fn1:~-2,2!.ts"
                      echo 00!fn1:~0,1!_0!fn1:~-2,2!.ts
                      )
                      )
                      if "!con3!"=="_" (
                      if "!con2!"=="_" (
                      ren "%%i" "0!fn1:~0,2!_00!fn1:~-1,1!.ts"
                      echo 0!fn1:~0,2!_00!fn1:~-1,1!.ts
                      ) else (
                      ren "%%i" "0!fn1:~0,2!_0!fn1:~-2,2!.ts"
                      echo 0!fn1:~0,2!_0!fn1:~-2,2!.ts
                      )
                      )
                      echo !fn1!
                      )
                      goto :eof
                      pause
                      :lstf1
                      if not exist "list.txt" (
                      for /r "." %%m in (*.ts) do (
                      echo file %%~nm.ts >> list.txt
                      )
                      )
                      goto :eof
                      pause:ecp4
                      %~dp0ffmpeg -f concat -i list.txt -c copy "%~dp0output\tmp.mp4"
                      goto :eof
                      pause
                      改成直接ffpmpeg了,这下效率高得多了=_=


                      IP属地:上海13楼2019-05-14 12:50
                      收起回复
                        可不用生成filelist列表,腾讯视频缓存的ts文件夹中,有一个.m3u8的文件,本身就是ts播放列表
                        使用一个指令就可以合成:
                        ffmpeg -i .m3u8 -c copy new.mp4
                        注:
                        1、此方法仅适用未加密的ts文件,即ts可以用播放器正常播放
                        2、待合并的所有.ts文件与.m3u8文件放在同一目录下
                        3、m3u8文件中不能有ts文件的绝对路径,可用记事本编辑删除绝对路径,列表参考:
                        #EXTM3U
                        #EXT-X-VERSION:3
                        #EXT-X-MEDIA-SEQUENCE:0
                        #EXT-X-TARGETDURATION:15
                        #EXT-X-PLAYLIST-TYPE:VOD
                        #EXTINF:12.440,
                        0.ts
                        #EXTINF:12.000,
                        1.ts
                        #EXTINF:12.080,
                        2.ts
                        #EXT-X-ENDLIST


                        IP属地:北京15楼2019-09-20 13:22
                        收起回复
                          网易云课堂搜索ffmpeg小哥,专门讲解m3u8,包括加密模式。


                          16楼2019-09-20 15:13
                          回复
                            复制这段内容后打开百度网盘App,操作更方便哦。链接:网页链接提取码:k07x


                            IP属地:山东来自Android客户端17楼2020-11-14 17:11
                            回复