python - 如何在不创建新文件的情况下使用 ffmpeg/avconv 更改元数据?

标签 python command-line ffmpeg metadata

我正在编写一个用于制作音频和视频播客的 python 脚本。有一堆录制的媒体文件(音频和视频)和包含元信息的文本文件。

现在我想编写一个函数,它将元数据文本文件中的信息添加到所有媒体文件(原始文件和转换后的文件)中。因为我必须处理许多不同的文件格式(wavflacmp3mp4ogg , ogv...) 如果有一个工具可以将元数据添加到任意格式,那就太好了。

我的问题:

如何使用 ffmpeg/avconv 更改文件的元数据而不更改文件的音频或视频并且不创建新文件?是否有另一个命令行/python 工具可以为我完成这项工作?

到目前为止我尝试了什么:

我认为 ffmpeg/avconv 可以是这样一个工具,因为它可以处理几乎所有的媒体格式。我希望,如果我将 -i input_fileoutput_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

你看,如果 input_fileoutput_file 相同,我不能使用 -c copy。当然我可以制作一个临时文件:

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

但是这种解决方案会(临时)在文件系统上创建一个新文件,因此并不可取。

最佳答案

你可以像这样用 FFmpeg 做到这一点:

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

例子:

$ 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 -metadatastream copying了解更多信息。

另请注意,并非所有格式都允许设置任意元数据,例如,Quicktime 执行 -metadata title="my title" 会达到您的预期,但 -metadata foo= bux 什么都不做。

关于python - 如何在不创建新文件的情况下使用 ffmpeg/avconv 更改元数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11474532/

相关文章:

python - 使用 Python 从多个文件夹中提取所有文件

python - mypy 中的可选[]类型

ios - 从命令行构建 Xamarin.IOS Visual Studio 解决方案

C++ 解析命令行

audio - 如何使用 ffmpeg 叠加/缩混两个音频文件

python - 将来的规则,但相对于今天早上

python - Pandas 数据框评估中的动态列名

c++ - 如何使 linux 命令行程序在 windows 中运行?

FFmpeg 色彩校正算法

batch-file - 如何使用ffmpeg同时转换多个文件?