A melhor maneira de girar em lote 3000 vídeos h.264?


8

Eu tenho aproximadamente 3000 clipes de vídeo curtos, cada um com aproximadamente 3 segundos de duração. Eu preciso girar cada um deles 90 graus. Qual é a melhor maneira de fazer isso? Tenho assinatura da Adobe Creative Cloud, além de acesso a máquinas Windows e Mac. Procurando a solução mais fácil para automatizar / processar em lote a rotação de tantos vídeos.

Se você estava se perguntando - os vídeos fazem parte de um curso de e-learning sobre madeira serrada. O aluno vê cada vídeo selecionado aleatoriamente, que é apenas um pequeno clipe de um pedaço de madeira girando. Os vídeos foram filmados para que a madeira (2x4s, etc.) ficasse na horizontal. Mas agora o cliente quer que a madeira seja vertical nos clipes.


Somente rotação? Por exemplo, 1280x720 a 720x1280, certo?
P2or

Basta girar 90 graus no sentido horário (ou contra-horário - não importa para este projeto).
usar o seguinte comando

O contêiner dos seus arquivos de vídeo inclui metadados de 'orientação'?
Audionuma

Respostas:


9

Use ffmpege o filtro "transpose" como sugerido "ruim" . Por exemplo, se seus arquivos são mp4 e estão no diretório atual:

mkdir -p rotated
for f in *.mp4; do ffmpeg -i "$f" -vf transpose=2 -c:a copy -metadata:s:v rotate="" rotated/"$f"; done
  • O valor da transposição pode ser "1" ou "relógio" para rotação no sentido horário, "2" ou "relógio" para rotação no sentido anti-horário. Existem outros valores que também aplicarão um flip.

  • O áudio será copiado em fluxo para evitar recodificação desnecessária.

  • Os metadados de rotação do fluxo de vídeo são limpos neste exemplo. Caso contrário ffmpeg, ele será copiado da entrada para a saída, resultando em uma rotação incorreta para os jogadores que prestam atenção a esses metadados (alguns fazem e outros não).

Outro exemplo, mais detalhado e flexível, e que mantém o arquivo girado no mesmo diretório com um novo nome:

ext=mp4
for f in /some/dir/*.$ext; do
    new=${f/%.$ext/-rotated.$ext};
    ffmpeg -i "$f" -vf transpose=2 -c:a copy -metadata:s:v rotate="" "$new"
done

Sim! Eu deveria saber mais sobre bash script :)
p2or

1

Você especificou que está interessado em trabalhar em um grande número de vídeos. Se você possui uma máquina com vários núcleos e usa um forloop normal fornecido pelo seu shell, terá um de seus núcleos funcionando a quente, enquanto outros não fazem absolutamente nada. . Isto não é o ideal.

O que você deve fazer para esse trabalho está usando parallel, uma ferramenta que permite iniciar vários trabalhos ao mesmo tempo e pode fazer tudo o que um loop for pode, mas melhor.

Não vou escrever sobre todos os recursos desta ferramenta, mas vou me concentrar na sua tarefa específica.

Uma maneira de iniciar todos esses trabalhos seria:

parallel avconv -i "{}" -vf transpose=2 "{.}[rotated].mp4" ::: *.mp4

Aqui {}substitui cada nome de arquivo e {.}substitui o nome do arquivo sem uma extensão.

Vou sugerir que você inicie o número de trabalhos que tiver núcleos, tire um. O motivo disso é que seu sistema operacional continuará sendo utilizável, e isso poupará você, caso esteja usando a criptografia de disco rígido (que estará usando o poder de processamento para ler / gravar dados). Para fazer isso, basta adicionar --jobs -1à sua linha de comando e você limitará o número de trabalhos.

parallel --jobs -1 avconv -i "{}" -vf transpose=2 "{.}[rotated].mp4" ::: *.mp4

Lembre-se de que nenhuma saída será fornecida até que cada codificação seja concluída. Portanto, você não verá o quanto de cada vídeo é feito.


1

Com base nesta resposta, você pode usar ffmpeg com os seguintes comandos para girar um vídeo:

ffmpeg -i input -vf transpose=2 output

Para processar em lote uma pasta de filmes, você pode usar uma linguagem de programação de sua escolha e percorrer os arquivos. Eu usei linux com python 2.7+ aqui. Você só precisa editar o folder_moviescaminho path_to_ffmpege definir seu filme extension:

import os # import os module
import subprocess # import subprocess module

# set the path to your video folder
folder_movies = '/home/user/Desktop/test/'

# set ffmpeg path
path_to_ffmpeg = "/opt/ffmpeg/ffmpeg"

# set file extension
ext = ".mp4"

# collect all videos in folder_movies
movie_files = [f for f in os.listdir(folder_movies) if f.endswith(ext)] 

# iterate through the files
for i in movie_files:

    # setup correct filepath for mov's
    file_path = os.path.join(folder_movies,i)

    # generate new file path
    new_path = os.path.splitext(file_path)[0] + '_rotated_90' + ext

    # call ffmpeg with the correct arguments
    # command: ffmpeg -i input -vf transpose=2 output
    subprocess.call([path_to_ffmpeg, "-i",  file_path, "-vf", "transpose=2", "-c:a", "copy", new_path])

Posteriormente, sua pasta de filmes será semelhante a:

insira a descrição da imagem aqui

A vantagem de usar python é que o código é executado em várias plataformas . A única coisa que você precisa considerar são os caminhos para o diretório e o executável ffmpeg. Para executar isso em uma máquina Windows, você só precisa substituir os caminhos para algo como:

# folder_movies = '/home/user/Desktop/test/' # linux or osx
folder_movies = r'c:\some\directory\test'    # windows, the r is important
folder_movies = 'c:/some/directory\test'     # windows (alternative)

# path_to_ffmpeg = '/opt/ffmpeg/ffmpeg'            # linux or osx
path_to_ffmpeg = r'c:\Program Files\ffmpeg\ffmpeg' # windows, the r is important
path_to_ffmpeg = 'c:/Program Files/ffmpeg\ffmpeg'  # windows (alternative)

Nota: Não sou especialista em ffmpeg, talvez haja uma maneira de processar em lote diretamente com ele.


11
Você realmente não precisa de um script inteiro para isso. Isso pode ser feito diretamente na linha de comando do Mac ou Linux com algo como: mkdir -p rotated; for f in *.mp4; do ffmpeg -i "$f" -vf transpose=2 rotated/"$f"; done(supondo que seus arquivos de vídeo sejam .mp4 neste exemplo).
mivk

@mivk nice, por que não converter isso em uma resposta?
P2or

@mivk Como você está usando um loop for, é quase o mesmo. Para quem não usa linux ou osx, faz sentido usar python ou outra linguagem de script.
P2ou

@poor: bem, para aqueles usuários que não são nem no Linux nem no Mac, a tradução para o PowerShell é "deixado como um exercício para o leitor" ... :-)
mivk

@mivk hehe, sim, mas ninguém quer usá-lo;)
p2or
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.