कंटेंट पर जाएँ
charmotion

ट्रांसपेरेंट WebM को हर स्टिकर फ़ॉर्मेट में बदलें

Charmotion टीम द्वारा · अपडेट:

स्टिकर और emoji गाइड का कवर इलस्ट्रेशन: ट्रांसपेरेंट WebM को हर स्टिकर फ़ॉर्मेट में कन्वर्ट करें, Charmotion के डेमो कैरेक्टर के साथ

-c:v libvpx-vp9 को -i से पहले रखें ताकि ffmpeg WebM का alpha डिकोड करे, फिर टारगेट के लिए एनकोडर चुनें: Telegram के लिए yuva420p के साथ libvpx-vp9, WhatsApp के लिए -loop 0 के साथ libwebp_anim, GIF के लिए palettegen और paletteuse, और Discord या iMessage के लिए APNG muxer।

मुख्य बातें

  • ffmpeg का बिल्ट-इन VP9 डिकोडर WebM alpha को नज़रअंदाज़ करता है; -i से पहले -c:v libvpx-vp9 लगाकर libvpx को ज़बरदस्ती चुनें।
  • alpha मौजूद होने पर भी ffprobe अक्सर yuv420p दिखाता है; ALPHA_MODE=1 ढूँढें।
  • एनिमेटेड WebP को -loop 0 चाहिए, क्योंकि libwebp_anim डिफ़ॉल्ट रूप से सिर्फ़ एक बार चलाता है।
  • GIF सिर्फ़ on/off ट्रांसपेरेंसी रखता है; APNG और WebP मुलायम किनारे बनाए रखते हैं।
  • यहाँ दिए सभी पाँच कमांड ffmpeg 7.1.1 पर, alpha सुरक्षित रखे हुए 1080×1080 ट्रांसपेरेंट WebM के साथ चलाकर देखे गए हैं।

पहले से कोई कैरेक्टर या लोगो है? अपने कैरेक्टर को असली ऐप स्क्रीन में देखें: स्प्लैश, ऑनबोर्डिंग, लोडिंग और एम्प्टी स्टेट स्क्रीन। यह फ़्री है, आपके ब्राउज़र में चलता है और कुछ भी अपलोड नहीं होता।

ffmpeg मेरे WebM की ट्रांसपेरेंसी क्यों हटा देता है?

ट्रांसपेरेंट VP9 WebM, alpha को कलर फ़्रेम के साथ डेटा की एक अलग स्ट्रीम के रूप में स्टोर करता है। ffmpeg का नेटिव VP9 डिकोडर कलर फ़्रेम पढ़ता है और alpha को नज़रअंदाज़ कर देता है, इसलिए फ़्रेम बिना ट्रांसपेरेंसी के (opaque) निकलते हैं। यह लंबे समय से चला आ रहा, कम्युनिटी द्वारा डॉक्यूमेंट किया गया व्यवहार है, और ffmpeg 7.1.1 पर लोकल टेस्ट में भी यही हुआ।

इसका हल है codec ऑप्शन को -i से पहले रखकर इनपुट के लिए libvpx डिकोडर चुनना:

ffmpeg -c:v libvpx-vp9 -i character.webm ...

-i के बाद रखने पर यही ऑप्शन आउटपुट के लिए एनकोडर चुनता है, इसीलिए कई कमांड में यह दो बार होता है। libvpx डिकोडिंग के साथ लोकल टेस्ट में RGBA फ़्रेम मिले जिनमें 75% पिक्सेल ट्रांसपेरेंट थे, जैसा खाली बैकग्राउंड पर किसी कैरेक्टर के लिए अपेक्षित है।

किसी फ़ाइल में alpha है या नहीं, यह जाँचने के लिए pixel format वाली लाइन पर भरोसा न करें। ffprobe आमतौर पर alpha WebM के लिए pix_fmt=yuv420p दिखाता है; भरोसेमंद संकेत ALPHA_MODE=1 स्ट्रीम टैग है:

ffprobe -v error -show_streams character.webm | grep -i alpha
ग्रेडिएंट पर अल्फ़ा चैनल वाले स्मूथ किनारे और one-bit GIF के टेढ़े-मेढ़े किनारे की ज़ूम की गई तुलना

