3 पॉइंट द्वारा GN⁺ 2023-07-31 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • ffmprovisr एक command generation सहायता साइट है, जहाँ FFmpeg कमांड लिखना कठिन लगने वाले उपयोगकर्ता कोई काम चुनकर उदाहरण कमांड और हर flag की व्याख्या देख सकते हैं
  • रेसिपी ffmpeg, ffplay, ffprobe के केंद्र में input file, codec, filter, stream mapping, output container जैसे घटकों को अलग-अलग करके दिखाती हैं
  • इसका दायरा rewrap/transcoding से लेकर trim/join, subtitle/watermark, thumbnail/GIF, test files, metadata/checksum/QCTools report तक काफ़ी व्यापक है
  • इसमें अपना search नहीं है, लेकिन सभी recipes खोलने के बाद browser search से ज़रूरी keyword ढूँढने का तरीका बताया गया है
  • FFmpeg के अलावा CDDA ripping, ImageMagick, flac जैसे tools भी शामिल हैं, इसलिए इसे digital preservation workflow के लिए व्यावहारिक command collection की तरह इस्तेमाल किया जा सकता है

ffmprovisr क्या देता है

  • ffmprovisr काम-आधारित example commands और options की व्याख्या देता है, जिससे FFmpeg कमांड खुद जोड़कर बनाने का बोझ कम हो जाता है
  • उपयोगकर्ता task button दबाकर किसी एक command या संबंधित commands की सूची पर जा सकते हैं, फिर sample command और हर flag का व्यवहार देख सकते हैं
  • पेज में search feature नहीं है; इसकी जगह सभी recipes खोलकर ctrl+f या cmd+f से browser search करने का तरीका बताया गया है
  • बुनियादी reference के रूप में FFmpeg official website, Reto Kromer की installation instructions, Command Line Crash Course, और explainshell.com के लिंक दिए गए हैं
  • इसका लाइसेंस Creative Commons Attribution 4.0 International License है

FFmpeg कमांड पढ़ने का बुनियादी तरीका

  • FFmpeg install करने के बाद command prompt में ffmpeg टाइप करके चलाया जाता है
  • कमांड आमतौर पर flag और value की जोड़ी से बनी होती है
    • -i input_file.ext में -i input file बताने वाला flag है, और input_file.ext लक्ष्य फ़ाइल है
    • -c:v prores में -c:v video stream encoding बताता है, और prores इस्तेमाल होने वाला codec है
  • output filename कमांड के अंत में आता है और अलग output flag के बिना filename से ही तय होता है
  • ffmpeg वीडियो को save करता है, जबकि ffplay बनाई गई वीडियो को save किए बिना चला सकता है
    • SMPTE bars save करने का उदाहरण: ffmpeg -f lavfi -i smptebars=size=640x480 -t 5 output_file
    • SMPTE bars चलाने का उदाहरण: ffplay -f lavfi smptebars=size=640x480
    • FFmpeg उदाहरण में -i, recording duration -t 5, और output file चाहिए, लेकिन FFplay उदाहरण में -i की ज़रूरत नहीं होती

errors कम करने के लिए checkpoints

  • यह ज़रूर जाँचना चाहिए कि output file खुल रही है, चल रही है, और जैसा चाहा था वैसी दिख और सुनाई दे रही है
  • output extension इच्छित codec से मेल खाना चाहिए, और कुछ extensions FFmpeg में खास codec defaults लागू कर देते हैं
    • उदाहरण के लिए .mp4 डिफ़ॉल्ट रूप से H.264 encoding चुन सकता है
  • "Error: No such file or directory" गलत directory, typo, छूटी हुई space, या गलत जुड़ा हुआ flag होने पर आ सकता है
    • macOS में Downloads folder में जाने के लिए cd $HOME/Downloads इस्तेमाल किया जाता है
    • अगर copy-paste किया गया command ठीक दिखे फिर भी error आए, तो command line में उसे दोबारा हाथ से लिखने की सलाह दी जाती है
  • "Could not find tag for codec" तब आता है जब output extension के साथ compatible न होने वाले audio/video codec वाले file को rewrap करने की कोशिश की जाए
    • पहले उचित codec में transcode किया जा सकता है, या अगर यक़ीन हो कि extension सही codec के साथ auto-encode करेगा तो -c copy हटाया जा सकता है
  • "Killed" तब दिख सकता है जब file server memory capacity से बड़ा हो
    • remote server पर memory capacity बढ़ाकर इसे सुलझाया जा सकता है
    • local server पर FFmpeg version को up to date रखना और अधिक memory लेने वाले दूसरे programs के साथ इसे एक साथ न चलाना बेहतर है
  • filter इस्तेमाल करते समय "Error splitting argument list: option not found" दिखे तो quotes के उपयोग और filtergraph format की जाँच करनी चाहिए
  • filters के लिए stream re-encoding चाहिए, इसलिए file stream को सीधे copy करने वाले -c copy के साथ इन्हें इस्तेमाल करने पर समस्या हो सकती है

