Satu liner ffmpeg (atau lainnya) hanya mendapatkan resolusi?

9

Saya tidak terlalu berpengalaman dalam baris perintah jadi mudah-mudahan ini bukan pertanyaan yang bodoh.

Jika saya menjalankan:

ffmpeg -i videofile.avi

Saya mendapatkan output seperti ini:

ffmpeg version git-2013-11-21-6a7980e Copyright (c) 2000-2013 the FFmpeg develop    ers
  built on Nov 21 2013 12:06:32 with gcc 4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5)
  configuration: --prefix=/home/user/ffmpeg_build --extra-cflags=-I/home/user/ffmpeg_build/include --extra-ldflags=-L/home/user/ffmpeg_build/lib --b        indir=/home/user/bin --extra-libs=-ldl --enable-gpl --enable-libass --enable    -libfdk-    aac --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-l    ibx264 --enable-    nonfree
  libavutil      52. 53.100 / 52. 53.100
  libavcodec     55. 44.100 / 55. 44.100
  libavformat    55. 21.100 / 55. 21.100
  libavdevice    55.  5.100 / 55.  5.100
  libavfilter     3. 91.100 /  3. 91.100
  libswscale      2.  5.101 /  2.  5.101
  libswresample   0. 17.104 /  0. 17.104
  libpostproc    52.  3.100 / 52.  3.100
Input #0, avi, from 'videofile.avi':
  Metadata:
    encoder         : Lavf52.68.0
  Duration: 00:23:07.68, start: 0.000000, bitrate: 2390 kb/s
    Stream #0:0: Video: mpeg4 (Simple Profile) (XVID / 0x44495658), yuv420p, 640x480     [SAR 1:1 DAR 4:3], 23.98 fps, 23.98 tbr, 23.98 tbn, 1199 tbc
    Stream #0:1: Audio: mp3 (U[0][0][0] / 0x0055), 44100 Hz, stereo, s16p, 128 k    b/s

Jika saya hanya tertarik pada perintah yang menghasilkan "640x480", bagaimana saya bisa melakukannya?

Saya membayangkan saya harus menyalurkan output ke, dan melakukan, ekspresi reguler? Tidak tahu bagaimana melakukannya. Terima kasih!

bcsteeve
sumber

Jawaban:

10

Dapatkan resolusi video dengan ffmpeg:

ffmpeg -i filename 2>&1 | grep -oP 'Stream .*, \K[0-9]+x[0-9]+'

Output (misalnya):

640x480
Cyrus
sumber
Jawaban muru tentu saja lebih dari cukup, tetapi jawaban ini khusus menjawab pertanyaan saya ketika ditanya (mis. menggunakan ffmpeg). Saya tidak tahu apa protokol di sini dengan memilih jawaban. Dalam hal ini, saya pikir jawaban Muru lebih bermanfaat sementara Cyrus lebih tepat. Maaf, tidak yakin ke mana harus pergi tetapi sekarang saya memilih Cyrus 'karena ini sangat spesifik apa yang saya minta (tapi saya menggunakan lol Muru)
bcsteeve
1
Berhati-hatilah. Contoh yang ditunjukkan dalam pertanyaan akan menghasilkan grep menghasilkan dua pertandingan (yang pertama 0x44...dan yang kedua adalah resolusi).
muru
Jika input berisi beberapa aliran video, seperti input dari DVD, maka jawaban ini akan menampilkan width x heightaliran per video dalam beberapa baris. Ini dapat dihindari jika diinginkan dengan ffprobe, atau dengan menambahkan head -n 1perintah dalam jawaban.
Logan
9

Menggunakan ffprobedari paket ffmpeg:

$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 input.mp4
  1280x720

Lihat dokumentasi ffprobe dan FFmpeg Wiki: tips ffprobe untuk info lebih lanjut.

llogan
sumber
Terima kasih. Tidak mengetahui tentang ff. Banyak bantuan di sini! Terimakasih semuanya.
bcsteeve
4
exiftool -b metavideo.mp4 -ImageWidth
exiftool -b metavideo.mp4 -ImageHeight

melakukan pekerjaan tanpa greps

One-liner terlihat seperti:

exiftool -b metavideo.mp4 -ImageSize

Itu mengembalikan string WxH yang Anda cari.

