Cara terbaik untuk memutar video 3000+ h.264?

8

Saya memiliki sekitar 3000 klip video pendek, masing-masing berdurasi sekitar 3 detik. Saya perlu memutar masing-masing 90 derajat. Apa cara terbaik untuk melakukan ini? Saya memiliki langganan Adobe Creative Cloud, serta akses ke mesin Windows dan Mac. Mencari solusi termudah untuk mengotomatisasi / proses batch rotasi begitu banyak video.

Jika Anda bertanya-tanya - video adalah bagian dari kursus e-learning tentang kayu. Pelajar melihat setiap video yang dipilih secara acak, yang hanya berupa klip pendek dari sepotong kayu yang berputar. Video direkam sehingga kayu (2x4d, dll) horisontal. Tetapi sekarang klien menginginkan kayu menjadi vertikal dalam klip.

pengguna172586
sumber
Hanya rotasi? Dari mis 1280x720 ke 720x1280 kan?
p2atau
Hanya rotasi 90 derajat searah jarum jam (atau counter cw - tidak masalah untuk proyek ini).
user172586
Apakah wadah file video Anda menyertakan metadata 'orientasi'?
audionuma

Jawaban:

9

Gunakan ffmpegdan filter "transpose" seperti yang disarankan "buruk" . Misalnya, jika file Anda mp4 dan berada di direktori saat ini:

mkdir -p rotated
for f in *.mp4; do ffmpeg -i "$f" -vf transpose=2 -c:a copy -metadata:s:v rotate="" rotated/"$f"; done
  • Nilai transpos dapat berupa "1" atau "jam" untuk rotasi searah jarum jam, "2" atau "cclock" untuk rotasi berlawanan arah jarum jam. Ada nilai-nilai lain yang juga akan berlaku flip.

  • Audio akan disalin streaming untuk menghindari pengkodean ulang yang tidak perlu.

  • Metadata rotasi aliran video dihapus dalam contoh ini. Kalau tidak, ffmpegakan menyalinnya dari input ke output yang menghasilkan rotasi yang salah untuk pemain yang memperhatikan metadata ini (ada yang melakukannya, dan ada yang tidak).

Contoh lain, lebih verbose dan fleksibel, dan yang menyimpan file yang diputar di direktori yang sama dengan nama baru:

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
mivk
sumber
Iya! Saya harus belajar lebih banyak tentang bash scripting :)
p2atau
1

Anda telah menentukan bahwa Anda tertarik untuk mengerjakan sejumlah besar video, jika Anda memiliki mesin multicore dan Anda akan menggunakan forloop normal yang disediakan oleh shell Anda, Anda akan memiliki salah satu core Anda menjadi panas, sementara yang lain tidak melakukan apa-apa . Ini tidak ideal.

Apa yang harus Anda lakukan untuk pekerjaan seperti itu adalah menggunakan parallel, alat yang memungkinkan Anda untuk memulai beberapa pekerjaan sekaligus, dan itu bisa melakukan segala sesuatu yang bisa dilakukan oleh for-loop, tetapi lebih baik.

Saya tidak akan menulis tentang semua fitur alat ini, tetapi akan berkonsentrasi pada tugas spesifik Anda.

Salah satu cara untuk memulai semua pekerjaan ini adalah:

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

Di sini {}menggantikan setiap nama file, dan {.}mengganti nama file tanpa ekstensi.

Saya akan menyarankan agar Anda memulai pekerjaan sebanyak yang Anda miliki, ambil satu. Alasannya adalah agar sistem operasi Anda akan tetap dapat digunakan, dan juga ini akan menyelamatkan Anda jika Anda menggunakan enkripsi harddisk (yang akan menggunakan daya pemrosesan untuk membaca / menulis data). Untuk melakukan ini cukup tambahkan --jobs -1ke baris perintah Anda, dan Anda akan membatasi jumlah pekerjaan.

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

Harap diingat bahwa tidak ada output yang akan diberikan sampai setiap encoding selesai. Jadi Anda tidak akan melihat seberapa banyak dari setiap video Anda dilakukan.

v010dya
sumber
1

Berdasarkan jawaban ini, Anda dapat menggunakan ffmpeg dengan perintah berikut untuk memutar video:

ffmpeg -i input -vf transpose=2 output

Untuk Batch memproses folder film Anda dapat menggunakan bahasa pemrograman pilihan Anda dan beralih melalui file. Saya sudah menggunakan linux dengan python 2.7+ di sini. Anda hanya perlu mengedit folder_moviesjalur, path_to_ffmpegdan mengatur film Anda 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])

Setelah itu folder film Anda akan terlihat seperti:

masukkan deskripsi gambar di sini

Keuntungan menggunakan python adalah bahwa kode menjalankan lintas platform . Satu-satunya hal yang perlu Anda pertimbangkan adalah path ke direktori dan ffmpeg dapat dieksekusi. Untuk menjalankan ini pada mesin windows Anda hanya perlu mengganti path ke sesuatu seperti:

# 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)

Catatan: Saya bukan ahli ffmpeg, mungkin ada cara untuk memprosesnya secara langsung.

p2atau
sumber
1
Anda tidak benar-benar membutuhkan naskah lengkap untuk ini. Ini dapat dilakukan secara langsung di Mac-Linux atau baris perintah dengan sesuatu seperti: mkdir -p rotated; for f in *.mp4; do ffmpeg -i "$f" -vf transpose=2 rotated/"$f"; done(dengan asumsi file video Anda .mp4 dalam contoh ini).
mivk
@mivk bagus, mengapa tidak mengubahnya menjadi jawaban?
p2atau
@mivk Karena Anda menggunakan for loop, hampir sama. Bagi mereka yang tidak menggunakan linux atau osx, masuk akal untuk menggunakan python atau bahasa scripting lainnya.
p2atau
@poor: yah, bagi para pengguna yang tidak di linux atau di mac, terjemahan ke dalam PowerShell adalah "dibiarkan sebagai latihan untuk pembaca" ... :-)
mivk
@mivk hehe, ya, tapi tidak ada yang mau menggunakannya;)
p2atau