FFMPEG / libx264: Bagaimana cara menentukan frame rate variabel tetapi dengan maksimum?

16

Alih-alih memberikan frame rate tetap ke FFMPEG / libx264 (-r / -framerate), saya ingin menentukan frame rate variabel dengan nilai MAXIMUM, dan memungkinkan libx264 untuk menurunkan frame rate sesuai keinginan. Idenya di sini adalah untuk mendapatkan kompresi tambahan ketika ada sesuatu seperti bingkai foto yang diperpanjang (yang terjadi BANYAK dalam video sumber saya).

Saya menyadari bahwa frame MPEG prediktif atau dua arah akan memampatkan dengan sangat baik, tetapi juga mungkin bahwa frame rate sumber lebih kecil daripada yang saya ingin transcode (mungkin menghasilkan aliran yang LEBIH BESAR!).

Mark Gerolimatos
sumber
1
Di mana (atau bagaimana) Anda benar-benar memberi tahu x264 sendiri untuk menggunakan VFR?
slhck
Itu pertanyaan saya.
Mark Gerolimatos
2
Pertanyaan Anda adalah bagaimana menentukan VFR dengan maksimal . Saya bahkan tidak mengetahui cara untuk menentukan pengkodean VFR sama sekali, menggunakan x264. (Saya juga tidak berbicara tentang ffmpeg pada saat ini, karena ini adalah lapisan lain antara sumber Anda dan x264.)
slhck
@MarkGerolimatos Apakah Anda menemukan jawaban Anda ?!
Dr.jacky
Tidak, saya tidak pernah melakukannya.
Mark Gerolimatos

Jawaban:

19

Frustrasi karena Anda belum menemukan jawaban, saya setidaknya akan menjawab pertanyaan orang lain tentang cara mengaktifkan output VFR (bukan V B R) dari FFMPEG.

Jawabannya adalah -vsyncopsi yang diberi nama aneh . Anda dapat mengaturnya ke beberapa opsi yang berbeda, tetapi yang Anda inginkan adalah '2' atau vfr. Dari halaman manual:

-vsync parameter
Metode sinkronisasi video. Untuk alasan kompatibilitas, nilai-nilai lama dapat ditentukan sebagai angka. Nilai yang baru ditambahkan harus ditentukan sebagai string selalu.

  • 0, lolos

    • Setiap frame dilewatkan dengan stempel waktu dari demuxer ke muxer.
  • 1, cfr

    • Bingkai akan digandakan dan dijatuhkan untuk mencapai tingkat bingkai konstan yang diminta secara tepat.
  • 2, ay

    • Bingkai dilewati dengan stempel waktu atau dijatuhkan untuk mencegah 2 frame memiliki stempel waktu yang sama.
  • penurunan

    • Sebagai passthrough tetapi menghancurkan semua cap waktu, membuat muxer menghasilkan cap waktu baru berdasarkan frame-rate.
  • -1, otomatis

    • Memilih antara 1 dan 2 tergantung pada kemampuan muxer. Ini adalah metode standar.

Perhatikan bahwa stempel waktu dapat dimodifikasi lebih lanjut oleh muxer, setelah ini. Misalnya, dalam hal opsi format avoid_negative_ts diaktifkan.

Dengan -map Anda dapat memilih dari aliran mana stempel waktu harus diambil. Anda dapat membiarkan video atau audio tidak berubah dan menyinkronkan aliran yang tersisa ke yang tidak berubah.

Namun, saya tidak memiliki reputasi yang cukup untuk mengirim komentar untuk hanya menjawab 'sub-pertanyaan' yang tampaknya dimiliki semua orang. Tapi saya memang punya beberapa ide yang sejujurnya saya tidak terlalu optimis tentang ... Tapi yang pertama saya coba ternyata berhasil . Begitu.

Anda hanya perlu menggabungkan -vsync 2opsi dengan -r $maxfpsopsi, tentu saja di mana Anda mengganti $maxfpsdengan framerate maksimum yang Anda inginkan! Dan itu BEKERJA! Itu tidak menduplikasi bingkai dari file sumber, tetapi itu akan menjatuhkan bingkai yang menyebabkan file untuk melampaui framerate maksimum!

Secara default tampaknya -r $maxfpsdengan sendirinya hanya menyebabkannya menggandakan / menjatuhkan frame untuk mencapai framerate konstan, dan -vsync 2dengan sendirinya menyebabkannya untuk menarik frame secara langsung tanpa benar-benar mempengaruhi nilai PTS.

Saya tidak optimis tentang ini karena saya sudah tahu yang -r $maxfpsmembuatnya framerate konstan. Jujur saya mengharapkan kesalahan atau untuk hanya mematuhi mana yang lebih dulu atau terakhir atau apa pun. Fakta bahwa ia melakukan persis apa yang saya inginkan membuat saya cukup senang dengan para pengembang FFMPEG.

Saya harap ini membantu Anda, atau orang lain di kemudian hari jika Anda tidak perlu lagi mengetahui hal ini.

Tynach
sumber
3
-copytsSemoga bermanfaat juga
rogerdpack
1

Saya ingin menentukan frame rate variabel dengan nilai MAXIMUM, dan memungkinkan libx264 untuk menurunkan frame rate sesuai keinginan. Idenya di sini adalah untuk mendapatkan kompresi ekstra ketika ada sesuatu seperti bingkai foto yang diperpanjang

