ffmpeg 视频切分与播放问题

2019-05-10 10:34:19 +08:00
 flame90

各位大神好: 从网上下载一个电影,发现全是视频是很多个部分,如下的文本:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:5.629500,
9d1641c081d000000.ts
#EXTINF:4.170000,
9d1641c081d000001.ts
#EXTINF:3.210900,
9d1641c081d000002.ts
#EXTINF:6.421800,
9d1641c081d000003.ts
#EXTINF:0.583800,
9d1641c081d000004.ts
#EXTINF:4.170000,
9d1641c081d000005.ts
我现在已经把各个 ts 文件下载到了本地,单独播放也可以,我使用 ffmpeg 将 ts 转换成了 MP4 文件,然后使用 java 程序将转换的 MP4 文件合并成一个 mp4 文件,发现,合成后的文件只能播放第一个 ts 分片的内容,求解,怎么才能合成正常播放的 MP4 文件。
其实问这个问题的背景是我现在在做一个 java 播放器,由于 javafx 自带的媒体播放器播放的格式支持有限,我想先把网上抓取下来的 ts 文件转成 MP4,然后将多个 MP4 合成一个 MP4,实现边下边播效果。
现在求教各位大神还有什么好的方案。
非常感谢!!!
6065 次点击
所在节点    编程
28 条回复
flame90
2019-05-10 10:34:55 +08:00
怎么才能让各位大神看到呢
InternetExplorer
2019-05-10 10:39:05 +08:00
flame90
2019-05-10 11:58:07 +08:00
@InternetExplorer 非常感谢
berumotto
2019-05-10 12:17:47 +08:00
用 ffmpeg 不能把多个文件合成一个吗 我记得应该能吧
flame90
2019-05-10 12:46:42 +08:00
@berumotto 我的意思不是直接使用 ffmpeg 合成一个,我现在是使用的 java 直接将多个 MP4 文件合成一个会出现问题,你知道这个问题吗
Lax
2019-05-10 12:51:47 +08:00
ffmpeg -i xxx/xx/xxx/xxx.m3u8 /path/to/xxx.mp4
原始 m3u8 限制的话,也可以参考原来的格式手工写一个。
0x3f3f
2019-05-10 12:53:15 +08:00
ffmpeg -i "concat:01.ts|02.ts" -f mp4 -strict -2 demo.mp4
flame90
2019-05-10 13:42:40 +08:00
@Lax
@0x3f3f 可能我表述的不是太清楚,我现在遇到的情况是,使用 ffmpeg 将 ts 转换成了多个 MP4 文件,使用 java 合成一个文件的时候出了问题,具体为什么我要合成一个文件呢,我当时想的是使用 app 启动的时候先下载若干个分片,然后调用 ffmpeg 转换成 MP4,然后后续下载的 ts 直接转换成 MP4 之后追加到原来的 MP4 文件中,就发现实际只能播放第一个 ts 里面的内容了
c4f36e5766583218
2019-05-10 13:46:38 +08:00
下载视频: ffmpeg -i "input.m3u8" -c copy "output.mp4"
裁剪视频: ffmpeg -ss 00:04:31 -to 00:05:01 -i "input.mp4" -c copy "output.mp4"
合并视频: https://trac.ffmpeg.org/wiki/Concatenate#demuxer
goreliu
2019-05-10 13:50:54 +08:00
先合并再转换。
Lax
2019-05-10 14:08:17 +08:00
"使用 java 合成一个文件" ----??? 你是直接把 mp4 文件首尾相连合并起来的吗?
flame90
2019-05-10 14:13:20 +08:00
@c4f36e5766583218
@goreliu
非常感谢。回去我先试试,那我还想问一下,关于视频播放器在线播放功能(有一个网络资源)一般是怎么实现的呢?
flame90
2019-05-10 14:13:55 +08:00
@Lax 是的,将 MP4 文件追加到同一个文件中
goreliu
2019-05-10 14:30:46 +08:00
@flame90 主流的视频格式一般都支持随下随播(比如把完整的视频文件从中间截断,前边的部分还是能正常播放),所以一边下载一边播放就可以了,如果播放得比下载快就要暂停缓冲了。
zhs227
2019-05-10 14:33:29 +08:00
容器不一样。TS 文件和 MP4 文件格式不是一样的,要转封装。
flame90
2019-05-10 14:47:17 +08:00
@goreliu 现在问题是 m3u8 的一个链接,所以我用到了 ffmpeg
flame90
2019-05-10 14:48:04 +08:00
@zhs227 我没有直接把 ts 放到 MP4 文件中,我只是将 ts 转换成 MP4 文件之后,将多个 MP4 文件合成一个出现了播放问题
ETiV
2019-05-10 14:49:12 +08:00
捂脸🤦‍♂️,视频处理跟 Java 没关系……
至少不是 concat 文件的关系……

不是文本文件不要直接 concat 文件内容…

#6 就是你想要的:
你先把你看到的文本文件保存下来,存成 xxx.m3u8

ffmpeg -i xxx.m3u8 -c copy video.mp4

这一行就够了,输出的是 video.mp4 就是上面众多 ts 合并后的文件
flame90
2019-05-10 14:52:42 +08:00
@ETiV 我之所以会遇见这问题就是因为 javafx 原生的播放器支持的格式太少了
序你说的第二点,文件切分之后合并不就是直接将切分的文件追加到一个文件中吗
非常感谢解惑
zhs227
2019-05-10 14:58:56 +08:00
两个 mp4 文件 concat 并不能生成一个更大的 mp4 文件

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/562771

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX