V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
flame90
V2EX  ›  编程

ffmpeg 视频切分与播放问题

  •  
  •   flame90 · 2019-05-10 10:34:19 +08:00 · 6075 次点击
    这是一个创建于 2027 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    #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,实现边下边播效果。
    现在求教各位大神还有什么好的方案。
    非常感谢!!!
    
    28 条回复    2019-05-12 00:01:14 +08:00
    flame90
        1
    flame90  
    OP
       2019-05-10 10:34:55 +08:00
    怎么才能让各位大神看到呢
    flame90
        3
    flame90  
    OP
       2019-05-10 11:58:07 +08:00
    @InternetExplorer 非常感谢
    berumotto
        4
    berumotto  
       2019-05-10 12:17:47 +08:00
    用 ffmpeg 不能把多个文件合成一个吗 我记得应该能吧
    flame90
        5
    flame90  
    OP
       2019-05-10 12:46:42 +08:00
    @berumotto 我的意思不是直接使用 ffmpeg 合成一个,我现在是使用的 java 直接将多个 MP4 文件合成一个会出现问题,你知道这个问题吗
    Lax
        6
    Lax  
       2019-05-10 12:51:47 +08:00
    ffmpeg -i xxx/xx/xxx/xxx.m3u8 /path/to/xxx.mp4
    原始 m3u8 限制的话,也可以参考原来的格式手工写一个。
    0x3f3f
        7
    0x3f3f  
       2019-05-10 12:53:15 +08:00 via iPhone
    ffmpeg -i "concat:01.ts|02.ts" -f mp4 -strict -2 demo.mp4
    flame90
        8
    flame90  
    OP
       2019-05-10 13:42:40 +08:00
    @Lax
    @0x3f3f 可能我表述的不是太清楚,我现在遇到的情况是,使用 ffmpeg 将 ts 转换成了多个 MP4 文件,使用 java 合成一个文件的时候出了问题,具体为什么我要合成一个文件呢,我当时想的是使用 app 启动的时候先下载若干个分片,然后调用 ffmpeg 转换成 MP4,然后后续下载的 ts 直接转换成 MP4 之后追加到原来的 MP4 文件中,就发现实际只能播放第一个 ts 里面的内容了
    c4f36e5766583218
        9
    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
        10
    goreliu  
       2019-05-10 13:50:54 +08:00 via iPhone
    先合并再转换。
    Lax
        11
    Lax  
       2019-05-10 14:08:17 +08:00
    "使用 java 合成一个文件" ----??? 你是直接把 mp4 文件首尾相连合并起来的吗?
    flame90
        12
    flame90  
    OP
       2019-05-10 14:13:20 +08:00
    @c4f36e5766583218
    @goreliu
    非常感谢。回去我先试试,那我还想问一下,关于视频播放器在线播放功能(有一个网络资源)一般是怎么实现的呢?
    flame90
        13
    flame90  
    OP
       2019-05-10 14:13:55 +08:00
    @Lax 是的,将 MP4 文件追加到同一个文件中
    goreliu
        14
    goreliu  
       2019-05-10 14:30:46 +08:00 via iPhone
    @flame90 主流的视频格式一般都支持随下随播(比如把完整的视频文件从中间截断,前边的部分还是能正常播放),所以一边下载一边播放就可以了,如果播放得比下载快就要暂停缓冲了。
    zhs227
        15
    zhs227  
       2019-05-10 14:33:29 +08:00
    容器不一样。TS 文件和 MP4 文件格式不是一样的,要转封装。
    flame90
        16
    flame90  
    OP
       2019-05-10 14:47:17 +08:00
    @goreliu 现在问题是 m3u8 的一个链接,所以我用到了 ffmpeg
    flame90
        17
    flame90  
    OP
       2019-05-10 14:48:04 +08:00
    @zhs227 我没有直接把 ts 放到 MP4 文件中,我只是将 ts 转换成 MP4 文件之后,将多个 MP4 文件合成一个出现了播放问题
    ETiV
        18
    ETiV  
       2019-05-10 14:49:12 +08:00 via iPhone
    捂脸🤦‍♂️,视频处理跟 Java 没关系……
    至少不是 concat 文件的关系……

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

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

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

    这一行就够了,输出的是 video.mp4 就是上面众多 ts 合并后的文件
    flame90
        19
    flame90  
    OP
       2019-05-10 14:52:42 +08:00
    @ETiV 我之所以会遇见这问题就是因为 javafx 原生的播放器支持的格式太少了
    序你说的第二点,文件切分之后合并不就是直接将切分的文件追加到一个文件中吗
    非常感谢解惑
    zhs227
        20
    zhs227  
       2019-05-10 14:58:56 +08:00
    两个 mp4 文件 concat 并不能生成一个更大的 mp4 文件
    hws8033856
        21
    hws8033856  
       2019-05-10 15:24:48 +08:00
    @flame90 我觉得你要先对音视频文件的格式和编解码处理有一些基础的认识后才来做这个功能……你应该没有文件头和编码数据段的概念吧?
    Lax
        22
    Lax  
       2019-05-10 19:13:07 +08:00
    这个文档提到 javafx 支持 HLS,你是遇到什么问题了吗?
    最好解决一下原始的问题,没必要再搞出一下新的问题。
    https://docs.oracle.com/javase/8/javafx/api/javafx/scene/media/package-summary.html
    mxalbert1996
        23
    mxalbert1996  
       2019-05-10 21:13:02 +08:00 via Android
    我很想问问楼主如果把两张 jpg 图片的内容首尾相连写入同一个文件中的话两张图片的排列是左右还是上下。。。
    flame90
        24
    flame90  
    OP
       2019-05-10 23:44:16 +08:00
    @mxalbert1996 肯定打不开,因为两个图片本身不支持分割
    flame90
        25
    flame90  
    OP
       2019-05-10 23:44:59 +08:00
    @Lax 非常感谢,我先试试再提问,哈哈
    flame90
        26
    flame90  
    OP
       2019-05-11 16:12:42 +08:00
    @Lax 你给的文档上是有说支持 m3u8,但是实际上并不能运行,没有报错,但是也不播放
    mxalbert1996
        27
    mxalbert1996  
       2019-05-11 23:42:00 +08:00 via Android
    @flame90 你既然知道图片不能直接切两半,那你为什么会觉得视频可以。。。
    flame90
        28
    flame90  
    OP
       2019-05-12 00:01:14 +08:00
    @mxalbert1996 我错了,求放过(🤣🤣)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3270 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:39 · PVG 08:39 · LAX 16:39 · JFK 19:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.