用ffmpeg如何将一个完整的视屏分割成几个视频,不是按时间,是按区域划分

储哈哈 2018-02-13 02:28:47
最近想用ffmpeg实现将一个视频切割成几个部分,然后将数据发送给几个客户端,几个客户端同时播放,组成一个完整的视频。网上看到的都是按照时间切割,我想要的是按区域切割,每个客户端显示的是视频的一个区域,所有客户端播放的画面组合在一起才是一个完整的画面。求大神指导。
...全文
4927 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
流浪四方 2019-09-20
  • 打赏
  • 举报
回复
ffmpeg -i in.mp4 -ss 00:00:30.0 -c copy -t 00:00:10.0 out.mp4
储哈哈 2019-07-17
  • 打赏
  • 举报
回复
引用 23 楼 qq_40673801 的回复:
楼主最后用什么方法解决了呀?目前我们是用ffmpeg提取音频,opencv分割视频。
就是用楼上他们说的方法
  • 打赏
  • 举报
回复
楼主最后用什么方法解决了呀?目前我们是用ffmpeg提取音频,opencv分割视频。
储哈哈 2018-03-30
  • 打赏
  • 举报
回复
引用 19 楼 mstlq 的回复:
[quote=引用 17 楼 zhao4zhong1 的回复:] [quote=引用 16 楼 weixin_37633951 的回复:] [quote=引用 15 楼 mstlq 的回复:] 呃,貌似plain text不能自动换行?再贴一遍吧 ffmpeg -i fix.mp4 -filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:0:0[leftTop] -filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:trunc(iw/4)*2:0[rightTop] -filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:0:trunc(ih/4)*2[leftBottom] -filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:trunc(iw/4)*2:trunc(ih/4)*2[rightBottom] -map [leftTop] -map 0:a lt.mp4 -map [rightTop] -map 0:a rt.mp4 -map [leftBottom] -map 0:a lb.mp4 -map [rightBottom] -map 0:a rb.mp4
. 谢谢,就是不知道在mfc里怎么调用相关的函数[/quote]
WinExec("cmd /c "
    "ffmpeg -i fix.mp4"
    "-filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:0:0[leftTop]"
    "-filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:trunc(iw/4)*2:0[rightTop]"
    "-filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:0:trunc(ih/4)*2[leftBottom]"
    "-filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:trunc(iw/4)*2:trunc(ih/4)*2[rightBottom]"
    "-map [leftTop] -map 0:a lt.mp4 -map [rightTop] -map 0:a rt.mp4"
    "-map [leftBottom] -map 0:a lb.mp4 -map [rightBottom] -map 0:a rb.mp",
    SW_HIDE);
[/quote] 哈哈,确实可以这么搞.....[/quote] 只要把这段放在程序就行了吗?比较菜,放进去啥都没出来
赵4老师 2018-03-21
  • 打赏
  • 举报
回复
参考《Unix编程艺术》
mstlq 2018-03-20
  • 打赏
  • 举报
回复
引用 17 楼 zhao4zhong1 的回复:
[quote=引用 16 楼 weixin_37633951 的回复:] [quote=引用 15 楼 mstlq 的回复:] 呃,貌似plain text不能自动换行?再贴一遍吧 ffmpeg -i fix.mp4 -filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:0:0[leftTop] -filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:trunc(iw/4)*2:0[rightTop] -filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:0:trunc(ih/4)*2[leftBottom] -filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:trunc(iw/4)*2:trunc(ih/4)*2[rightBottom] -map [leftTop] -map 0:a lt.mp4 -map [rightTop] -map 0:a rt.mp4 -map [leftBottom] -map 0:a lb.mp4 -map [rightBottom] -map 0:a rb.mp4
. 谢谢,就是不知道在mfc里怎么调用相关的函数[/quote]
WinExec("cmd /c "
    "ffmpeg -i fix.mp4"
    "-filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:0:0[leftTop]"
    "-filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:trunc(iw/4)*2:0[rightTop]"
    "-filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:0:trunc(ih/4)*2[leftBottom]"
    "-filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:trunc(iw/4)*2:trunc(ih/4)*2[rightBottom]"
    "-map [leftTop] -map 0:a lt.mp4 -map [rightTop] -map 0:a rt.mp4"
    "-map [leftBottom] -map 0:a lb.mp4 -map [rightBottom] -map 0:a rb.mp",
    SW_HIDE);
