ffmpeg / avconv memaksa output yang diskalakan agar dapat dibagi oleh 2

10

Saya merekam desktop saya dengan avconv (alias ffmpeg) dan kemudian skala ke 720p.

Saya baru-baru ini menambahkan ke skrip saya sehingga mereka dapat memilih jendela dengan xwininfo dan itu akan merekam yang khusus.

Namun, jika format output tidak dapat dibagi 2 encoder menjadi aneh dan saya tidak mendapatkan video saya.

Apakah ada cara untuk memperbaiki ini di dalam ffmpeg jadi saya tidak perlu melakukan banyak matematika manual di bash untuk mengatur nilai skala?

Apakah mungkin untuk memiliki filter skala kurangi / tambahkan satu ke lebar / tinggi jika tidak merata? (bulat?)

Apakah mungkin untuk menerapkan filter lain setelah skala asli yang dapat mencapai ini? (Ini akan membuat video yang memiliki ukuran input tidak merata dan tidak ada penskalaan)

#!/bin/bash
avconv \
-f x11grab -r $fps -s $capturesize -i :0.0$offset \
-vcodec libx264 \
-vf scale=-1:720 \
-pre:v lossless_ultrafast \
-threads 4 \
-y $@

Beberapa milis lama menyarankan round()fungsi yang dapat Anda gunakan dalam filter, tetapi sepertinya saya tidak bisa mendapatkan sintaks yang benar. Jika berfungsi, scale=round(iw,2):round(ih,2)filter yang diterapkan pada akhirnya akan menyelesaikan semua masalah saya sekaligus. iwdan ihsepertinya tidak bekerja.

JV
sumber

Jawaban:

9

Karena pembagian oleh 2 menimbulkan dalam jumlah ganjil kadang-kadang, itu harus:

-vf scale="trunc(oh*a/2)*2:720"

Ini melakukan apa yang diinginkan dengan -1:720sintaks (pertahankan rasio aspek asli)

Fernando Piancastelli
sumber
Saya menggunakan ceilsebagai gantinya truncuntuk mendapatkan nomor pasangan yang lebih tinggi sebagai kasus 16: 9 480p
Felipe Alcacibar
8

Sebenarnya filter bisa mengatasinya secara langsung. Anda hanya perlu meneruskan -2alih-alih -1ke filter: mis

-vf scale="-2:720"

Saya terkejut menemukan ini dalam laporan bug dari 3 tahun yang lalu .

erik
sumber
Tidak berfungsi untuk saya, apa versi minimum yang mendukung ini?
letmaik
3
-2 bekerja untuk saya di ffmpeg versi 2.3.3
Lance Nanek
7

Setelah banyak bereksperimen sepertinya filter berikut diterapkan setelah filter skala lain akan membulatkan lebar dan tinggi menjadi 2.

scale=trunc(in_w/2)*2:trunc(in_h/2)*2

Ini pada dasarnya adalah membagi, bulat, memperbanyak hal, saya hanya tidak memiliki sintaks yang benar.

JV
sumber