Alex Dolgov
sumber
Secara teknis ini bukan satu-liner.
David Foerster
Saya belum memperhatikan bahwa itu satu-baris yang diminta, tetap melakukan lebar yang sama -ImageSize parameter mengembalikan string WxH.
Alex Dolgov
Lihatlah judul pertanyaan lagi! ;-) Pokoknya +1
David Foerster
3

Saya hanya melihat di sini contoh menggunakan exiftooldan menguraikan output itu, yang tampaknya menjadi pilihan yang aneh. exiftooldapat digunakan secara langsung untuk mendapatkan resolusi (dan hampir semua metadata lainnya):

exiftool -ImageSize -s3 filename

Akan menghasilkan output dalam bentuk WIDTHxHEIGHT(eq: 1280×720)

CATATAN: -s3menginstruksikan exiftool untuk menghasilkan format output terpendek (tanpa nama tag, tanda kutip, dll)

Script Juicy
sumber
2

Anda dapat melakukan ini menggunakan ekspresi reguler dan ffmpeg, tetapi saya lebih suka menggunakan exiftool, bagian dari paket libimage-exiftool-perlInstal libimage-exiftool-perl :

$ exiftool some/video.ogv | awk -F' *: *' '$1 == "Image Size"{print $2}'
1242x480

Mengapa exiftool?

  • The ffmpeg/ avprobeutilitas mencetak garis dalam bentuk Stream #0:0: Video: mpeg4 (Simple Profile) (XVID / 0x44495658), yuv420p, 640x480di mana satu atau lebih nilai dari bentuk AAAxBBByang mungkin (seperti yang Anda lihat dalam contoh Anda). Menentukan resolusi mana yang mungkin sulit dilakukan.
  • exiftool, di sisi lain, menampilkan data formulir Type : Value. Jadi lebih mudah untuk mendapatkan bidang yang tepat, yaitu Image Size. Plus, mengingat cara bidang ditentukan (dipisahkan oleh titik dua dan spasi putih), Anda dapat dengan mudah mengekstrak nilainya.

Apa yang dilakukan awkperintah adalah:

  • Atur pemisah bidang ke ' *: *'- titik dua yang :dikelilingi oleh sejumlah spasi.
  • Periksa apakah bidang pertama ( $1) adalahImage Size
  • Dan cetak kolom kedua ( print $2).

Versi alternatifnya adalah:

awk '/^Image Size/{print $4}'
  • Secara default, awk penggunaan spasi untuk memisahkan bidang, sehingga Image, Size, :dan 1242x480semua bidang yang berbeda.
  • Dengan mencocokkan awal baris ( ^) dengan Image Size, kita mendapatkan garis yang benar.
  • Dan kami mencetak bidang keempat (sejak Image, Sizedan :merupakan tiga bidang pertama).
muru
sumber
Terima kasih! Saya mungkin menyarankan Anda mengedit contoh Anda untuk mengubah "Ubuntu_Free_Culture_Showcase / How \ fast.ogg" menjadi sesuatu yang lebih umum. Pada awalnya saya menggunakannya secara harfiah karena saya tidak mengenalinya sebagai nama file. Tentu saja, saya melihat kesalahan saya 2 detik kemudian dan solusi Anda berfungsi dengan baik!
bcsteeve
@ bcsteeve Saya menggunakannya karena itu adalah bagian dari contoh konten yang dipasang di desktop Ubuntu (lihat /usr/share/example). : D
muru
1

Penggunaan yang sedikit esoterismediainfo akan dengan mudah mengekstrak lebar dan tinggi dalam format yang Anda inginkan setelah menggunakan satu-liner sederhana. Perhatikan contoh berikut di sistem saya:

andrew@illium~$ mediainfo --Inform="Video;%Width%x%Height%" test.mp4
1920x1080

Berbagai parameter lebih lanjut yang dapat digunakan dengan cara ini dapat dilihat dengan mediainfo --Info-Parameterstetapi mungkin penggunaan sederhana ini dengan sendirinya akan cukup untuk Anda ...

andrew.46
sumber
0

Saya membuat forloop 1 liner untuk mengekstrak resolusi dari direktori file.

for i in $(ls "/root/vidz/dollabillz/"*); do eval $(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=width,height "$i"); size=${streams_stream_0_width}x${streams_stream_0_height}; echo $i $size; done;
Kevin Dollabillz
sumber
3
Parsing lstidak akan berakhir dengan baik ... mengutip tidak akan memperbaiki kekacauan
Zanna
belum gagal saya setelah 100.000 encode
Kevin Dollabillz