filtergraph, stream mapping, और default codecs

  • loop के अंदर FFmpeg batch job चलाते समय input से पहले -nostdin जोड़कर standard input interaction के default behavior को override किया जा सकता है
    • उदाहरण: ffmpeg -nostdin -i input_file ...
  • FFmpeg output file format के आधार पर codec और codec parameters के default values अपने-आप सेट करता है
    • .avi: audio mp3, video mpeg4
    • .mkv: audio ac3, video H.264
    • .mov: audio AAC, video H.264
    • .mp4: audio AAC, video H.264
    • .mpg: audio mp2, video mpeg1video
    • .mxf: audio pcm_s16le, video mpeg2video
    • .wav: audio pcm_s16le
  • filtergraph -vf या -af के बाद आने वाले filter name और options का संयोजन होता है
    • -vf, -filter:v का alias है
    • video filter का उदाहरण hflip है, audio filter का उदाहरण amerge है
    • कई filters को comma से जोड़ा जाता है, और कई filter chains को semicolon से अलग किया जाता है
    • -vf "fieldmatch,yadif,decimate" inverse telecine processing के लिए इस्तेमाल होने वाली एक filter chain है
    • अगर input या output एक से ज़्यादा हों, तो -vf की जगह -filter_complex इस्तेमाल करना चाहिए
    • straight quotes इस्तेमाल करनी चाहिए; curly quotes से बचना चाहिए
  • stream mapping तय करता है कि input file के video, audio, subtitle, data, attachment streams में से कौन-से output में शामिल होंगे
    • FFmpeg a, v, s, d, t stream types को पहचानता है
    • -map 0:v पहली input file की सभी video streams चुनता है
    • -map 0:3 पहली input file की चौथी stream चुनता है
    • -map 0:a:2 पहली input file की तीसरी audio stream चुनता है
    • mapping न देने पर video file के लिए default यह होता है कि output में सिर्फ 1 video और 1 audio stream ली जाए
    • सभी streams map करने के लिए -map 0 इस्तेमाल करें
    • -map 0:a? की तरह ? जोड़ने पर batch processing के दौरान audio न होने वाली files भी बिना error के आगे बढ़ सकती हैं

कंटेनर बदलना और ट्रांसकोडिंग

  • फ़ाइल remuxing ffmpeg -i input_file.ext -c copy -map 0 output_file.ext से किया जाता है
    • अंदर का video, audio और subtitle डेटा बदले बिना उसे किसी दूसरे कंटेनर फ़ॉर्मैट में ले जाया जाता है
    • remuxing को re-multiplexing भी कहा जाता है
    • -map 0 का उपयोग करना चाहिए ताकि multiple audio tracks जैसी सभी streams सुरक्षित रहें
    • कुछ कंटेनर केवल खास stream encodings ही रख सकते हैं, इसलिए re-encoding के बिना remuxing संभव न हो सकता है
  • Broadcast WAV बनाने में -write_bext 1 और -metadata field_name='Content' के साथ BEXT chunk और उससे जुड़ा metadata लिखा जाता है
    • अक्सर इस्तेमाल होने वाले fields हैं description, originator, originator_reference, origination_date, origination_time, coding_history, IARL
    • BWF metadata fields में character count की सीमा होती है, और OriginatorReference अधिकतम 32 अक्षर का होता है
  • DV codec video को .dv फ़ाइल में remux करते समय -f rawvideo -c:v copy का उपयोग करें, ताकि DV stream के अंदर का source metadata गलती से हट न जाए
  • Apple ProRes LT transcoding का उदाहरण -c:v prores -profile:v 1 -vf yadif -c:a pcm_s16le है
    • ProRes 422 profiles में 0 Proxy, 1 LT, 2 Standard, 3 HQ शामिल हैं
    • ProRes के लिए FFmpeg में QuickTime .mov, Matroska .mkv, MXF .mxf कंटेनर समर्थित हैं
  • H.264 transcoding का उदाहरण -c:v libx264 -pix_fmt yuv420p -c:a aac है
    • libx264 का default medium preset और CRF 23 है
    • -pix_fmt yuv420p QuickTime और अधिकतर non-FFmpeg players के साथ compatibility के लिए 4:2:0 chroma subsampling निर्दिष्ट करता है
    • streaming optimization के लिए -movflags +faststart जोड़ा जाता है
    • बेहतर quality का उदाहरण -preset veryslow -crf 18 है, और CRF 18 को अक्सर “visually lossless” माना जाता है
  • Nvidia GPU आधारित H.264/H.265 encoding में h264_nvenc या hevc_nvenc का उपयोग होता है
    • Nvidia fixed-function hardware, CPU encoding की तुलना में 10 गुना performance दे सकता है, लेकिन low bitrate quality optimization के लिए अधिक parameters चाहिए होते हैं
    • HEVC को लगभग 2015 के बाद के GPU में समर्थित, अधिक efficient codec बताया गया है
  • H.265/HEVC transcoding में -c:v libx265 -pix_fmt yuv420p -c:a copy का उपयोग होता है
    • libx265 का default medium preset और CRF 28 है
    • H.265 का CRF 28, H.264 के CRF 23 के बराबर माना जाता है, और file size लगभग आधा हो सकता है
  • archival lossless उदाहरण में FFV1 Version 3 को Matroska कंटेनर में रखा जाता है और साथ में input framemd5 भी बनाया जाता है
    • -map 0 सभी streams को map करता है
    • -dn उन data streams को हटाता है जिन्हें Matroska स्वीकार नहीं करता
    • -slicecrc 1 CRC जानकारी जोड़ता है ताकि decoder corrupted slices पहचान सके
    • -f framemd5 -an video frames के लिए frame-by-frame MD5 checksums बनाता है

