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.

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)


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 .


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.