कौन-सी ffmpeg कमांड Telegram वीडियो स्टिकर बनाती है?

Telegram को VP9 वाली .WEBM चाहिए, जिसकी एक साइड ठीक 512 px हो, अधिकतम 3 सेकंड, 30 fps तक, अधिकतम 256 KB और कोई ऑडियो स्ट्रीम न हो:

ffmpeg -c:v libvpx-vp9 -i character.webm -t 3 -vf "fps=30,scale=512:512:force_original_aspect_ratio=decrease" -c:v libvpx-vp9 -pix_fmt yuva420p -b:v 0 -crf 40 -deadline good -an sticker.webm

लोकल टेस्ट में इससे 512×512, 3.000 सेकंड की 27 KB फ़ाइल बनी, जिसमें ALPHA_MODE=1 मौजूद था। आउटपुट में alpha -pix_fmt yuva420p की वजह से बना रहता है; -an ऑडियो हटा देता है। 100×100 के custom emoji के लिए:

ffmpeg -c:v libvpx-vp9 -i character.webm -t 3 -vf "fps=30,scale=100:100" -c:v libvpx-vp9 -pix_fmt yuva420p -b:v 0 -crf 40 -an emoji.webm

इसके बाद byte count जाँचें:

ls -l sticker.webm  # must be <=262144 bytes for Telegram; lower -crf → bigger file, raise crf (e.g. 45-50) or fps 24 to shrink

अगर फ़ाइल 262,144 bytes से बड़ी है, तो CRF को 45 या 50 तक बढ़ाएँ, या fps=24 पर आ जाएँ। realtime setting की तुलना में साइज़ और क्वालिटी का बेहतर संतुलन पाने के लिए -deadline good ही रखें। -t 3 वाला कट आउटपुट पर लागू होता है, इसलिए लंबा source बस ट्रिम हो जाता है; ध्यान रखें कि कट पॉइंट किसी मोशन को बीच में न काटे। अपलोड के पूरे स्टेप कैरेक्टर एनिमेशन से Telegram वीडियो स्टिकर में दिए गए हैं।

WhatsApp के लिए animated WebP कौन-सी कमांड बनाती है?

WhatsApp को animated WebP ठीक 512×512 साइज़ में चाहिए, 500 KB या उससे कम, हर फ़्रेम कम से कम 8 ms का और कुल अवधि 10 सेकंड या उससे कम:

ffmpeg -c:v libvpx-vp9 -i character.webm -vf "fps=15,scale=512:512:force_original_aspect_ratio=decrease,pad=512:512:-1:-1:color=0x00000000" -c:v libwebp_anim -lossless 0 -quality 60 -loop 0 -an sticker.webp
  • pad फ़िल्टर स्केल किए गए कैरेक्टर को 512×512 के ट्रांसपेरेंट कैनवास के बीच में रखता है, ताकि non-square source भी सटीक साइज़ की शर्त पूरी करें।
  • -lossless 0 -quality 60 alpha के साथ lossy WebP है। FFmpeg के docs के अनुसार "Alpha is supported for either mode.", यानी alpha दोनों मोड में सपोर्ट होता है।
  • -loop 0 ज़रूरी है। libwebp_anim encoder का loop default 1 है, जिससे एनिमेशन सिर्फ़ एक बार चलता है।

लोकल आउटपुट: webpinfo के अनुसार 512×512, animated, alpha मौजूद, loop count 0। अगर फ़ाइल 500 KB से बड़ी है, तो quality को 45 की ओर या fps को 12 की ओर घटाएँ। ज़्यादा जानकारी WhatsApp Animated Stickers: स्पेक्स और कन्वर्ज़न में है।

halo के बिना ट्रांसपेरेंट GIF कैसे बनाएँ?

एक ही filter graph में असली फ़्रेम से palette बनाएँ और transparency के लिए एक entry रिज़र्व रखें:

ffmpeg -c:v libvpx-vp9 -i character.webm -filter_complex "fps=15,scale=128:128:flags=lanczos,split[a][b];[a]palettegen=reserve_transparent=1[p];[b][p]paletteuse=alpha_threshold=128" -loop 0 emoji.gif
  • split[a][b] फ़्रेम को दो branches में भेजता है।
  • palettegen=reserve_transparent=1 "a palette of 255 colors maximum" (अधिकतम 255 रंगों का palette) बनाता है और आखिरी रंग transparency के लिए रिज़र्व रखता है; यही default है।
  • paletteuse=alpha_threshold=128 threshold से नीचे वाले pixels को पूरी तरह ट्रांसपेरेंट कर देता है; 128 default है।
  • -loop 0 हमेशा लूप करता है, यह GIF muxer का default है (-1 लूपिंग बंद कर देता है)।

