我正在编写一个用于制作音频和视频播客的 python 脚本。有一堆录制的媒体文件(音频和视频)和包含元信息的文本文件。
现在我想编写一个函数,它将元数据文本文件中的信息添加到所有媒体文件(原始文件和转换后的文件)中。因为我必须处理许多不同的文件格式(wav
, flac
, mp3
, mp4
, ogg
, ogv
...),所以拥有一个将元数据添加到任意格式的工具会很棒。
我的问题:
如何在ffmpeg/avconv
不更改文件的音频或视频且不创建新文件的情况下更改文件的元数据?是否有另一个命令行/python 工具可以为我完成这项工作?
到目前为止我尝试了什么:
我想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
ifinput_file
和output_file
are the same。当然我可以生成一个临时文件:
:-$ avconv -i test.wav -c copy -metadata title='Test title' test_temp.mp3
:-$ mv test_tmp.mp3 test.mp3
但是这个解决方案会(临时)在文件系统上创建一个新文件,因此不是可取的。