2012-07-13 9 views
9

Piszę skrypt Pythona do produkcji podcastów audio i wideo. Istnieje kilka nagranych plików multimedialnych (audio i wideo) oraz plików tekstowych zawierających metadane.Jak zmienić metadane za pomocą ffmpeg/avconv bez tworzenia nowego pliku?

Teraz chcę zaprogramować funkcję, która doda informacje z plików tekstowych metadanych do wszystkich plików multimedialnych (oryginałów i konwertowanych). Ponieważ muszę obsługiwać wiele różnych formatów plików (wav, flac, mp3, mp4, ogg, ogv ...) byłoby wspaniale mieć narzędzie, które dodaje metadane do dowolnych formatów.

Moje pytanie:

Jak mogę zmienić metadane pliku z ffmpeg/avconv bez zmiany audio lub wideo z nim i bez tworzenia nowego pliku? Czy istnieje inne narzędzie wiersza poleceń/Pythona, które wykonałoby zadanie dla mnie?

Co próbowałem dotąd:

Myślałem ffmpeg/avconv mógłby być takim narzędziem, ponieważ może obsługiwać prawie wszystkie formaty multimedialne. Miałem nadzieję, że jeśli ustawię -i input_file i output_file na ten sam plik, ffmpeg/avconv będzie na tyle sprytny, aby pozostawić plik niezmieniony. Wtedy mógłbym ustawić -metadata key=value i tylko metadane zostaną zmienione.

Ale zauważyłem, że jeśli piszę avconv -i test.mp3 -metadata title='Test title' test.mp3, audio test.mp3 zostanie ponownie przetworzone na inną szybkość transmisji bitów.

Więc pomyślałem, aby użyć -c copy do skopiowania wszystkich informacji wideo i audio. Niestety to nie działa:

:~$ 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 

widzisz, że nie mogę używać -c copy jeśli input_file i output_file są takie same. Oczywiście mógłbym produkować tymczasowo file:

:-$ avconv -i test.wav -c copy -metadata title='Test title' test_temp.mp3 
:-$ mv test_tmp.mp3 test.mp3 

Ale to rozwiązanie stworzyłoby (tymczasowo) nowy plik w systemie plików, a zatem nie jest korzystne.

Odpowiedz

5

poprosiłem o mailing list of avconv i dostał the following answer:

„Nie, to nie jest możliwe [zmienić metadane bez tworzenia nowego pliku], ani muxera API ani avconv konstrukcja pozwala na montaż w miejscu plików."

+0

Winamp robi to jednak: $ Zastanawiam się, jak oni to robią. –

+0

@NikosBaxevanis Najprawdopodobniej poprzez wyjście do pliku tymczasowego, usunięcie oryginału, a następnie zmianę nazwy nowego. Nadpisanie pliku podczas czytania może spowodować wiele problemów. Na przykład ffmpeg zniszczy plik wideo, jeśli wykonasz polecenie 'ffmpeg -i video.mkv -c: copy -c: v copy video.mkv' –

+0

@ColeJohnson Prawdopodobnie to robi i robi to naprawdę dobrze! Jest to dla mnie interesujące, ponieważ nawet jeśli odtwarzasz plik multimedialny, możesz zmienić jego tag ID3 w locie! Nie wiem, czy/jak to robi, kopiując w tle, ale Winamp robi to naprawdę dobrze! –

13

Można to zrobić za pomocą FFmpeg tak:

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

Przykład:

$ 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 

Zobacz documentation for -metadata i stream copying aby uzyskać więcej informacji.

Należy również zauważyć, że nie wszystkie formaty umożliwiają ustawienie dowolnego metadane, na, na przykład, Quicktime robi -metadata title="my title" robi to, czego można się spodziewać, ale -metadata foo=bux nic nie robi.

+2

W swoim rozwiązaniu tworzysz nowy plik. Czy jest też sposób bez tworzenia nowego pliku? –

+0

@tampis Obawiam się, że nie. – blahdiblah

Powiązane problemy