लोकल आउटपुट: transparency के साथ 128×128। halo आमतौर पर उन GIF में आते हैं जो solid matte पर बनाए गए हों; असली alpha से काम करने पर यह समस्या नहीं आती। फिर भी किनारे threshold से तय होते हैं, क्योंकि GIF में transparency या तो ऑन होती है या ऑफ़। जहाँ प्लेटफ़ॉर्म APNG या WebP स्वीकार करता हो, वहाँ soft edges के लिए उन्हीं का इस्तेमाल करें। GIF के frame delay एक centisecond से कम नहीं हो सकते।

Discord या iMessage के लिए APNG कैसे बनाएँ?

ffmpeg का APNG muxer पूरे 8-bit alpha के साथ animated PNG लिखता है:

ffmpeg -c:v libvpx-vp9 -i character.webm -vf "fps=15,scale=320:320" -plays 0 -f apng sticker.png

-plays 0 हमेशा लूप करता है; FFmpeg के docs के अनुसार "0 causes an infinite loop, with 1 there is no loop.", यानी 0 पर अनंत लूप और 1 पर कोई लूप नहीं। लोकल आउटपुट: 320×320 RGBA। यह Discord के 320×320 स्टिकर साइज़ से मेल खाता है; iMessage के लिए small, regular या large के हिसाब से scale को 300, 408 या 618 px करें।

APNG फ़्रेम lossless होते हैं, इसलिए frame rate, अवधि और dimensions के साथ फ़ाइल साइज़ बढ़ता जाता है। Discord स्टिकर में 512 KiB और iMessage स्टिकर में 500 KB की सीमा है, इसलिए सीमा पार होने पर fps घटाएँ या क्लिप छोटी करें।

Discord animated स्टिकर को 5 सेकंड तक भी सीमित रखता है, इसलिए source लंबा हो तो input के बाद -t 5 जोड़ें। ffmpeg APNG को .png extension के साथ लिखता है, और दोनों प्लेटफ़ॉर्म यही उम्मीद करते हैं; जो टूल APNG animation chunks को नज़रअंदाज़ करते हैं, उनमें फ़ाइल फिर भी still image की तरह खुलती है, इसलिए यह पक्का करने के लिए कि वह चलती है, उसे browser में प्रीव्यू करें।

कौन-सा फ़ॉर्मेट क्या बनाए रखता है?

आउटपुटअल्फ़ालूप सेटिंगffmpeg encoder या muxerकहाँ इस्तेमाल होता है
VP9 WEBM8-bit (yuva420p के साथ)प्लेयर लूप करता हैlibvpx-vp9Telegram स्टिकर और emoji
Animated WebP8-bit-loop 0 (डिफ़ॉल्ट 1)libwebp_animWhatsApp
GIFऑन/ऑफ़ (एक रंग)-loop 0 (डिफ़ॉल्ट)GIF एनकोडर + palettegen/paletteuseSlack, Discord इमोजी, iMessage
APNG8-bit-plays 0APNG muxerDiscord स्टिकर, iMessage

source भी कमांड जितना ही मायने रखता है। यहाँ ट्रांसपेरेंट VP9 WebM सबसे भरोसेमंद master है। GIF से शुरू करें तो शुरुआती -c:v libvpx-vp9 हटा दें; आपको उसके hard edges ही मिलेंगे। HEVC-alpha .mov के लिए भी यह option हटा दें, लेकिन इन टेस्ट में ffmpeg में HEVC alpha की decoding की पुष्टि नहीं हुई, इसलिए दोनों फ़ाइलें हों तो WebM से कन्वर्ट करें।

अपलोड करने से पहले alpha और फ़ाइल साइज़ कैसे जाँचें?

