2017-10-16 5 views
0

J'utilise FFmpeg version 3.3.4 (installé via le brassage) via la ligne de commande pour enregistrer mon bureau pendant certains tests automatisés sur mon macOS Sierra (10.12.6).FFmpeg 3.3.4 avfoundation pour enregistrer seulement une section spécifique de l'écran sur macOS Sierra en utilisant la ligne de commande

Je voudrais enregistrer seulement une section spécifique de l'écran mais, malheureusement, je ne suis pas capable de trouver les bonnes options dans la documentation pour atteindre mon objectif.

Selon le FFmpeg documentation for avfoundation, c'est la commande que j'utilise:

ffmpeg 
-f avfoundation // avfoundation 
-pix_fmt uyvy422 // pixel format 
-i 1    // input: desktop 
-r 30    // framerate for output 
[PATH]/test.mp4  // filename 

Quand je lance cette commande, j'ai la sortie suivante:

ffmpeg version 3.3.4 Copyright (c) 2000-2017 the FFmpeg developers 
    built with Apple LLVM version 9.0.0 (clang-900.0.37) 
    configuration: --prefix=/usr/local/Cellar/ffmpeg/3.3.4 --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-gpl --enable-ffplay --enable-frei0r --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-opencl --enable-videotoolbox --enable-openssl --disable-lzma --enable-libopenjpeg --disable-decoder=jpeg2000 --extra-cflags=-I/usr/local/Cellar/openjpeg/2.3.0/include/openjpeg-2.3 --enable-nonfree --enable-vda 
    libavutil  55. 58.100/55. 58.100 
    libavcodec  57. 89.100/57. 89.100 
    libavformat 57. 71.100/57. 71.100 
    libavdevice 57. 6.100/57. 6.100 
    libavfilter  6. 82.100/6. 82.100 
    libavresample 3. 5. 0/3. 5. 0 
    libswscale  4. 6.100/4. 6.100 
    libswresample 2. 7.100/2. 7.100 
    libpostproc 54. 5.100/54. 5.100 
[avfoundation @ 0x7fb7d4005800] Stream #0: not enough frames to estimate rate; consider increasing probesize 
Input #0, avfoundation, from '1': 
    Duration: N/A, start: 7263.782833, bitrate: N/A 
    Stream #0:0: Video: rawvideo (UYVY/0x59565955), uyvy422, 1920x1080, 1000k tbr, 1000k tbn, 1000k tbc 
Stream mapping: 
    Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264)) 
Press [q] to stop, [?] for help 
No pixel format specified, yuv422p for H.264 encoding chosen. 
Use -pix_fmt yuv420p for compatibility with outdated media players. 
[libx264 @ 0x7fb7d4028400] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 AVX2 LZCNT BMI2 
[libx264 @ 0x7fb7d4028400] profile High 4:2:2, level 4.0, 4:2:2 8-bit 
[libx264 @ 0x7fb7d4028400] 264 - core 148 r2795 aaa9aa8 - H.264/MPEG-4 AVC codec - Copyleft 2003-2017 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00 
Output #0, mp4, to '[PATH]/test.mp4': 
    Metadata: 
    encoder   : Lavf57.71.100 
    Stream #0:0: Video: h264 (libx264) ([33][0][0][0]/0x0021), yuv422p, 1920x1080, q=-1--1, 30 fps, 15360 tbn, 30 tbc 
    Metadata: 
     encoder   : Lavc57.89.100 libx264 
    Side data: 
     cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1 
frame= 83 fps= 28 q=-1.0 Lsize=  525kB time=00:00:02.66 bitrate=1612.6kbits/s dup=1 drop=0 speed=0.889x 

J'ai essayé d'utiliser l'option -video_size pour définir la taille de l'image vidéo, mais cela ne fonctionne pas.

Répondre

1

D'abord, vous devez trouver le nom du AVFoundation dispositif qui correspond à votre écran:

ffmpeg -hide_banner -f avfoundation -list_devices true -i "" 

[AVFoundation input device @ 0x7fc1cd40ec60] AVFoundation video devices: 
[AVFoundation input device @ 0x7fc1cd40ec60] [0] HD Pro Webcam C920 
[AVFoundation input device @ 0x7fc1cd40ec60] [1] FaceTime HD Camera (Built-in) 
[AVFoundation input device @ 0x7fc1cd40ec60] [2] Capture screen 0 
[AVFoundation input device @ 0x7fc1cd40ec60] AVFoundation audio devices: 
[AVFoundation input device @ 0x7fc1cd40ec60] [0] HD Pro Webcam C920 
[AVFoundation input device @ 0x7fc1cd40ec60] [1] Built-in Microphone 

donc mon écran est un appareil [2] parce que j'ai deux appareils photo et ils sont des dispositifs [0] et [1].

Puis, comme vous êtes sur un Mac, vous voudrez probablement utiliser QuickTime pour visionner les vidéos, vous devez vous assurer que faire des vidéos compatibles - cela signifie en utilisant -pix_fmt yuv420p.

ffmpeg -f avfoundation -i "2:0" -vf "crop=1024:768:400:800" -pix_fmt yuv420p -y -r 10 out.mov 

Les 1024x768 sont la largeur et la hauteur de la vidéo et le 400: 800 sont le décalage par rapport en haut à gauche de l'écran que je veux enregistrer.

+0

Merci! Cela semble marcher correctement. J'ai deux autres questions: 1) que font les options '-y'? 2) en ajoutant le '-pix_fmt yuv420p' après les options' -i' et '-vf' j'ai l'alerte suivante' [avfoundation @ 0x7f8d41003400] Le format de pixel sélectionné (yuv420p) n'est pas supporté par le périphérique d'entrée. liste des formats supportés. quelle lib/extension devrais-je ajouter? – antedesk

+1

Le '-y' signifie *" oui, c'est bon "* pour' ffmpeg' écraser les fichiers précédents du même nom - ce qui arrive souvent quand on teste des choses encore et encore. –

+0

Vous devez ajouter le '-pix_fmt yuv420p' ** après ** toutes les données d'entrée afin que' ffmpeg' sache que vous voulez que la sortie soit dans 'yuv420' afin que QuickTime puisse le lire. Si vous le placez au début de la ligne, 'ffmpeg' suppose que vous voulez que l'entrée de l'écran entre dans ce format - ce qu'il ne peut pas fournir. –