ffmpeg - Bagaimana cara menyalin | mengekstrak pengaturan penyandian dari file media yang ada?

19

Saya ingin dapat melakukan ini beberapa kali sekarang jadi saya bertanya.

Jika saya memiliki file video atau audio yang ada ffmpeg,, mplayerdan pemutar media lainnya dapat mendeteksi setidaknya beberapa "propretinya" seperti wadah, codec dan bitrate yang digunakan, mungkin berbagai kualitas dan penyandian pengaturan khusus, dll.

Bagaimana saya bisa mengekstrak pengaturan ini dari file yang ada untuk menggunakannya (langsung) untuk pengkodean dengan ffmpeg?

Sebagai contoh, saya mendapat mkvvideo yang dikodekan x264dengan beberapa pengaturan, dan avifile lain yang tidak terkompresi . Saya ingin "menyalin" pengaturan penyandian yang digunakan untuk file mkv x264 untuk mentranskode avi dengan pengaturan yang sama .

Catatan: Saya mencari cara yang seharusnya tidak menyertakan pekerjaan manusia dengan "menerjemahkan" pengaturan dari decoder ke encoder. Tidak apa-apa jika saya perlu mengekstrak pengaturan terlebih dahulu dan menyimpannya di suatu tempat tapi saya ingin dapat memberi makan opsi baca ke baris perintah atau file konfigurasi | preset untuk ffmpeg.

n611x007
sumber
Nah, Anda mungkin bisa memilah-milah output ffprobe(terutama dengan -show_streamsdan -show_formatopsi) dan menggunakan informasi itu untuk skrip hal
evilsoup
1
Seringkali menggunakan pengaturan yang sama, seperti bitrate (berusaha menyalin bitrate yang tepat tampaknya menjadi populer di kalangan pengguna), tidak akan menghasilkan kualitas yang optimal. Tentu saja saya tidak tahu seperti apa input khas Anda, tetapi dengan penggunaan x264 pada -crfopsi umumnya direkomendasikan. Lihat Panduan Pengkodean FFmpeg dan x264 .
Logan
Saya tidak dapat menemukan apa pun tentang pengaturan penyandian dalam output
ffprobe
Ini hanya menunjukkan jumlah ReFrames, tetapi tidak pengaturan lain seperti mediainfo tidak
thelolcat
Sintaks input dengan ffmpeg berbeda dari bidang metadata. mis. Anda bisa membaca channels:6dari file video, tetapi untuk menyandikannya Anda harus menggunakan sakelar -ch:6. Beberapa sakelar menggunakan 1 huruf, sebagian menggunakan dua huruf, dll.
jiggunjer

Jawaban:

10

Tidak ada cara otomatis untuk melakukan itu. Anda harus melihat parameter dari file asli dan menerapkannya pada file output.

Dalam kebanyakan kasus, ini akan menjadi sebagai berikut:

  • Format wadah (MP4, MKV, ...)
  • Codec video dan audio (H.264, H.265, ...)
  • Khusus audio:
    • Jumlah saluran audio
    • Tingkat pengambilan sampel audio
    • Bitrate audio
  • Khusus video:
    • Profil dan Level (untuk memastikan kompatibilitas, lihat di sini )
    • Batasan bitrate maksimum (mis. Untuk H.264 )
    • Resolusi video maksimum, ubah melalui -filter:v scaleatau-s:v
    • Membingkai, ubah melalui -filter:v fps -r
    • Subsampling Chroma, ubah via -pix_fmt(mis., -pix_fmt yuv420pHarus memberi Anda kompatibilitas terbaik)
    • Ukuran GOP (jarak antara IDR-frame), ditetapkan melalui -g
    • Pengaturan penyandian khusus lainnya

Tetapi bahkan jika Anda bisa melakukannya dengan benar, beberapa perangkat mungkin memerlukan informasi kepemilikan khusus yang tertanam dalam bitstream.


Adapun tugas spesifik menggunakan x264, ini tidak akan sepele. Saya tidak mengetahui ada satu skrip pun yang menangani tugas-tugas ini, yang biasanya dilakukan secara manual. Untuk sebagian besar info tentang pengaturan penyandian, di Unix / Linux atau OS X, Anda dapat menggunakan mediainfobeberapa trik Bash.

Misalnya, untuk video yang disandikan x264 dalam file MP4:

mediainfo input.mp4 | grep "Encoding settings" | cut -d':' -f2- | tr '/' '\n' | sed 's/ //'

Ini akan menampilkan daftar opsi x264:

cabac=1
ref=3
deblock=1:-1:-1
analyse=0x3:0x113
me=hex
subme=7
psy=1
…

Anda kemudian bisa meneruskan opsi-opsi ini secara manual ke biner x264.

Jika Anda menggunakan FFmpeg, itu sedikit lebih rumit, karena tidak semua opsi x264 dapat atau harus dipetakan seperti ini. Catatan yang sering sederhana preset, tune dan profil spesifikasi akan melakukan juga (seperti yang terlihat di x264 --fullhelpdan panduan encoding x264 ), dan menentukan tingkat CRF cukup.

Dan ini bahkan tidak mempertimbangkan audio, di mana untungnya, tidak ada banyak pilihan.

slhck
sumber
Jadi tidak mungkin dengan ffprobe atau ffmpeg?
thelolcat
Tidak, itu tidak secara langsung mungkin dilakukan dengan ffprobe / ffmpeg. Dalam hal video yang dikodekan x264, saya akan menggunakan mediainfooutput dan memetakan opsi ini ke ffmpeg -x264-params. (Lihat juga panduan penyandian x264 ). Tetapi jika Anda menginginkan solusi umum untuk semua jenis codec / encoders atau format kontainer, maka Anda perlu menulis skrip yang cukup canggih yang melakukan konversi.
slhck