हर फ़ाइल पर तीन जाँच करें:

  1. Dimensions और अवधि: ffprobe -v error -show_entries stream=width,height:format=duration sticker.webm
  2. Alpha: WebM के लिए ALPHA_MODE=1 देखें या WebM को ट्रांसपेरेंट वीडियो चेकर में डालें; WebP के लिए webpinfo alpha flag दिखाता है; GIF और APNG के लिए फ़ाइल को रंगीन बैकग्राउंड पर खोलें।
  3. Bytes: ls -l चलाएँ और bytes में सीमा से तुलना करें: Telegram के 256 KB और Discord के 256 KiB emoji के लिए 262,144, Discord के 512 KiB स्टिकर के लिए 524,288।

Charmotion अपलोड किए गए कैरेक्टर, मैस्कॉट या लोगो से कुछ ही मिनटों में .riv फ़ाइल के रूप में 17 एनिमेशन बनाता है। 1080×1080 पर ट्रांसपेरेंट WebM (VP9 alpha) और MOV (HEVC alpha), MP4 और 480 px GIF ज़रूरत पर एक्सपोर्ट होते हैं, लगभग एक मिनट में। यह स्टिकर पैक एक्सपोर्ट नहीं करता, लेकिन इसका ट्रांसपेरेंट WebM (पेड प्लान, $20/माह से) ठीक वैसी मास्टर फ़ाइल है जिसकी इस पेज का हर कमांड character.webm के रूप में उम्मीद करता है।

ffmpeg से ट्रांसपेरेंट WebM को स्टिकर फ़ॉर्मेट में कैसे कन्वर्ट करें

  1. पक्का करें कि source में alpha है. ffprobe चलाएँ और ALPHA_MODE=1 टैग देखें।
  2. libvpx से decode करें. हर कमांड ffmpeg -c:v libvpx-vp9 -i character.webm से शुरू करें।
  3. target encoder चुनें. Telegram के लिए yuva420p के साथ libvpx-vp9, WhatsApp के लिए -loop 0 के साथ libwebp_anim, GIF के लिए palettegen/paletteuse, या APNG के लिए -f apng -plays 0 इस्तेमाल करें।
  4. प्लेटफ़ॉर्म का साइज़ और लंबाई मिलाएँ. 512, 100, 320, 128 या iMessage साइज़ पर scale करें, और जहाँ अवधि की सीमा हो वहाँ -t से ट्रिम करें।
  5. जाँचें. अपलोड करने से पहले dimensions, अवधि, alpha और byte count को प्लेटफ़ॉर्म की सीमा से मिलाकर देखें।

अक्सर पूछे जाने वाले सवाल

मेरे ट्रांसपेरेंट WebM के लिए ffprobe yuv420p क्यों दिखाता है?

जिन VP9 WebM में alpha होता है, उनके लिए भी ffprobe अक्सर yuv420p दिखाता है, क्योंकि alpha मुख्य color frames से अलग स्टोर होता है। इसके बजाय ALPHA_MODE=1 stream tag देखें। अगर यह टैग मौजूद है, तो transparency पाने के लिए -i से पहले -c:v libvpx-vp9 लगाकर decode करें।

क्या lossy WebP transparency बनाए रख सकता है?

हाँ। FFmpeg के libwebp documentation के अनुसार alpha, lossy और lossless दोनों मोड में सपोर्ट होता है। लगभग 45-60 की -quality वाला lossy मोड animated स्टिकर को WhatsApp की 500 KB सीमा से काफ़ी नीचे रखता है, जबकि उसी एनिमेशन की lossless फ़ाइलें आमतौर पर कहीं बड़ी होती हैं और सीमा में फ़िट करना मुश्किल होता है।

क्या मैं MP4 को ट्रांसपेरेंट स्टिकर में कन्वर्ट कर सकता हूँ?

असली ट्रांसपेरेंसी के साथ नहीं। सामान्य H.264 MP4 में अल्फ़ा चैनल नहीं होता, इसलिए हर पिक्सेल अपारदर्शी होता है। आपको एक जैसे रंग वाला बैकग्राउंड key out करना पड़ेगा, जिससे किनारे खुरदुरे रह जाते हैं। इसके बजाय VP9-alpha WebM, ProRes 4444 मास्टर या ट्रांसपेरेंसी वाले PNG sequence से शुरू करें।

इस गाइड से झटपट जवाब

स्रोत

संबंधित गाइड