Dalam pemahaman saya, ini mungkin dalam cara yang agak canggung, tetapi tidak diinginkan untuk beberapa alasan yang kompleks dan berlawanan dengan intuisi

Meskipun stream x264 memiliki framerate, frame rate lebih merupakan masalah level kontainer daripada codec.

Dalam encode passthrough VFR, akan ada apa yang pada dasarnya adalah file teks yang merinci apa frame rate di atas frame / kali apa, dan dalam encoding sumber, fungsi seperti tcfile-in atau tcfile-out meneruskan timestamps ke encode , untuk memetakan lokasi tingkat dan menjaga video secara konsisten konsisten dari sumbernya.

Ide rendah framerate adalah ide yang logis, tetapi tidak berhasil karena beberapa alasan. Meskipun x264 sadar VFR dengan beberapa kemampuan, saya tidak berpikir ada fungsi analisis yang akan memvariasikan framerate sehubungan dengan gerakan untuk menurunkan ukuran file (dengan cara yang mirip dengan banyak kontrol bitrate).

Sumbernya juga merupakan masalah: Sumber-sumber VFR secara default akan mempertahankan variabilitas frame mereka, tetapi tampaknya meng-encode file CFR pada bitrate variabel (kadang-kadang ide yang bagus, terutama ketika telecine diperlukan) hanya akan menghasilkan CFR yang sama.

Ini berarti Anda mungkin harus menulis ulang bitrate dengan tangan (mis. Cap waktu adegan lambat yang disandingkan ke dalam file), atau menggunakan algoritma penipisan bingkai seperti dup, dedup, dan exactDedup untuk avisynth . Jika video Anda memang memiliki gerakan yang sangat rendah, beberapa bingkai (bahkan setengah?) Akan dibuang. Masalahnya adalah bahwa algoritma ini tidak canggih, dan tidak membuat pilihan yang baik dengan rekaman "kehidupan nyata" tentang apa yang akan berkontribusi pada pengkodean terbaik.

Selain itu, menghapus bingkai yang berisi hal-hal seperti bingkai I dan B mengurangi jumlah detail yang tersedia dari waktu ke waktu, yang menyebabkan gerakan terlihat "steppy" dan dapat mengganggu parameter video dasar lainnya dan menyebabkan artefak seperti aliasing.

Dan karena cara kerja quantizer, x264 sebenarnya akan mengurangi bitrate lebih jauh secara tidak proporsional dalam adegan-adegan gerak rendah ini. Kecuali jika Anda memiliki rangkai salindia dari gambar yang identik, akan ada gerakan (jika hanya butir dan artefak lainnya) dan akan ada penurunan kualitas yang tidak akan terlihat tanpa perubahan drastis pada bitrate.

Dan akhirnya, alasan tidak banyak pilihan untuk melakukan apa yang Anda inginkan adalah x264 sangat bagus dalam mengelola bitrate hanya dengan menggunakan kompresi temporal (merekam perubahan dalam frame parsial). Pergi ke 1/2 framerate tidak akan memotong ukuran file menjadi setengah; 10% mungkin merupakan keuntungan realistis yang diharapkan dari gerakan rendah atau animasi.

Jadi singkatnya, menjatuhkan bitrate dari adegan statis Anda akan sangat sedikit untuk ukuran file Anda, tetapi akan menambah sejumlah masalah kualitas dan sinkronisasi, belum lagi ketidakcocokan dengan perangkat lunak pengedit video.

Jika Anda ingin mencoba decimator, Anda mungkin dapat membatasi frame rate maksimum baru dengan menggunakan opsi level , yang masing-masing spesies memiliki resolusi dan framerate maksimum. Sayangnya, Anda mungkin harus bekerja pada resolusi yang sangat rendah untuk mendapatkan jenis frame rate yang Anda inginkan, menggunakan profil. Itu kembali ke mengedit tarif dengan tangan, baik seluruhnya atau untuk memperbaiki frame rate yang menurut Anda terlalu tinggi. Either way, akan butuh juggling untuk menjaga suara tetap sinkron dengan framerate baru jika perubahan dilakukan setelah proses pengkodean ketika tcfile dilestarikan.

Kelebihannya adalah menghabiskan waktu untuk mengoptimalkan banyak pengaturan bitrate akan menghasilkan lebih banyak cara manajemen ukuran file, dan meningkatkan kualitas video Anda, daripada menyebabkan komplikasi dengan sedikit keuntungan. Mempertahankan FPS asli mungkin adalah ide terbaik kecuali Anda mengincar standar siaran atau media. Pemain mampu memainkan bitrate variabel (tidak seperti editor), dan semakin banyak frame dalam video Anda, semakin halus pemutarannya dan mungkin semakin kecil ukuran file, karena perubahan kecil dalam pergerakan antar frame.

Berikut adalah kumpulan tautan ke info standar dan diskusi forum yang akan membantu aspek penyandian yang membingungkan ini:

- Alat penipisan avisynth

- fps dan -r switch
- x264 Umum (tcfile, fps)
- standar file kode waktu
- Level dan profil
- Pendek, jelas ringkasan pengaturan CFR / VFR (bagian "framerate")

doom9, videohelp, & c diskusi teoritis
1 2 3 4 5 6 7

kronometrik
sumber