वीडियो·ऑडियो गुण बदलना

  • aspect ratio बदलने की recipe padding filter का उपयोग करती है
    • 4:3 को 16:9 बनाने के लिए pillarbox लगाया जाता है
    • 16:9 को 4:3 बनाने के लिए letterbox लगाया जाता है
    • silent video में -c:a copy की जगह -an इस्तेमाल किया जा सकता है
  • SD को HD में बदलने के उदाहरण में colormatrix=bt601:bt709, scale=1440:1080:flags=lanczos, pad=1920:1080:240:0 ये तीन filters इस्तेमाल होते हैं
    • luminance coefficients को Rec. 601 से Rec. 709 में बदला जाता है
    • Lanczos scaling, default bilinear से धीमा है लेकिन बेहतर परिणाम देता है
    • interlaced source के लिए scaling से पहले yadif से deinterlace करने की सलाह दी जाती है
  • display aspect ratio को -aspect 4:3 जैसे option से container level पर बदला जा सकता है
    • -c:v copy के साथ उपयोग करने पर यह encoded frames के अंदर के aspect ratio को नहीं, बल्कि container में stored aspect ratio को प्रभावित करता है
  • color space conversion के लिए colormatrix=src:dst filter का उपयोग होता है
    • allowed values में bt601, smpte170m, bt470bg, bt709, bt2020 शामिल हैं
    • color space metadata embed करने के लिए -color_primaries, -color_trc, -colorspace का उपयोग होता है
    • ध्यान रहे कि असली Rec.601 फ़ाइल पर Rec.709 tag भी लगाया जा सकता है
    • metadata tags libx264 या libx265 लिखते हैं, इसलिए re-encoding के बिना इन्हें जोड़ा नहीं जा सकता
  • speed बदलने के लिए setpts और atempo साथ में उपयोग किए जाते हैं
    • उदाहरण में 24fps को 25fps में बदलते हुए audio pitch बनाए रखने वाली PAL access copy बनाई जाती है
  • fade processing के लिए fade और afade filters इस्तेमाल होते हैं, और filter उपयोग होने की वजह से video और audio दोनों को फिर से encode करना पड़ता है
  • audio extraction में -c:a copy -vn से video के बिना audio stream को lossless तरीके से निकाला जाता है
  • दो audio tracks को मिलाने के लिए amerge और -filter_complex का उपयोग होता है
    • यह YouTube auto-caption जैसी बाद की processes में उपयोगी हो सकता है, जहाँ एक ही audio track अपेक्षित होता है
    • script लिखने से पहले इच्छित track की पुष्टि के लिए ffprobe चलाने की सलाह दी जाती है
  • loudness analysis और normalization के लिए loudnorm filter का उपयोग होता है
    • JSON output को 2-pass normalization के input के रूप में इस्तेमाल किया जा सकता है
    • बताया गया है कि default values, PBS के recommended target loudness से अच्छी तरह मेल खाती हैं
    • 1-pass तेज़ है, लेकिन 2-pass से कम सटीक है
  • CD pre-emphasis, RIAA equalization, audio resampling, और 192kHz WAV को 96kHz के रूप में force interpret करने की recipes भी शामिल हैं

काटना, जोड़ना, segment बनाना

  • एक ही technical specs वाली फ़ाइलों को जोड़ने के लिए concat demuxer का उपयोग होता है
    • ffmpeg -f concat -i mylist.txt -c copy output_file
    • जिन फ़ाइलों को जोड़ा जाना है, उनका codec और technical specs समान होना चाहिए, और result फ़ाइल को ज़रूर preview करना चाहिए
    • absolute path इस्तेमाल करने के लिए -safe 0 जोड़ें
  • अलग-अलग file formats या codecs वाली फ़ाइलों को जोड़ने के लिए concat filter और -filter_complex का उपयोग होता है
    • input files में container, codec, chroma subsampling, frame rate आदि अलग हो सकते हैं
    • default example केवल तब सही चलता है जब resolution एक जैसा हो
    • frame rate अलग होने पर output variable frame rate हो सकता है
    • resolution अलग हो तो concat से पहले scale से मिलाएँ, और SD व HD को जोड़ते समय SD पर pillarbox लगाया जा सकता है
  • फ़ाइल split करना segment muxer से किया जाता है
    • -segment_time 60 अधिकतम 60 सेकंड के segments बनाता है
    • %03d 3-digit zero-padded numeric filenames बनाता है
  • बिना re-encoding trimming के लिए -ss, -to, -t, -c copy, -map 0 का उपयोग होता है
    • H.264 जैसे interframe codecs में शुरुआत i-frame के सबसे नज़दीकी बिंदु से हो सकती है
    • -sseof -5 फ़ाइल के अंत से 5 सेकंड पहले से copy करने का तरीका है
  • audio फ़ाइल की शुरुआत से silence हटाने के लिए silenceremove=start_threshold=-57dB:start_duration=1:start_periods=1 का उपयोग होता है
    • -57dB को analog hiss को ध्यान में रखते हुए उपयुक्त स्तर बताया गया है
    • filter उपयोग होने के कारण audio फिर से encode होता है
  • audio फ़ाइल के अंत से silence हटाने के लिए areverse, silenceremove, areverse क्रम में प्रोसेस किया जाता है
    • क्योंकि silenceremove शुरुआत के silence हटाने के लिए अधिक उपयुक्त है, इसलिए audio को reverse करके फिर वापस सीधा किया जाता है

