我正在尝试使用ffmpeg删除Mp4容器中的数据(字幕)流。
以下是ffprobe的截图:
private String padEtagIfNecessary(String etag) {
if (!StringUtils.hasLength(etag)) {
return etag;
}
if ((etag.startsWith("\"") || etag.startsWith("W/\"")) && etag.endsWith("\"")) {
return etag;
}
return "\"" + etag + "\"";
}
我试过了:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.m4v':
Metadata:
major_brand : isom
minor_version : 2
compatible_brands: isomiso2avc1mp41
creation_time : 2018-01-19T15:10:48.000000Z
Duration: 00:00:42.17, start: 0.000000, bitrate: 6260 kb/s
Chapter #0:0: start 0.000000, end 42.166000
Metadata:
title : Chapter 1
Stream #0:0(eng): Data: bin_data (text / 0x74786574), 0 kb/s (default)
Metadata:
creation_time : 2018-01-19T15:10:48.000000Z
handler_name : Apple Alias Data Handler
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo,
fltp, 317 kb/s (default)
Metadata:
creation_time : 2018-01-19T15:10:48.000000Z
handler_name : AAC audio
Stream #0:2(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc),
1920x1080, 5926 kb/s, 30 fps, 30 tbr, 30k tbn, 60k tbc (default)
Metadata:
creation_time : 2018-01-19T15:10:48.000000Z
handler_name : H264 video
**Unsupported codec with id 100359 for input stream 0**
数据跟踪仍然存在,只是从流0移动到流2
我也试过了:
ffmpeg -i test.m4v -acodec copy -vcodec copy -sn nodata.mp4
同样的结果,赛道仍在那里,只是跳到0:2没有运气。
任何提示? 提前致谢
答案 0 :(得分:3)
最好使用此命令而不是-map_chapters -1
:
ffmpeg -i in.mp4 -c copy -dn -map_metadata:c -1 out.mp4
-dn
说,我们不需要将数据流从in.mp4
复制到out.mp4
。如果源文件中有数据流,则这是必需的。但是,即使源文件中没有数据流,ffmpeg也会将数据流追加到输出文件中,以保留章节元数据信息(章节名称)。这使玩家能够为每个章节命名。
如果不需要,您的章节可能没有名称。 -map_chapters -1
会完全删除各个章节,因此在视频流中您将丢失所有章节。但是,如果您只是想不包含数据流,则可以使用-map_metadata:c -1
保留章节,而只会丢失其名称。这可能是一个更好而破坏性较小的想法。
供参考:
-dn (output) Disable data recording. For full manual control see the "-map" option.
答案 1 :(得分:0)
谢谢,我解决了使用带负值的-map_chapters
选项删除数据流。
全字符串:
ffmpeg -i in.mp4 -c:v copy -c:a copy -map_chapters -1 out.mp4
希望这会帮助别人!