obarong 发表于 2019-5-17 16:23:27

怎么按大小分割MP4视频?

一、目的在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/390917871How 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-ffmpegAndroid(java方法)上实现mp4的分割和拼接 (一) - banking17173的专栏 - CSDN博客https://blog.csdn.net/banking17173/article/details/19501197Android(java方法)上实现mp4的分割和拼接 (二) - banking17173的专栏 - CSDN博客https://blog.csdn.net/banking17173/article/details/20646251在android中进行视频的分割-云少嘎嘎嘎-ChinaUnix博客 http://www.blog.chinaunix.net/uid-20771867-id-4114253.htmlAndroid 使用mp4parser进行视频的分割与合并 - 老杨的一天 - CSDN博客https://blog.csdn.net/u012027644/article/details/53885837Android 视频编辑解析库MP4Parser - 简书 https://www.jianshu.com/p/c87ada9b0f65分析:方案1没有现成的接口,可以结合-fs和-ss之类的参数来写逻辑。假设视频的参数都一样,可以计算大小/时间的平均值,按时间分割。效率方面,加上copy的话应该只要几秒。方案2优势是不用写业务逻辑。劣势是参考资料不多,可靠性不确定,编译方法要自己写。mp4box -splits 2000000 filename.mp4MP4Box | GPAC https://gpac.wp.imt.fr/mp4box/方案3看起来软编解码效率不高,但这是对容器进行操作,比编解码快很多很多。开发难度高。sannies/mp4parser: A Java API to read, write and create MP4 files https://github.com/sannies/mp4parser方案4优势是硬件编码解码,效率最高。劣势是开发难度高。四、结果选开发难度最低的方案1,用ffmpeg,问题是逻辑怎么写?

obarong 发表于 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切片






obarong 发表于 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的总和是下一个文件的开始时间,如果开始时间大于等于输入文件时长,就结束循环。

obarong 发表于 2019-6-28 16:50:33

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

ffmpeg -y -ss 0 -i ...

判断原视频时长比切片总时长大1s才切下一个,防止最后的时间误差导致多切一个。
页: [1]
查看完整版本: 怎么按大小分割MP4视频?