मैं ऑडियो और वीडियो पॉडकास्ट बनाने के लिए एक पायथन लिपि लिख रहा हूं। रिकॉर्ड की गई मीडिया फ़ाइलों (ऑडियो और वीडियो) और मेटा जानकारी वाली टेक्स्ट फाइलों का एक गुच्छा है।कोई नई फ़ाइल बनाने के बिना ffmpeg/avconv के साथ मेटाडेटा को कैसे बदला जाए?
अब मैं एक फ़ंक्शन प्रोग्राम करना चाहता हूं जो मेटा डेटा टेक्स्ट फ़ाइलों से सभी मीडिया फ़ाइलों (मूल और रूपांतरित किए गए) में जानकारी जोड़ देगा। क्योंकि मुझे कई अलग-अलग फ़ाइल स्वरूपों को संभालना है (wav
, flac
, mp3
, mp4
, ogg
, ogv
...) यह एक अच्छा उपकरण होगा जो मनमाने ढंग से प्रारूपों में मेटा डेटा जोड़ता है।
मेरे प्रश्न:
मैं कैसे ऑडियो या इसके बारे में और एक नई फ़ाइल बनाने के बिना वीडियो को बदले बिना ffmpeg/avconv
के साथ एक फ़ाइल के मेटाडाटा को बदल सकते हैं? क्या कोई और कमांडलाइन/पायथन टूल है जो मेरे लिए काम करेगा?
क्या मैं अब तक की कोशिश की:
मैं, सोचा ffmpeg/avconv
इस तरह के एक उपकरण हो सकता है क्योंकि यह लगभग सभी मीडिया प्रारूपों को संभाल सकता है। मुझे उम्मीद थी कि अगर मैं उसी फ़ाइल में -i input_file
और output_file
सेट करता हूं, तो ffmpeg/avconv
फ़ाइल को अपरिवर्तित छोड़ने के लिए पर्याप्त स्मार्ट होगा। तो मैं -metadata key=value
सेट कर सकता था और बस मेटाडाटा बदल दिया जाएगा।
लेकिन मैंने देखा, कि अगर मैं avconv -i test.mp3 -metadata title='Test title' test.mp3
टाइप करता हूं तो ऑडियो test.mp3
को दूसरे बिटरेट में वापस कर दिया जाएगा।
तो मैंने सभी वीडियो और ऑडियो जानकारी की प्रतिलिपि बनाने के लिए -c copy
का उपयोग करने का विचार किया। दुर्भाग्य से भी इस काम नहीं करता है:
:~$ du -h test.wav # test.wav is 303 MB big
303M test.wav
:~$ avconv -i test.wav -c copy -metadata title='Test title' test.wav
avconv version 0.8.3-4:0.8.3-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the
Libav developers
built on Jun 12 2012 16:37:58 with gcc 4.6.3
[wav @ 0x846b260] max_analyze_duration reached
Input #0, wav, from 'test.wav':
Duration: 00:29:58.74, bitrate: 1411 kb/s
Stream #0.0: Audio: pcm_s16le, 44100 Hz, 2 channels, s16, 1411 kb/s
File 'test.wav' already exists. Overwrite ? [y/N] y
Output #0, wav, to 'test.wav':
Metadata:
title : Test title
encoder : Lavf53.21.0
Stream #0.0: Audio: pcm_s16le, 44100 Hz, 2 channels, 1411 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Press ctrl-c to stop encoding
size= 896kB time=5.20 bitrate=1411.3kbits/s
video:0kB audio:896kB global headers:0kB muxing overhead 0.005014%
:~$ du -h test.wav # file size of test.wav changed dramatically
900K test.wav
तुम देखो, कि मैं उपयोग नहीं कर सकते -c copy
input_file
अगर और output_file
ही हैं। फाइल सिस्टम पर एक नई फ़ाइल
:-$ avconv -i test.wav -c copy -metadata title='Test title' test_temp.mp3
:-$ mv test_tmp.mp3 test.mp3
लेकिन इस समाधान (अस्थायी) बनाना होगा और इसलिए बेहतर नहीं है: बेशक मैं एक अस्थायी रूप से फ़ाइल उत्पादन कर सकता है।
$ du -h test.mov
27M test.mov
$ ffprobe -loglevel quiet -show_format out.mov | grep title # nothing found
$ ffmpeg -loglevel quiet -i test.mov -codec copy -metadata title="My title" out.mov
$ du -h out.mov
27M out.mov
$ ffprobe -loglevel quiet -show_format out.mov | grep title
TAG:title=My title
अधिक जानकारी के लिए देखें documentation for -metadata
और stream copying पर:
विनम्प हालांकि करता है: $ मुझे आश्चर्य है कि वे इसे कैसे कर रहे हैं। –
@ निकोसबैक्सवेनिस सबसे अस्थायी फ़ाइल में आउटपुट करके, मूल को हटाने, फिर नया नाम बदलने की संभावना है। एक फ़ाइल को ओवरराइट करना जैसा कि आप पढ़ रहे हैं, यह कई समस्याएं पैदा कर सकता है। उदाहरण के लिए, अगर आप ffmpeg -i video.mkv -c करते हैं तो ffmpeg आपकी वीडियो फ़ाइल को नष्ट कर देगा: एक copy -c: v copy video.mkv' –
@ColeJohnson शायद यह क्या करता है, और यह वास्तव में अच्छा करता है! यह मेरे लिए दिलचस्प है, क्योंकि यदि आप मीडिया फ़ाइल चला रहे हैं, तो भी आप अपना आईडी 3 टैग ऑन-द-फ्लाई बदल सकते हैं! सुनिश्चित नहीं है कि पृष्ठभूमि में कॉपी करके यह कैसे/करता है, लेकिन Winamp वास्तव में यह अच्छा करता है! –