Saya punya daftar .ts
file:
out1.ts ... out749.ts out8159.ts out8818.ts
Bagaimana saya bisa mendapatkan total durasi (waktu berjalan) dari semua file ini?
shell-script
video
k961
sumber
sumber
Jawaban:
Saya tidak punya di
.ts
sini tetapi ini berfungsi untuk.mp4
. Gunakanffprobe
(bagian dariffmpeg
) untuk mendapatkan waktu dalam detik, misalnya:jadi untuk semua
.mp4
file dalam direktori saat ini:lalu gunakan
paste
untuk meneruskan output kebc
dan mendapatkan total waktu dalam detik:Jadi, untuk
.ts
file Anda dapat mencoba:Alat lain yang berfungsi untuk file video yang saya miliki di sini adalah
exiftool
, misalnya:Total panjang untuk semua
.mp4
file di direktori saat ini:Anda juga dapat menyalurkan output ke perintah lain untuk mengonversi total menjadi
DD:HH:MM:SS
, lihat jawaban di sini .Atau gunakan
exiftool
internalConvertDuration
untuk itu (Anda memerlukan versi yang relatif baru):sumber
ffprobe
sebelumnya.paste
danbc
! jauh lebih bersih daripada denganawk
katakanlah.bc
akan melakukan presisi yang sewenang-wenang, satu kelemahannya adalah apakah...| paste -sd+ - | bc
akan mencapai batas ukuran garis di beberapabc
implementasi (misalnyaseq 429 | paste -sd+ - | bc
gagal dengan OpenSolarisbc
) atau memiliki potensi untuk menggunakan semua memori pada yang lain.avprobe
di Arch repo (prolly karena bertentangan denganffmpeg
) jadi tidak bisa mencobanya ATM tetapi apakah itu memberi Anda durasi file jika Anda menjalankannya seperti ini:avprobe -show_format_entry duration myfile.mp4
atauavprobe -loglevel quiet -show_format_entry duration myfile.mp4
? Saya pikir salah satu dari perintah ini harus memberi Anda satu baris output dengan durasi file. Namun tidak yakin.Ini menggunakan
ffmpeg
dan mencetak waktu habis dalam total detik:Penjelasan:
for f in *.ts; do
iterates setiap file yang berakhiran ".ts"ffmpeg -i "$f" 2>&1
pengalihan output ke stderrgrep "Duration" | grep -o " [0-9:.]*, " | head -n1 | tr ',' ' '
mengisolasi waktuawk -F: '{ print ($1 * 3600) + ($2 * 60) + $3 }'
Mengubah waktu menjadi detiktimes+=("$_t")
menambahkan detik ke arrayecho "${times[@]}" | sed 's/ /+/g' | bc
memperluas masing-masing argumen dan mengganti spasi dan menyalurkannya kebc
kalkulator linux yang umumsumber
Merampingkan jawaban @ jmunsch , dan menggunakan
paste
Saya baru belajar dari jawaban @ slm , Anda bisa berakhir dengan sesuatu seperti ini:Seperti yang dilakukan jmunsch, saya menggunakan
ffmpeg
untuk mencetak durasinya, mengabaikan kesalahan tentang file output yang hilang dan mencari output error untuk garis durasi. Saya memohonffmpeg
dengan semua aspek lokal yang dipaksa ke lokal C standar, sehingga saya tidak perlu khawatir tentang pesan output lokal.Selanjutnya saya menggunakan satu
awk
bukan miliknyagrep | grep | head | tr | awk
. Ituawk
doa mencari garis (mudah-mudahan unik) mengandungDuration:
. Menggunakan titik dua sebagai pemisah, label itu adalah bidang 1, jamnya adalah bidang 2, menit yang diajukan 3 dan bidang detik 4. Tanda koma setelah detik tampaknya tidak mengganggu sayaawk
, tetapi jika seseorang memiliki masalah di sana, ia dapat termasuktr -d ,
dalam jalur pipa antaraffmpeg
danawk
.Sekarang bagian dari slm: Saya menggunakan
paste
untuk mengganti baris baru dengan tanda tambah, tetapi tanpa mempengaruhi baris baru (bertentangan dengan yangtr \\n +
saya miliki di versi sebelumnya dari jawaban ini). Itu memberikan ekspresi jumlah yang dapat diumpankanbc
.Terinspirasi oleh ide slm tentang penggunaan
date
untuk menangani format seperti waktu, berikut adalah versi yang menggunakannya untuk memformat detik yang dihasilkan sebagai hari, jam, menit, dan detik dengan bagian pecahan:Bagian dalam
$(…)
persis seperti sebelumnya. Menggunakan@
karakter sebagai indikasi, kami menggunakan ini sebagai jumlah detik sejak 1 Januari 1970. "Tanggal" yang dihasilkan akan diformat sebagai hari dalam setahun, waktu dan nanodetik. Sejak hari itu tahun kita mengurangi satu, karena input nol detik sudah mengarah ke hari 1 tahun itu tahun 1970. Saya tidak berpikir ada cara untuk mendapatkan hari dalam hitungan tahun mulai dari nol.Final
sed
menyingkirkan nol tambahan trailing. TheTZ
Pengaturan mudah-mudahan harus memaksa penggunaan UTC, sehingga daylight saving time tidak akan mengganggu benar-benar koleksi video besar. Jika Anda memiliki video lebih dari satu tahun, pendekatan ini tetap tidak akan berhasil.sumber
Saya tidak terbiasa dengan
.ts
ekstensi, tetapi dengan asumsi mereka adalah beberapa jenis file video yang dapat Anda gunakanffmpeg
untuk mengidentifikasi durasi file seperti:Kami kemudian dapat membagi output ini ke atas, memilih hanya durasi waktu.
Jadi sekarang kita hanya perlu cara untuk mengulangi file-file kita dan mengumpulkan nilai durasi ini.
CATATAN: Di sini untuk contoh saya hanya menyalin file sampel saya
some.mp4
dan menamakannya1.mp4
,2.mp4
, dan3.mp4
.Mengkonversi waktu menjadi detik
Cuplikan berikut akan mengambil durasi dari atas dan mengubahnya menjadi detik.
Ini mengambil durasi kami dan menempatkannya dalam variabel
$dur
,, saat kami menelusuri file. Thedate
perintah kemudian digunakan untuk menghitung jumlah detik sinus zaman Unix (1970/01/01). Inilahdate
perintah di atas yang pecah sehingga lebih mudah dilihat:CATATAN: Menggunakan
Contohdate
cara ini hanya akan berfungsi jika semua file Anda memiliki durasi yang <24 jam (yaitu 86400 detik). Jika Anda membutuhkan sesuatu yang dapat menangani durasi yang lebih besar, Anda dapat menggunakan ini sebagai alternatif:Menaikkan waktu
Kita kemudian dapat mengambil output dari
for
loop kita dan menjalankannya menjadipaste
perintah yang akan menggabungkan+
tanda - tanda di antara setiap angka, seperti:Akhirnya kami menjalankan ini ke dalam kalkulator baris perintah,
bc
untuk menjumlahkannya:Menghasilkan total durasi semua file, dalam detik. Ini tentu saja dapat dikonversi ke beberapa format lain jika diperlukan.
sumber
date
tercekik jikaffmpeg -i some.mp4 2>&1 | grep -oP "(?<=Duration: ).*(?=, start.*)"
mengembalikan sesuatu seperti26:33:21.68
(yaitu, durasi ≥ 24 jam / 86400 detik)paste
menarik perhatian saya. Saya kirajava -classpath $(find -name \*.jar | paste -sd:)
akan sangat berguna bagi saya, mengingat peretasan yang saya gunakan untuk ini di masa lalu.paste
adalah perintah favorit saya 8-)Keluar dari jawaban yang diterima dan menggunakan alat reverse-polish UNIX klasik:
Yaitu: Menambah
+
danp
kemudian memasukkannya ke dalamdc
dan Anda akan mendapatkan jumlah Anda.sumber
bc
mendapat terlalu banyak cinta. Anda semua meletakkan+
tanda di antara setiap baris (bergabung di+
), sedangkan dengan reverse-polish Anda bisa membuangnya+
di ujung danp
membuangnya;)Pastikan Anda telah menginstal MPlayer .
sumber
Sebagai libav ubuntu, bukan ffmpeg:
Sangat didasarkan pada ide-ide MvG
sumber
Nah, semua solusi ini perlu sedikit usaha, apa yang saya lakukan sangat sederhana, 1)
pergi ke folder yang diinginkan dan klik kanan -> buka dengan aplikasi lain
Kemudian pilih VLC media player,
di sini adalah contoh
1.
2.
3.
Anda dapat melihat tepat di bawah bilah alat, ada Playlist [10:35:51] tertulis, sehingga folder berisi 10 jam 35 menit dan durasi total video 51 detik
sumber
Saya memiliki sub-direktori pada folder saat ini sehingga saya harus menghitung durasi secara rekursif:
find . -iname '*.mp4' -print0 | xargs --null exiftool -n -q -p '${Duration;our $sum;$_=ConvertDuration($sum+=$_)}' | tail -n1
sumber