我正在尝试从蓝光光盘中提取字幕,它是一个hdmv_pgs_subtitle
。所以我尝试
ffmpeg -i file.m2ts -map 0:3 -scodec copy rip3/test.sub
并得到
Could not write header for output file #0 (incorrect codec parameters ?):
Operation not permitted
然后我就这么做了
ffmpeg -i file.m2ts -map 0:3 -scodec copy rip3/test.sup
ffmpeg -i file.m2ts -map 0:3 -scodec copy rip3/test.srt
以及一堆其他不同的扩展,直到我尝试了.mkv
一下,它才起作用。
我如何找到 ffmpeg 允许的扩展名?我还没有找到一个地方将其命名.mkv
为扩展名
ffmpeg -formats
提到了matroska
,但没有说这.mkv
是扩展名。那么有没有办法找到 ffmpeg 支持的所有文件扩展名?
编辑:阅读了 slhck 的答案后,我通过在源文件夹中执行此命令找到了扩展。
查找 . -type f -iname "*.c" -exec egrep -H ".extensions" {} \;
文件名将提供一些关于其格式的信息。
答案1
首先,您可以通过调用来查看所有格式(容器)ffmpeg -formats
。他们没有提到扩展可能是因为扩展本身通常毫无意义,您可以使用选项覆盖输出格式-f
。
您可以查看特定复用器 (解复用器) 的常见扩展。例如:
$ ffmpeg -v 1 -h demuxer=matroska
Demuxer matroska,webm [Matroska / WebM]:
Common extensions: mkv,mk3d,mka,mks
输出格式及其扩展名已在编码器中注册。因此,在查看 ffmpeg 源代码时,您会在 Matroska 中找到以下内容:
AVOutputFormat ff_matroska_muxer = {
.name = "matroska",
.long_name = NULL_IF_CONFIG_SMALL("Matroska"),
.mime_type = "video/x-matroska",
.extensions = "mkv",
....
输入格式通常不是通过其扩展名来解析,而是通过实际包含的数据来解析。
另请参阅:
问题是 ffmpeg 可以处理的所有格式中只有两种支持 HDMV PGS 字幕:
- MPEG-TS
- MKV(Matroska)
您不能使用 SRT 容器,因为这是一个不同的概念。SRT 字幕基于文本,而 HDMV PGS 字幕是实际的位图。
因此,如果您需要做的就是将字幕存储在某个地方,那么这应该可行:
ffmpeg -i input.mkv -c:s:0 copy -map 0:s:0 output.mks