इंटरलेस्ड वीडियो प्रोसेसिंग

  • SD NTSC source से HD H.264 access file बनाते समय yadif, scale, pad, format=yuv420p को साथ में इस्तेमाल किया जाता है
    • yadif एक deinterlace filter है
    • scale=1440:1080:flags=lanczos इमेज को 1440x1080 पर adjust करता है
    • pad=1920:1080:(ow-iw)/2:(oh-ih)/2 4:3 input को 16:9 output frame में फिट करने के लिए padding करता है
  • सामान्य deinterlace उदाहरण -vf "yadif,format=yuv420p" है
    • format=yuv420p H.264 playback compatibility के लिए 4:2:0 chroma subsampling निर्दिष्ट करता है
    • FFmpeg में yadif के अलावा bwdif, w3fdif, kerndeint, nnedi deinterlacer भी हैं
  • fields को frames में अलग करने वाला deinterlace idet,bwdif,format=yuv420p का उपयोग करता है
    • ज़्यादा motion वाले interlaced video में source की visual cadence को बनाए रखने के लिए इसे प्राथमिकता दी जाती है
    • idet field order detect करता है
    • bwdif डिफ़ॉल्ट रूप से हर field के लिए एक frame output करता है
  • inverse telecine में fieldmatch,yadif,decimate का उपयोग होता है
    • यह 3:2 pulldown को उलटकर 29.97fps interlaced video को मूल film source के 24fps frame rate पर restore करता है
    • 29.97i file पर लागू करने पर output frame rate वास्तव में 23.976fps हो जाता है
  • field order बदलने के लिए setfield=tff या setfield=bff का उपयोग करें
    • क्योंकि video filter इस्तेमाल हो रहा है, इसलिए -c copy इस्तेमाल नहीं किया जा सकता और re-encoding ज़रूरी है
  • interlace pattern की जाँच ffmpeg -i input_file -filter:v idet -f null - से output file बनाए बिना analysis करके की जाती है

वॉटरमार्क, subtitles, thumbnails, GIF

  • टेक्स्ट वॉटरमार्क drawtext filter से बनाया जाता है
    • fontfile, fontsize, text, fontcolor, alpha, x, y options निर्दिष्ट किए जाते हैं
    • x=(w-text_w)/2:y=(h-text_h)/2 वीडियो के आकार से स्वतंत्र रूप से बीच में place करता है
  • इमेज वॉटरमार्क को overlay=main_w-overlay_w-5:5 से ऊपर दाईं ओर रखा जा सकता है
  • burn-in timecode के लिए drawtext के timecode, box, boxcolor, rate options का उपयोग होता है
    • शुरुआती timecode का format hh:mm:ss[:;.]ff है
  • subtitle file embed करने के लिए -i subtitles_file -c copy -c:s mov_text का उपयोग करें
    • mov_text MP4 और MOV containers में काम करता है
    • MKV container में अनुमत formats ASS, SRT, SSA हैं
  • एक thumbnail -ss 00:00:20 -vframes 1 thumb.png से निकाला जाता है
  • हर 1 मिनट पर thumbnail बनाने के लिए -vf fps=1/60 out%d.png का उपयोग करें
  • image sequence को GIF में बदलते समय image2, -framerate, -pattern_type glob, scale का उपयोग होता है
  • high-quality GIF दो चरणों में बनाया जाता है
    • पहला command palettegen से custom palette बनाता है
    • दूसरा command paletteuse से palette apply करता है
    • एक सरल तरीका -vf "fps=10,scale=500:-1" का है, लेकिन इसमें dithering ज़्यादा दिखती है और file size छोटा होता है

