Cortando o arquivo de vídeo em vários segmentos

4

Atualmente, estou usando o ffmpeg para fatiar arquivos de vídeo. Eu automatizei o processo através de um script chamado ffmpeg_split.sh. Embora isso seja muito lento, é eficiente dividir os vídeos em configurações equivalentes. O único problema é que ele tem problemas de taxa de quadros. Abaixo da sopa malvada recomendado uma maneira de fazer tudo isso usando segment no ffmpeg. Eu tentei isso, mas não me dá segmentos de duração equivalentes.

UPDATE

Por evilsoup usando este comando para segmentar vídeos:

ffmpeg -i input.mp4 -c copy -map 0 -segment_time 8 -f segment output%03d.mp4

OLD:

Aqui está a sintaxe para fatiar um vídeo com script: ffmpeg_split.sh -s test_vid.mp4 -o video-part%03d.mp4 -c 00:00:08

Resultados

my_split_script.sh

input.mp4 – Duration 00:01:20
#EXTINF:10,
Output01.mp4
#EXTINF:10,
Output02.mp4
#EXTINF:10,
Output03.mp4
#EXTINF:9,
Output04.mp4
#EXTINF:10,
Output05.mp4
#EXTINF:10,
Output06.mp4
#EXTINF:11,
Output07.mp4
#EXTINF:10,
Output08.mp4
real    0m30.517s #execution time

ffmpeg

input.mp4 – Duration 00:01:20
#EXTINF:10,
Output01.mp4
#EXTINF:10,
Output02.mp4
#EXTINF:6,
Output03.mp4
#EXTINF:10,
Output04.mp4
#EXTINF:10,
Output05.mp4
#EXTINF:7,
Output06.mp4
#EXTINF:10,
Output07.mp4
#EXTINF:9,
Output08.mp4
real    0m7.493s #executition time
    
por Code_Ed_Student 04.10.2014 / 16:10

2 respostas

7

Você pode fazer isso diretamente do ffmpeg sem o uso de um script. Essencialmente, sempre que você usar ffmpeg segment , ele irá em frente e fará o melhor para dividir perto do tempo especificado para cada segmento. Isso é baseado em key_frames , ele encontrará o quadro-chave mais próximo e cortará lá. Para cortar segmentos exatos, você precisará codificar todo o vídeo.

ffmpeg -i input.mp4 -c:v libx264 -crf 22 -map 0 -segment_time 9 -g 9 -sc_threshold 0 -force_key_frames "expr:gte(t,n_forced*9)" -f segment output%03d.mp4

Você precisará ler em -crf , -sc_threshold e -force_key_frames . Na wiki para ffmpeg .

    
por 12.10.2014 / 21:47
6

ffmpeg pode realmente fazer isso sozinho, usando o segmento muxer

ffmpeg -i input.mp4 -c copy -map 0 -segment_time 8 -f segment output%03d.mp4

Você deve definitivamente ler a documentação e brincar um pouco para obter os melhores resultados (o padrão será bom o suficiente para a maioria das finalidades, mas não resultará em uma divisão 100% precisa).

Em geral, se você precisar obter informações como a duração de um arquivo, é melhor usar ffprobe , que vem com ffmpeg - ele imprime as informações como um grupo de key=value pares, tornando muito mais fácil lidar com isso.

ffprobe -show_format file.mp4 | grep -F duration | cut -d= -f2
## or, if you want hh:mm:ss format:
ffprobe -show_format -sexagesimal file.mp4 | grep -F duration | cut -d= -f2

... mas, eu acho que provavelmente é melhor confiar nas opções do próprio ffmpeg , ao invés de um script de shell (que será muito menos eficiente, já que ele precisa chamar muitas instâncias de ffmpeg ).

    
por 04.10.2014 / 17:21