मेरे पास x फ़ाइल है जिसमें mp3 फाइलों की एक सूची है जहां मैं प्रत्येक mp3 फ़ाइल को mp4 में कनवर्ट करना चाहता हूं > स्थिर .png फ़ोटो वाली फ़ाइल।

ऐसा लगता है कि यहां ffmpeg का उपयोग करने का एकमात्र तरीका है, लेकिन इसे प्राप्त करने का तरीका नहीं है।

मैंने mp3 फोल्डर और एक .png फोटो` का इनपुट लेने के लिए स्क्रिप्ट बनाई।

तो यह नया फ़ोल्डर x-converted बनाएगा जहां मैं प्रत्येक mp3 को mp4 में स्थिर png के साथ समान नाम के साथ बदलना चाहता हूं जैसे file1.mp3 बनने के लिए file1.mp4

यहाँ मेरा कोड है:

import os
import sys
from pathlib import Path
import shutil

if len(sys.argv) != 3 or not sys.argv[2].endswith("png"):
    print("Make sure to provide two arguments only\nSecond arugment should be .png")
    exit()


def CheckFile():
    try:
        files = []
        for path in os.listdir(sys.argv[1]):
            full_path = os.path.join(sys.argv[1], path)
            if os.path.isfile(full_path):
                files.append(full_path)
        mp3 = [x for x in files if x.endswith(".mp3")]
        if len(mp3) >= 1:
            return mp3, sys.argv[2], sys.argv[1]
        else:
            print(
                "Make Sure That You've at least 1 Mp3 file")
            exit()
    except FileNotFoundError:
        print("Sorry, This File Is Not Exist!")
        exit()


def Convert():
    mp3, jpg, name = CheckFile()
    name = f"{Path(name).name}-converted"
    shutil.rmtree(name, ignore_errors=True)
    os.mkdir(name)
    os.chdir(name)
    # from here i don't know how to use `ffmpeg`


Convert()
0
αԋɱҽԃ αмєяιcαη 15 अक्टूबर 2020, 18:54

2 जवाब

सबसे बढ़िया उत्तर
ffmpeg -loop 1 -framerate 1 -i image.png -i audio.mp3 -map 0:v -map 1:a -r 10 -vf "scale='iw-mod(iw,2)':'ih-mod(ih,2)',format=yuv420p" -movflags +faststart -shortest -fflags +shortest -max_interleave_delta 100M output.mp4
  • -loop 1 अनिश्चित काल के लिए input.png लूप बनाता है।
  • -framerate 1 input.png इनपुट फ्रेम दर को 1 fps पर सेट करता है।
  • -map 0 -map 1:a, image.png से वीडियो और audio.mp3 से केवल ऑडियो चुनता है। यदि image.png एमपी3 से जुड़ी किसी एल्बम/कवर आर्ट से छोटा है, तो इसकी आवश्यकता है। अन्यथा यह इसके बजाय एल्बम/कवर कला चुन सकता है। अधिक जानकारी के लिए FFmpeg Wiki: Map देखें।
  • -r 10 आउटपुट फ्रेम दर को 10 एफपीएस पर सेट करता है। इनपुट को 1 एफपीएस पर और आउटपुट को 10 एफपीएस पर सेट करना दो कारणों से है: <उल>
  • शुरुआत में इनपुट को 10 एफपीएस के रूप में सेट करने की तुलना में 1 एफपीएस और डुप्लीकेट फ्रेम को 10 एफपीएस के रूप में इनपुट करना तेज है। यह एन्कोडिंग को तेज़ बनाता है।
  • अधिकांश खिलाड़ी ~6 fps या इससे कम के तहत कुछ भी नहीं खेल सकते हैं। 10 एक सुरक्षित मान है।
  • scale='iw-mod(iw,2)':'ih-mod(ih,2)' आउटपुट की चौड़ाई और ऊंचाई दोनों को सुनिश्चित करने के लिए स्केल फिल्टर का उपयोग करता है 2 से विभाज्य जो कुछ एन्कोडर के लिए एक आवश्यकता है। यह आपको इनपुट के रूप में किसी भी मनमाने आकार की छवि का उपयोग करने की अनुमति देता है। अन्यथा आपको त्रुटि मिल सकती है: width not divisible by 2
  • format=yuv420p फॉर्मेट फ़िल्टर आउटपुट को YUV 4:2:0 chroma सबसैंपलिंग का उपयोग करता है प्लेबैक संगतता के लिए।
  • -movflags +faststart वीडियो को तेजी से चलना शुरू करता है।
  • -shortest आउटपुट को audio.mp3 तक लंबा बनाता है। इसकी आवश्यकता है क्योंकि -loop 1 का उपयोग किया गया था।
  • -fflags +shortest -max_interleave_delta 100M -shortest से संबंधित है और कुछ मामलों में ffmpeg द्वारा अजीब व्यवहार के कारण आवश्यक है। स्पष्टीकरण के लिए मेरा ffmpeg आउटपुट अंत में हमेशा अतिरिक्त 30s साइलेंस जोड़ें देखें।
  • 1
    llogan 15 अक्टूबर 2020, 21:19

    कुछ पुस्तकालय जैसे ffmpy और ffmpeg-python आपको अजगर के साथ ffmpeg संचालित करने में सक्षम कर सकते हैं, इन्हें आज़माएं। (मैंने बहुत समय पहले ffmpeg-python का उपयोग किया था और इसने अच्छा काम किया)

    -2
    user1116678 15 अक्टूबर 2020, 19:16