[/quote] 哈哈,确实可以这么搞.....
赵4老师 2018-03-20
  • 打赏
  • 举报
回复
WinExec("cmd /c "
    "ffmpeg -i fix.mp4"
    " -filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:0:0[leftTop]"
    " -filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:trunc(iw/4)*2:0[rightTop]"
    " -filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:0:trunc(ih/4)*2[leftBottom]"
    " -filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:trunc(iw/4)*2:trunc(ih/4)*2[rightBottom]"
    " -map [leftTop] -map 0:a lt.mp4 -map [rightTop] -map 0:a rt.mp4"
    " -map [leftBottom] -map 0:a lb.mp4 -map [rightBottom] -map 0:a rb.mp",
    SW_HIDE);
赵4老师 2018-03-20
  • 打赏
  • 举报
回复
引用 16 楼 weixin_37633951 的回复:
[quote=引用 15 楼 mstlq 的回复:] 呃,貌似plain text不能自动换行?再贴一遍吧 ffmpeg -i fix.mp4 -filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:0:0[leftTop] -filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:trunc(iw/4)*2:0[rightTop] -filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:0:trunc(ih/4)*2[leftBottom] -filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:trunc(iw/4)*2:trunc(ih/4)*2[rightBottom] -map [leftTop] -map 0:a lt.mp4 -map [rightTop] -map 0:a rt.mp4 -map [leftBottom] -map 0:a lb.mp4 -map [rightBottom] -map 0:a rb.mp4
. 谢谢,就是不知道在mfc里怎么调用相关的函数[/quote]
WinExec("cmd /c "
    "ffmpeg -i fix.mp4"
    "-filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:0:0[leftTop]"
    "-filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:trunc(iw/4)*2:0[rightTop]"
    "-filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:0:trunc(ih/4)*2[leftBottom]"
    "-filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:trunc(iw/4)*2:trunc(ih/4)*2[rightBottom]"
    "-map [leftTop] -map 0:a lt.mp4 -map [rightTop] -map 0:a rt.mp4"
    "-map [leftBottom] -map 0:a lb.mp4 -map [rightBottom] -map 0:a rb.mp",
    SW_HIDE);
储哈哈 2018-03-20
  • 打赏
  • 举报
回复
引用 15 楼 mstlq 的回复:
呃,貌似plain text不能自动换行?再贴一遍吧 ffmpeg -i fix.mp4 -filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:0:0[leftTop] -filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:trunc(iw/4)*2:0[rightTop] -filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:0:trunc(ih/4)*2[leftBottom] -filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:trunc(iw/4)*2:trunc(ih/4)*2[rightBottom] -map [leftTop] -map 0:a lt.mp4 -map [rightTop] -map 0:a rt.mp4 -map [leftBottom] -map 0:a lb.mp4 -map [rightBottom] -map 0:a rb.mp4
. 谢谢,就是不知道在mfc里怎么调用相关的函数
mstlq 2018-03-07
  • 打赏
  • 举报
回复
呃,貌似plain text不能自动换行?再贴一遍吧 ffmpeg -i fix.mp4 -filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:0:0[leftTop] -filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:trunc(iw/4)*2:0[rightTop] -filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:0:trunc(ih/4)*2[leftBottom] -filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:trunc(iw/4)*2:trunc(ih/4)*2[rightBottom] -map [leftTop] -map 0:a lt.mp4 -map [rightTop] -map 0:a rt.mp4 -map [leftBottom] -map 0:a lb.mp4 -map [rightBottom] -map 0:a rb.mp4
mstlq 2018-03-07
  • 打赏
  • 举报
回复
加个效果图
mstlq 2018-03-07
  • 打赏
  • 举报