इमेज सीक्वेंस, scopes, OCR

  • image sequence को 10-bit uncompressed video में बदलते समय -f image2 -framerate 24 -i input_file_%06d.ext -c:v v210 का उपयोग करें
    • image2 demuxer का default frame rate 25fps है
    • %06d छह अंकों वाले filename को ascending order में पढ़ता है
  • इमेज और audio file को जोड़कर वीडियो बनाने के लिए -loop 1, -shortest, -vf scale=1280:720 का उपयोग करें
    • यह तब उपयोगी हो सकता है जब आप audio file को YouTube जैसे platform पर अपलोड करना चाहते हों
  • ffplay -f lavfi और filters का उपयोग करके audio bit depth visualization, decibel graph, broadcast range से बाहर pixels का display, और vectorscope display किया जा सकता है
  • tblend=all_mode=difference128 और hstack दो input videos के temporal difference को साथ-साथ दिखाते हैं
  • xstack कई video sources को vertical या horizontal रूप से stack करने वाली output window बनाने में इस्तेमाल होता है, और vrecord में उपयोग होने वाली output window जैसे कामों के लिए उपयोगी है
  • OCR उदाहरण में ocr filter और drawtext का उपयोग करके पहचाने गए text को वीडियो पर दिखाया जाता है
  • OCR data output को ffprobe -show_entries frame_tags=lavfi.ocr.text -f lavfi -i "movie=input_file,ocr" के रूप में स्क्रीन पर निकाला जाता है

metadata, checksums, preservation work

  • technical metadata extraction ffprobe -i input_file -show_format -show_streams -show_data -print_format xml से किया जाता है
    • XML के अलावा output format के रूप में JSON, flat का भी उपयोग किया जा सकता है
  • metadata हटाने के लिए -map_metadata -1 -c:v copy -c:a copy का उपयोग करें
    • वीडियो और ऑडियो को copy किया जाता है, लेकिन metadata copy नहीं किया जाता
  • Bash batch processing .sh file और for loop से की जाती है
    • उदाहरण: for file in *.mxf; do ffmpeg -i "$file" -map 0 -c copy "${file%.mxf}.mov"; done
    • .sh file और प्रोसेस की जाने वाली .mxf files एक ही directory में होनी चाहिए, और command उसी directory से चलाना चाहिए
    • recursive processing के लिए find input_directory -iname "*.mxf" -exec ffmpeg -i {} -map 0 -c copy {}.mov \; का उपयोग किया जा सकता है
  • Windows में PowerShell .ps1 script से batch processing की जाती है
    • उदाहरण में .mp4 files की list बनाई जाती है और हर file का extension बदलकर .mkv करके remux किया जाता है
    • ffmpeg को full path के बिना call करने के लिए उसका सही तरह से configured होना ज़रूरी है
  • decoder errors की जाँच ffmpeg -i input_file -f null - से output file बनाए बिना decode करके की जाती है, और errors स्क्रीन पर दिखाए जाते हैं
  • FFV1 Version 3 fixity verification -report -i input_file -f null - से CRC checksum mismatch की जाँच करता है
    • Frame CRC, FFV1 Version 3 में default रूप से enabled होता है
  • frame-by-frame video MD5 -f framemd5 -an से generate किया जाता है
  • audio sample groups के लिए MD5 asetnsamples=n=48000 -f framemd5 -vn से generate किया जाता है
    • sample groups की संख्या को media sample rate के साथ match करना अच्छी प्रथा माना जाता है
    • default रूप से audio को 16-bit PCM में transcode करके framemd5 बनाया जाता है
  • stream MD5 वीडियो और ऑडियो streams को अलग-अलग -map करके और -c copy -f md5 से बनाया जा सकता है
    • इसका उपयोग container metadata changes से स्वतंत्र रूप से A/V information integrity verify करने के लिए होता है
  • streamhash सभी streams के लिए stream-wise hash output करता है
    • कितने streams हैं यह पहले से जाने बिना mixed born-digital material hashing के लिए यह उपयोगी है
  • QCTools report ffprobe -f lavfi और signalstats, cropdetect, idet, psnr, ssim, ebur128, astats आदि का उपयोग करके .qctools.xml.gz generate करती है
    • audio वाली files और बिना audio वाली files के लिए अलग commands दिए गए हैं
  • EIA-608 Line 21 closed captions extraction में readeia608 filter और ffprobe का उपयोग करके hex values को CSV के रूप में output किया जाता है

