ChinaFFmpeg

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 14300|回复: 3

怎么按大小分割MP4视频?

[复制链接]
发表于 2019-5-17 16:23:27 | 显示全部楼层 |阅读模式
一、目的
在Android和iOS上,把一个MP4文件按大小切成多个MP4文件。
二、现象
系统没有现成的接口。
三、过程
方案:
  • ffmpeg按大小切割
  • mp4box
  • mp4parser
  • MediaCodec
备选方案:
外包
参考:
bash - 使用ffmpeg按大小分割视频文件 - Stack Overflow https://stackoverflow.com/questions/38259544/using-ffmpeg-to-split-video-files-by-size
求问如何使用FFmpeg对视频进行按照文件大小的切割-CSDN论坛 https://bbs.csdn.net/topics/390917871
How to split a video file by size with ffmpeg? - Super User https://superuser.com/questions/712893/how-to-split-a-video-file-by-size-with-ffmpeg
Android(java方法)上实现mp4的分割和拼接 (一) - banking17173的专栏 - CSDN博客https://blog.csdn.net/banking17173/article/details/19501197
Android(java方法)上实现mp4的分割和拼接 (二) - banking17173的专栏 - CSDN博客https://blog.csdn.net/banking17173/article/details/20646251
在android中进行视频的分割-云少嘎嘎嘎-ChinaUnix博客 http://www.blog.chinaunix.net/uid-20771867-id-4114253.html
Android 使用mp4parser进行视频的分割与合并 - 老杨的一天 - CSDN博客https://blog.csdn.net/u012027644/article/details/53885837
Android 视频编辑解析库MP4Parser - 简书 https://www.jianshu.com/p/c87ada9b0f65
分析:
方案1
没有现成的接口,可以结合-fs和-ss之类的参数来写逻辑。假设视频的参数都一样,可以计算大小/时间的平均值,按时间分割。
效率方面,加上copy的话应该只要几秒。
方案2
优势是不用写业务逻辑。劣势是参考资料不多,可靠性不确定,编译方法要自己写。
mp4box -splits 2000000 filename.mp4
方案3
看起来软编解码效率不高,但这是对容器进行操作,比编解码快很多很多。开发难度高。
sannies/mp4parser: A Java API to read, write and create MP4 files https://github.com/sannies/mp4parser
方案4
优势是硬件编码解码,效率最高。劣势是开发难度高。
四、结果
选开发难度最低的方案1,用ffmpeg,问题是逻辑怎么写?

回复

使用道具 举报

 楼主| 发表于 2019-6-21 14:20:30 | 显示全部楼层
本帖最后由 obarong 于 2019-6-21 14:23 编辑

执行命令ffmpeg -i input.mp4   
在ffmpeg.c的main函数,在cleanup之前可以拿到时长和码率
input_files[0]->ctx->duration
input_files[0]->ctx->bit_rate
然后计算出切片时长和数量
ffmpeg -y -ss 0 -t %lld -i input.mp4 -vcodec copy -acodec copy output-split-%d.mp4
写循环,执行上面的命令成功按100MB切片






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-26 09:58:54 | 显示全部楼层
上面的方法不可靠,遇到码率变化大的视频,切出来的文件大小波动很大。改用下面的命令

ffmpeg -y -ss 0 -i input.mp4 -vcodec copy -acodec copy -fs 100M output-split-1.mp4

在ffmpeg.c的print_report最后面获取pts。这是最终的输出文件时长,似乎比实际的时长偏大0.02s。

pts的总和是下一个文件的开始时间,如果开始时间大于等于输入文件时长,就结束循环。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-28 16:50:33 | 显示全部楼层
obarong 发表于 2019-6-26 09:58
上面的方法不可靠,遇到码率变化大的视频,切出来的文件大小波动很大。改用下面的命令

ffmpeg -y -ss 0 -i ...

判断原视频时长比切片总时长大1s才切下一个,防止最后的时间误差导致多切一个。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|Archiver|ChinaFFmpeg

GMT+8, 2024-4-20 03:29 , Processed in 0.056457 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表