回复
引用 9 楼 weixin_37633951 的回复:
[quote=引用 5 楼 mstlq 的回复:] [quote=引用 1 楼 zilaishuichina 的回复:] 对每一帧的数据,按区域分割呗 搜了一下, ffmpeg的帧数据貌似是存在AVFrame 的一个结构里面
其实直接用ffmpeg的cli接口就行了,无需自己写代码 [/quote] 大神可否上个代码看看[/quote] 很少上论坛了,没留意到楼主还在求代码…… 给个示范的命令行吧,这个命令行能够把原视频(我这里是fix.MP4)直接拆成4个,原理请直接看我4楼的链接,另外楼主请用长宽都是4的倍数的视频测试,否则最边边上的画面可能丢失,当然也可以自己处理一下,具体就不展开了
ffmpeg -i fix.mp4 -filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:0:0[leftTop] -filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:trunc(iw/4)*2:0[rightTop] -filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:0:trunc(ih/4)*2[leftBottom] -filter_complex [0:v]crop=trunc(iw/4)*2:trunc(ih/4)*2:trunc(iw/4)*2:trunc(ih/4)*2[rightBottom] -map [leftTop] -map 0:a lt.mp4 -map [rightTop] -map 0:a rt.mp4 -map [leftBottom] -map 0:a lb.mp4 -map [rightBottom] -map 0:a rb.mp4
csulizhang 2018-03-06
  • 打赏
  • 举报
回复
我觉得有两种方式,第一种就是大家提到的切割之后再组合,第二种我觉得简单些,你用直播的形式,推送一路完整的视频流出去,每个客户端都接收完整的直播视频,在解码渲染的过程中,将解码出来的图像,只渲染你所需要的区域,这样我认为简单得多
储哈哈 2018-03-06
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
切割后传输再组合播放 几乎必然比 直接传输播放 数据传输量更大。 因为切割后的图像更不利于mpeg压缩。 我觉得。
后面有可能一个视频需要切割成很多块,然后传给不同的客户端,在所有客户端生成一个相同名字的视频文件,然后自动加载到客户端的播放软件,如果客户端比较多,又距离比较远,如果一个个跑过去拷贝视频文件进去会很麻烦。自己也是初次接触这块,所以只能分割下传,然后客户端的响应主控的播放停止命令。 切割传输的话是不是需要先解码,再切割然后再编码发下去?
哈上的风景 2018-02-27
  • 打赏
  • 举报
回复
楼主看一下图像叠加,拼接的技术,同理。 读取一帧,然后处理存成多张图,编码发送就OK。 如果对于机器性能,网络有影响,就按照8楼的做法。还是在播放的时候做处理。
储哈哈 2018-02-27
  • 打赏
  • 举报
回复
不需要分割,只要告知客户端显示哪个区域可也 后面有可能一个视频需要切割成很多块,然后传给不同的客户端,在所有客户端生成一个相同名字的视频文件,然后自动加载到客户端的播放软件,如果客户端比较多,又距离比较远,如果一个个跑过去拷贝视频文件进去会很麻烦。如果全部传完整的视频下去,会比较耗时啊。而且我现在对怎么传输视频文件还不太清楚
储哈哈 2018-02-27
  • 打赏
  • 举报
回复
切割后传输再组合播放 几乎必然比 直接传输播放 数据传输量更大。 因为切割后的图像更不利于mpeg压缩。 我觉得。 后面有可能一个视频需要切割成很多块,然后传给不同的客户端,在所有客户端生成一个相同名字的视频文件,然后自动加载到客户端的播放软件,如果客户端比较多,又距离比较远,如果一个个跑过去拷贝视频文件进去会很麻烦。自己也是初次接触这块,所以只能分割下传,然后客户端的响应主控的播放停止命令。
储哈哈 2018-02-27
  • 打赏
  • 举报
回复
引用 5 楼 mstlq 的回复:
[quote=引用 1 楼 zilaishuichina 的回复:] 对每一帧的数据,按区域分割呗 搜了一下, ffmpeg的帧数据貌似是存在AVFrame 的一个结构里面
其实直接用ffmpeg的cli接口就行了,无需自己写代码 [/quote] 大神可否上个代码看看
juebai123 2018-02-21
  • 打赏
  • 举报
回复
不需要分割,只要告知客户端显示哪个区域可也
mstlq 2018-02-14
  • 打赏
  • 举报
回复
引用 1 楼 zilaishuichina 的回复:
对每一帧的数据,按区域分割呗 搜了一下, ffmpeg的帧数据貌似是存在AVFrame 的一个结构里面
其实直接用ffmpeg的cli接口就行了,无需自己写代码
加载更多回复(4)

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