टेस्ट फ़ाइलें और अन्य FFmpeg उदाहरण

  • टेस्ट वीडियो mandelbrot, smptebars, testsrc, smptehdbars जैसे lavfi input से बनाया या चलाया जा सकता है
    • Mandelbrot उदाहरण 1280x720, 25fps, 10 सेकंड का H.264 output है
    • SMPTE bars उदाहरण 720x576, 25fps, 10 सेकंड का ProRes output है
    • HD SMPTE bars चलाने के लिए ffplay -f lavfi -i smptehdbars=size=1920x1080
    • VGA SMPTE bars चलाने के लिए ffplay -f lavfi -i smptebars=size=640x480
  • sine wave test audio sine=frequency=1000:sample_rate=48000:duration=5 और pcm_s16le से WAV फ़ाइल बनाता है
  • SMPTE bars और 1kHz sine wave को मिलाने वाला test video दो lavfi inputs और -c:v ffv1, -c:a pcm_s16le का उपयोग करता है
  • damaged test file -bsf noise=1 -c copy से packet content को जानबूझकर खराब करता है, लेकिन container को खराब नहीं करता
  • Conway's Game of Life को ffplay -f lavfi life=... से simulate किया जाता है, और ffmpeg तथा -t 5 का उपयोग करने पर उसका एक हिस्सा save किया जा सकता है
  • दो वीडियो की perceptual similarity तुलना के लिए signature=detectmode=full:nb_inputs=2 filter का उपयोग होता है
  • input video का perceptual hash signature=format=xml:filename="output.xml" से XML फ़ाइल बनाता है
  • image sequence को ffplay -framerate 5 input_file_%06d.ext से वीडियो बनाए बिना सीधे चलाया जा सकता है
  • audio और video track अलग करने के लिए -map 0:v:0 और -map 0:a:0 का उपयोग होता है
  • audio और video track merge करने के लिए -map 0:v -map 1:a -c copy से पहली फ़ाइल का video और दूसरी फ़ाइल का audio जोड़ा जाता है
  • DVD access के लिए ISO बनाने हेतु MPEG फ़ाइल -aspect 4:3 -target ntsc-dvd output_file.mpg से बनाई जाती है, और dvdauthor install होना ज़रूरी है
  • YDIF-आधारित scene detection के लिए CSV, ffprobe और signalstats के lavfi.signalstats.YDIF मान को output करता है
  • head switching noise को drawbox=w=iw:h=7:y=ih-h:t=max से frame के निचले हिस्से में काला box बनाकर छिपाया जा सकता है
  • RTMP target पर live streaming और local MP4 recording एक साथ करने के लिए tee muxer का उपयोग होता है
    • input को 1280px चौड़ाई तक scale किया जाता है, और तय समय के बाद stream बंद कर दी जाती है
    • उदाहरण में यह नोट शामिल है कि इसे लगभग 4 साल तक असली TV show live streaming में रोज़ाना इस्तेमाल किया गया
  • किसी विशेष decoder, encoder, demuxer, muxer, filter की जानकारी ffmpeg -h type=name से देखी जा सकती है
    • उदाहरण हैं encoder=libx264, decoder=mp3, muxer=matroska, demuxer=mov, filter=crop

FFmpeg के साथ परिचित कराए गए संबंधित टूल

  • CDDA ripping tool, CD drive offset जाँचने और audio CD को सही तरह rip करने से जुड़ा है
    • अलग-अलग CD drive models में reading start position अलग हो सकती है, इसलिए एक ही content के checksum verification के लिए offset correction ज़रूरी है
    • drive पहचान cdda2wav -scanbus, cdda2wav, cdparanoia -vsQ से की जा सकती है
    • offset Accurate Rip CD drive offset list में मिलता है
    • macOS GUI tool के रूप में XLD का परिचय दिया गया है
  • CD Paranoia ripping में cdparanoia -L -B -O [Drive Offset] [Starting Track Number]-[Ending Track Number] output_file.wav का उपयोग होता है
    • -B batch mode है, जो tracks को अपने-आप अलग-अलग फ़ाइलों में बाँट देता है
  • Cdda2wav, Paranoia library का उपयोग करके audio CD को सही तरह rip करने वाला tool है
    • Homebrew install command brew install cdrtools है
    • उदाहरण command पूरी CD को एक WAV में rip करता है, CDDB lookup करता है, और cue sheet बनाता है
    • macOS में command चलाने से पहले CD को unmount करना चाहिए
  • CD emphasis को noise reduction की ऐसी विधि के रूप में बताया गया है जो कुछ शुरुआती 1980s CDs और Japan pressing CDs को प्रभावित कर सकती है
    • इसकी मौजूदगी cdda2wav -J या cdparanoia -Q से जाँची जाती है
    • Cdda2wav से ripping के दौरान correction करने के लिए -T flag जोड़ें
  • ImageMagick raster image और vector image files को display, convert, edit करने वाला free open source software suite है
    • commands को convert, montage, mogrify जैसे अलग-अलग commands के रूप में चलाया जाता है
    • image comparison में compare -metric ae image1.ext image2.ext null: अलग-अलग pixels की संख्या लौटाता है
    • thumbnail बनाने के लिए mogrify -resize 80x80 -format jpg -quality 75 -path thumbs *.jpg का उपयोग करें
    • image grid montage @list.txt -tile 6x12 -geometry +0+0 output_grid.jpg से बनती है
    • EXIF हटाने के लिए mogrify -path ./stripped/ -strip *.jpg का उपयोग होता है
  • flac tool, FLAC project द्वारा बनाया गया FLAC transcoding और metadata manipulation tool है
    • दूसरे tools की तुलना में इसका फ़ायदा यह है कि यह BWF जैसी foreign metadata embed कर सकता है
    • WAV से FLAC में बदलते समय BWF metadata बनाए रखने के लिए flac --best --keep-foreign-metadata --preserve-modtime --verify input.wav का उपयोग करें
    • FLAC से मूल BWF को फिर से बनाने के लिए --best की जगह --decode का उपयोग करें

