AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / ubuntu / Perguntas / 1342540
Accepted
Jags
Jags
Asked: 2021-06-04 12:45:40 +0800 CST2021-06-04 12:45:40 +0800 CST 2021-06-04 12:45:40 +0800 CST

Script Bash para executar o FFmpeg concat em arquivos MP4 em lotes de 5

  • 772

Eu gosto de criar um script Bash para concatenar arquivos MP4 usando o FFmpeg, em lotes de 5 arquivos por vez para um diretório com 100 arquivos MP4, para que depois fiquem 20 arquivos como:

001_005.mp4, 006_010.mp4 e assim por diante...

em vez de apenas 1 arquivo consistindo em todos os 100 arquivos.

Conteúdo de minhalista.txt:

file 001.mp4
file 002.mp4
file 003.mp4
file 004.mp4
file 005.mp4
............
file 099.mp4
file 100.mp4

Embora eu tenha encontrado um comando que funciona muito bem (a partir deste thread do StackOverflow ), ele criaria apenas 1 arquivo consistindo de todos os 100 arquivos.

#!/bin/bash

cd /home/admn/Downloads/MP4_Files;

# Create mylist.txt:
for f in *.mp4
do
    echo "file $f" >> mylist.txt
done;

# Concatenate files:
ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.mp4;

Então, como modifico o comando ffmpeg para que ele seja concatenado em lotes de 5 arquivos por vez.

Todos os arquivos têm exatamente a mesma resolução (1080p), codecs de áudio e vídeo.

SO: Ubuntu MATE 21.04

Versão do ffmpeg: 4.3.2-0+deb11u1ubuntu1

command-line
  • 3 3 respostas
  • 1391 Views

3 respostas

  • Voted
  1. Best Answer
    sudodus
    2021-06-05T11:29:34+08:002021-06-05T11:29:34+08:00

    Acho que o script a seguir funcionará.

    • Primeiro tente como está e verifique se parece fazer o que você deseja
    • Em seguida, remova echoda linha com ffmpegpara fazê-lo funcionar.

    Verifique se o conteúdo dos arquivos temporários xaa' ... xat` corresponde aos nomes (e conteúdo) dos arquivos de saída.

    #!/bin/bash
    
    > mylist.txt
    for f in *.mp4
    do
     echo "file '$f'" >> mylist.txt
    done
    
    < mylist.txt sort -t \' -n -k2 | split -l 5
    
    k=1
    for j in x*
    do
     inc=$(wc -l "$j" | cut -d ' ' -f 1)
     m=$(printf "%03d" $((k)))
     n=$(printf "%03d" $((k+inc-1)))
     name="${m}_${n}.mp4"
     echo ffmpeg -f concat -safe 0 -i "$j" -c copy "$name"
     k=$((k+5))
    done
    
    • 3
  2. Martin Thornton
    2021-06-05T11:56:14+08:002021-06-05T11:56:14+08:00

    Outra solução é usar loops aninhados.

    Enquanto houver arquivos restantes, o loop interno usa ${@:1:5}a próxima fatia de (até) 5 arquivos.

    #!/bin/bash
    cd /home/admn/Downloads/MP4_Files;
    
    shopt -s failglob
    set -- *.mp4
    while [[ $# -gt 0 ]]; do
        from=$(basename "$1" .mp4)
        for f in "${@:1:5}"; do
            #not essential in your case, but use @Q to quote/escape special characters
            echo "file ${f@Q}" >> mylist.txt
            shift
        done
        to=$(basename "$f" .mp4)
        ffmpeg -f concat -safe 0 -i mylist.txt -c copy "${from}_${to}.mp4"
        rm mylist.txt
    done
    
    • 1
  3. Akash Karnatak
    2021-06-05T12:14:19+08:002021-06-05T12:14:19+08:00

    Supondo que mylist.txtexista em seu diretório de trabalho atual, você pode fazer algo assim,

    LINES=$(cat mylist.txt | wc -l)
    BATCH_SIZE=5
    BATCHES=$(($LINES/$BATCH_SIZE))             
    
    for ((i=0;i<$BATCHES;i++))
    do
      cat mylist.txt | head -n $((($i+1)*$BATCH_SIZE)) | tail -n $BATCH_SIZE > slist.txt
      ffmpeg -f concat -safe 0 -i slist.txt -c copy $(($i*$BATCH_SIZE+1))_$((($i+1)*$BATCH_SIZE)).mp4
    done
    rm slist.txt
    
    • 0

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve