2012-07-13 16 views
9

मैं ऑडियो और वीडियो पॉडकास्ट बनाने के लिए एक पायथन लिपि लिख रहा हूं। रिकॉर्ड की गई मीडिया फ़ाइलों (ऑडियो और वीडियो) और मेटा जानकारी वाली टेक्स्ट फाइलों का एक गुच्छा है।कोई नई फ़ाइल बनाने के बिना 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 copyinput_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 पर:

उत्तर

5

मैं mailing list of avconv पर पूछा और the following answer मिला:

"नहीं, यह संभव नहीं [एक नई फ़ाइल बनाने के बिना मेटाडाटा को बदलने के लिए], है न libavformat एपीआई और न ही avconv डिजाइन में यथास्थान संपादन के लिए अनुमति देता है फाइलों का"

+0

विनम्प हालांकि करता है: $ मुझे आश्चर्य है कि वे इसे कैसे कर रहे हैं। –

+0

@ निकोसबैक्सवेनिस सबसे अस्थायी फ़ाइल में आउटपुट करके, मूल को हटाने, फिर नया नाम बदलने की संभावना है। एक फ़ाइल को ओवरराइट करना जैसा कि आप पढ़ रहे हैं, यह कई समस्याएं पैदा कर सकता है। उदाहरण के लिए, अगर आप ffmpeg -i video.mkv -c करते हैं तो ffmpeg आपकी वीडियो फ़ाइल को नष्ट कर देगा: एक copy -c: v copy video.mkv' –

+0

@ColeJohnson शायद यह क्या करता है, और यह वास्तव में अच्छा करता है! यह मेरे लिए दिलचस्प है, क्योंकि यदि आप मीडिया फ़ाइल चला रहे हैं, तो भी आप अपना आईडी 3 टैग ऑन-द-फ्लाई बदल सकते हैं! सुनिश्चित नहीं है कि पृष्ठभूमि में कॉपी करके यह कैसे/करता है, लेकिन Winamp वास्तव में यह अच्छा करता है! –

13

तुम इतनी तरह FFmpeg के साथ ऐसा कर सकते हैं:

ffmpeg -i input.avi -metadata key=value -codec copy output.avi 

उदाहरण।

ध्यान दें कि सभी प्रारूप मनमाने ढंग से मेटाडेटा सेट करने की अनुमति नहीं देते हैं, उदाहरण के लिए, -metadata title="my title" क्विकटाइम कर रहा है जो आप चाहते हैं, लेकिन -metadata foo=bux कुछ भी नहीं करता है।

+2

आपके समाधान में आप एक नई फ़ाइल बनाते हैं। क्या कोई नई फाइल बनाने के बिना कोई रास्ता है? –

+0

@tampis मुझे डर नहीं है। – blahdiblah

संबंधित मुद्दे