1 टिप्पणियां

 
GN⁺ 2023-07-31
Hacker News की राय
  • थोड़ा विषय से हटकर, लेकिन मेरे हिसाब से ffmpeg अब तक बने सॉफ्टवेयर में सबसे बेहतरीन में से एक है
    Fabrice Bellard जैसे प्रतिभाशाली इंजीनियर FOSS कम्युनिटी के लिए बहुत बड़ा उपहार हैं, और जिस लगभग 2 अरब डॉलर वैल्यू वाले unicorn में मैं पहले काम करता था, उसके product का बड़ा हिस्सा भी ffmpeg पर निर्भर था

    • तो फिर उन्होंने काफी बड़ी रकम donate की होगी?
      https://ffmpeg.org/donations.html
    • “Fabian Fabrice” नहीं, Fabrice Bellard हैं
      QEMU, TCC, QuickJS वगैरह भी उन्होंने ही बनाए हैं
    • उनके जैसा कोई नहीं है। Fabrice Bellard की league में भी कोई नहीं, और सच कहें तो लगता है कोई वही game खेल भी नहीं रहा :-)
      गंभीरता से कहें तो, किसी भी समय जिन devices पर उनका लिखा code चल रहा होता है, उनकी संख्या सच में अविश्वसनीय है
    • संदर्भ के लिए, “FFmpeg” में “FF” का मतलब “fast forward” है
    • ffmpeg पसंद है, लेकिन ARM performance बेहतर होनी चाहिए
  • ffmpeg command line अच्छे guide देखने के बाद भी सिर पकड़ने पर मजबूर कर देती है, इसलिए मैं VapourSynth recommend करना चाहूंगा
    https://www.vapoursynth.com/
    यह optimized Python-style video filtering tool है, लेकिन उससे भी काफी ज्यादा: https://vsdb.top/
    और StaxRip ffmpeg, VapourSynth, दर्जनों encoders और tools का अच्छी तरह इस्तेमाल करता है; इसी वजह से मैं Linux से Windows में reboot तक कर लेता हूं: https://github.com/staxrip/staxrip

    • बेहतर command line interface वाला सिर्फ एक ffmpeg wrapper भी हो तो सच में बहुत अच्छा होगा
      यह अनावश्यक रूप से complex है, और हो सकता है किसी नज़रिए से पूरी संरचना समझ में आती हो, लेकिन बहुत common tasks के लिए जादुई मंत्र जैसे options जानना पड़ना ठीक नहीं है
      मेरे पास शायद दर्जनों bash aliases हैं जो 150 characters वाले ffmpeg commands को दो शब्दों में बदल देते हैं
      ffprobe भी समझ से परे है: 99% मामलों में इसे बिना arguments के चलाकर बस length, resolution, framerate, audio tracks की संख्या जल्दी देखनी होती है, लेकिन output का 99% compilation options जैसी पूरी तरह irrelevant चीजें होती हैं
  • साथ में देखने लायक resources:
    https://ffmpeg.guide/ — complex FFmpeg filter graphs जल्दी और सटीक तरीके से बनाना
    https://www.hadet.dev/ffmpeg-cheatsheet/ — काटना, fade in/out जोड़ना, scaling, concatenate करना आदि

    • दूसरे link में trimming command मेरे अनुभव में ideal नहीं था
      किसी अज्ञात वजह से ffmpeg -ss और -t/-to flags को -i से पहले या बाद में रखने पर अलग तरह से behave करता है, और मेरे मामले में उन्हें पहले रखना बेहतर चला
      original text में भी यही समस्या है
    • ffmpeg.guide शानदार दिखता है, लेकिन लगता है कि ffmpeg में ही कुछ बेहतर होना चाहिए
      non-linear graph को flat और linear command line में जबरन फिट करना अजीब है
      बस ज्यादा detailed JSON configuration भी हो तो काफी बेहतर होगा
    • ffmpeg.guide सच में अच्छा है। क्या ImageMagick के लिए भी कुछ ऐसा है?
    • बस ffmpeg-python इस्तेमाल कर लो
  • बहुत उपयोगी
    ffmpeg commands बनाने के लिए मैंने ChatGPT इस्तेमाल करना शुरू किया है, और जो चाहिए उसे ढूंढना काफी तेज और आसान हो गया है
    command line से सीधे कर सकूं, इसके लिए एक छोटा tool भी बनाया है: https://github.com/alexkrkn/help-cli
    इससे जुड़ा video भी बनाया है: https://www.youtube.com/watch?v=pOda6TDBqcY

  • हाल में ffmpeg UI ढूंढते हुए मुझे Shutter Encoder मिला, और यह open source है व mac/windows support करने वाला बहुत अच्छा software निकला
    आखिरकार मैंने 15 साल के 300GB personal video collection को compress करना शुरू किया
    https://www.shutterencoder.com/
    सब कुछ H.265 में compress कर रहा हूं, और video size कभी-कभी 1/10 तक घट जाता है। ऐसा न करने की कोई वजह है? मैंने पढ़ा है कि compressed videos play करने के लिए ज्यादा processing power चाहिए, लेकिन आगे चलकर यह बड़ा मुद्दा बनेगा या नहीं, पक्का नहीं है

    • मैंने इसे बड़े video collection पर automatically apply करके देखा, test video में ठीक दिखा, लेकिन CRF settings weak थीं, इसलिए quality उम्मीद से कम रही
      इसे original files delete करने से पहले कई videos verify करने की चेतावनी मानें
      हालांकि 300GB के लिए storage काफी सस्ता है, इसलिए original वैसे ही रख सकते हैं
    • अब भी H.264 चुनने की एक वजह यह है कि पुराने hardware या low-end hardware में अक्सर H.265 hardware decoding नहीं होती
      और Plex में transcoding के बिना इस्तेमाल करने के लिए मेरे homelab में भी वह ज्यादा आसान है
  • यह guide deinterlacing filter के लिए yadif recommend करता है, लेकिन मेरी नज़र में w3fdif बेहतर लगता है
    यह yadif की तरह motion tracking नहीं करता, इसलिए काफी fast है, और motion tracking से कभी-कभी बनने वाले परेशान करने वाले artifacts से बचा जा सकता है
    कभी शानदार और कभी खराब result से बेहतर है कि consistently बस ठीक-ठाक result मिले
    हालांकि yadif जहां दो fields देखता है, वहीं w3fdif एक बार में तीन fields consider करता है, इसलिए interlacing artifacts को बेहतर छिपाता है

    • इसका expanded version है: https://github.com/HomeOfVapourSynthEvolution/VapourSynth-Bw...
      अगर वैसे भी re-encode करना है, तो सीधे QTGMC तक इस्तेमाल करना बेहतर है
    • जैसा ऊपर बताया गया, w3fdif को आम तौर पर bwdif ने replace कर दिया है
      w3fdif shimmering पैदा कर सकता है, लेकिन yadif नहीं करता; इसलिए bwdif yadif की तरह behave करते हुए w3fdif की बेहतर field matching इस्तेमाल करता है
    • bwdif दरअसल yadif और w3fdif का hybrid है
  • ffmpeg अपनाने की सबसे बड़ी बाधा शायद ऑफलाइन premium freemium tools और web frontends ही होंगे
    साइट्स ने “avi to mp4”, “mp3 to wav” जैसे उन phrases के लिए search optimization कर रखा है जिन्हें लोग आम तौर पर Google में डालते हैं
    command-line app को स्वीकार करने में उम्मीद से ज़्यादा समय लगा, क्योंकि Windows दुनिया ने हमें सिखा दिया था कि हर चीज़ के लिए GUI होना चाहिए

    • मुझे लगता था कि ऐसी ज़्यादातर file conversion sites का ढांचा nginx जैसी किसी चीज़ के ऊपर ffmpeg चलाने वाला होता होगा
  • लोग कहते हैं कि ffmpeg जटिल है, लेकिन इसे शानदार GUI में बना देने से भी यह खास आसान नहीं हो जाता। जटिल चीज़ video compression itself है
    HandBrake जैसे click-based interface की तरह आपकी जगह फैसले लेने वाले तरीके के बिना, शायद कोई भी software इसे और आसान नहीं बना सकता
    पक्का नहीं, लेकिन digital video encoding और compression को पर्याप्त गहराई से सीख लेने के बाद ffmpeg में क्या करना है यह भी काफी intuitive लगने लगेगा। क्या किसी ने सच में ऐसा करके देखा है?

    • करीब 17 साल पहले WindowsMobile के लिए DirectShow filter लिखा था, इसलिए codecs और containers की मुझे अच्छी समझ है
      उस समय mkv जैसे formats या HEVC जैसे codecs नहीं थे, लेकिन कई filters के जरिए audio/video को manipulate करने का concept शानदार है और ज़्यादातर A/V conversion software ऐसे ही काम करता है
      FFmpeg manual page देखना शुरू किया तो connections समझ आने लगे, और करीब एक दिन इस्तेमाल करने के बाद इसे काम में लेने लायक हो गया
      मुझे command line पसंद है और मैं man pages पढ़ता हूं, शायद यह मेरे पक्ष में गया
  • ffmpeg शक्तिशाली है इसलिए अक्सर इस्तेमाल करता हूं, लेकिन इसकी API structure दिमाग में बैठती नहीं। कोई LLM frontend हो तो अच्छा होगा

    • API मेरे दिमाग में भी ठीक से नहीं बैठती, लेकिन आम तौर पर https://ffmpeg.org/ffmpeg-all.html में grep करके जरूरी option मिल जाता है
  • अच्छा idea है। FFmpeg से मनचाहा काम करवाना हमेशा बोझिल लगता है
    ChatGPT मददगार रहा है, लेकिन perfect नहीं था

    • ChatGPT की वजह से कई command-line tools के arguments और options इस्तेमाल करना आसान हो गया है
      OpenSSL options और arguments याद रखना हमेशा मुश्किल था, अब मैं बस GPT इस्तेमाल करता हूं
    • ChatGPT की वजह से ffmpeg सच में बहुत accessible हो गया है
      हालांकि operating systems के बीच सूक्ष्म फर्क छोटे issue के रूप में बाकी हैं