Bagaimana cara membagi video panjang menjadi beberapa video pendek lebih efisien?

0

Menggunakan ffmpeg, saya dapat menentukan waktu mulai dan durasi setiap segmen. Misalnya saya aja

ffmpeg -i "originalvideo.mp4" -ss 00:00 -t 2:34 -vcodec copy -acodec copy "smallervideo1.mp4"

Saya memiliki spreadsheet di mana saya memiliki 3 kolom; nama video yang lebih kecil, waktu mulai dan waktu selesai. Saya dapat membuat setiap perintah secara terpisah untuk setiap video tetapi itu akan memakan waktu karena saya membagi file sumber menjadi hampir 100 video yang lebih kecil.

Apakah ada metode di mana saya bisa meneruskan nilai dari spreadsheet ke ffmpeg dan mengeluarkan setiap video dengan nama yang sesuai secara otomatis?

Michael Horwitz
sumber

Jawaban:

1

Ini dapat dilakukan dengan skrip shell sederhana, dalam hal ini skrip Bash. Jika Anda memiliki file yang dibatasi spasi sebagai input, yang berisi nama file output, cap waktu mulai dan cap waktu akhir, misalnya:

$ cat cuts.txt
foo.mp4 00:00:00 00:00:01
bar.mp4 00:01:20 00:02:00

Kemudian baca ini dengan loop sederhana dan buat perintah ffmpeg Anda:

while read -r filename start end; do
  ffmpeg -i "input.mp4" -ss "$start" -to "$end" -c copy "$filename"
done < cuts.txt

Ini hanya memotong bitstream tanpa pengkodean - -c copyadalah singkatan untuk -vcodec copy -acodec copy(dan juga menyalin subtitle). Anda dapat menentukan encoder video (mis. -c:v libx264) Dan encoder audio (mis., -c:a aac -b:a 192k) Untuk menyandikan ulang video.

Versi yang lebih portabel namun sederhana dengan Python 3:

#!/usr/bin/env python3
import subprocess
with open("cuts.txt") as f:
  for line in f.readlines():
    filename, start, end = line.strip().split(' ')
    cmd = ["ffmpeg", "-i", "input.mp4", "-ss", start, "-to", end, "-c", "copy", filename]
    subprocess.run(cmd, stderr=subprocess.STDOUT)

Catatan: Jika Anda menjalankan ini pada Windows, Anda harus menambahkan ffmpeg ke PATH Anda, atau tentukan path lengkapnya seperti C:/Program Files/ffmpeg/bin/ffmpeg.exe.

slhck
sumber
Terima kasih @slhck. Saya memiliki spreadsheet tetapi saya menganggap saya bisa memasukkannya ke dalam format itu dengan mudah. Saya akan mencoba ini.
Michael Horwitz
Anda hanya dapat mengekspornya ke CSV dari Excel, misalnya, tetapi menggunakan satu spasi sebagai pembatas. Atau jika Anda memiliki koma sebagai pembatas, gunakan while read -r -d, filename start end …untuk menentukan pembatas lain. (Gunakan .split(',')dalam Python dalam kasus itu.)
slhck
karena saya menggunakan Windows saya pergi dengan pendekatan Python. Saya macet dan saya tidak yakin apa masalahnya. Kode saya adalah import subprocess with open("cuts3.txt") as f: for line in f.readlines(): filename, start, end = line.strip().split(' ') cmd = 'C:\ffmpeg\bin\ffmpeg.exe -i Recordings\recording6.6.17.mp4 -ss {start} -to {end} -c copy "{filename}"'.format(**locals()) subprocess.run(cmd, shell=True) print ("loop over")File txt adalahGreetings.mp4 0:00:00 0:02:35 Introduction.mp4 0:02:35 0:05:10
Michael Horwitz
@MichaelHorwitz Komentar tidak terlalu berguna untuk pemecahan masalah semacam ini ... pemformatan kode blok tidak berfungsi di sana. Tetapi apakah Anda mendapatkan pesan kesalahan? Perhatikan bahwa untuk Windows Anda harus menggunakan garis miring untuk menjalankan perintah.
slhck
Lihat hasil edit saya di atas, mungkin ini bekerja lebih baik untuk Anda.
slhck