免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6003 | 回复: 6
打印 上一主题 下一主题

是否有把flv合并转换为mp4的模块或代码? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2018-06-30 13:48 |只看该作者 |倒序浏览
本帖最后由 hztj2005 于 2018-07-17 14:57 编辑

我从某些网站下载的公开课视频,一节课有多个flv格式的片段,需要把多个flv合并转换为mp4,因为数量比较多,不想用格式转换器一个一个手动操作,希望用perl模块或代码批量处理,在cpan上搜,只有flv转mp3的模块,故在这里请教。

谢谢1楼的帮助,问题解决了,
下载B站公开课视频,多个flv合并转换为mp4。
代码见7楼,6分钟把590个flv合并转换成190个mp4,相当快。



在bilibili学科学,有不少讲得很好的理工科公开课。

https://zhuanlan.zhihu.com/p/25990210

论坛徽章:
0
2 [报告]
发表于 2018-07-02 10:51 |只看该作者
看看这个:
https://github.com/rafaels/flv2mp4

其实用的就是:
`ffmpeg -i #{filename} -ar 22050 #{mp4_filename}`

评分

参与人数 1信誉积分 +10 收起 理由
hztj2005 + 10 赞一个!

查看全部评分

论坛徽章:
0
3 [报告]
发表于 2018-07-13 06:43 |只看该作者
本帖最后由 hztj2005 于 2018-07-13 07:59 编辑

回复 2# asthman

你给的链接是ruby语言吧?不懂该语言。
至于你给的语句,似乎是调用ffmpeg这个程序来完成任务,
ffmpeg要事先安装?
有点奇怪,下面链接下载不了:
https://ffmpeg.zeranoe.com/builds/#


论坛徽章:
12
子鼠
日期:2014-10-11 16:46:482016科比退役纪念章
日期:2018-03-16 10:24:0515-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:5315-16赛季CBA联赛之北京
日期:2019-08-13 17:30:53
4 [报告]
发表于 2018-07-13 08:39 |只看该作者
本帖最后由 523066680 于 2018-07-13 08:41 编辑

ffmpeg 是用来转换合成视频的工具,通过命令行或者shell脚本的方式调用就可以完成任务。

你贴的链接我这里试过可以下载

评分

参与人数 1信誉积分 +5 收起 理由
hztj2005 + 5 赞一个!

查看全部评分

论坛徽章:
0
5 [报告]
发表于 2018-07-13 10:30 |只看该作者
本帖最后由 hztj2005 于 2018-07-13 13:26 编辑

回复 4# 523066680
上面网站我这边还是不能下载,在csdn下载了个2013版的。

ffmpeg命令参数说明:

https://www.cnblogs.com/wenrisheng/p/6139845.html


下面说:mp4 不支持直接 concate,需要绕道:
https://blog.csdn.net/flood_dragon/article/details/27539381

但flv可以:
ffmpeg -f concat -i mylist.txt -c copy output.flv  
-f concat 指定合并
见:
linux版ffmpeg批量合并FLV文件
https://www.5yun.org/8988.html
===通过mylist.txt 好像是flv文件仅有的合并方法===


另一个网页上说:使用ffmpeg的concat可以实现简单的流文件合并功能。
ffmpeg -i concat:"out002.ts|out003.ts|out004.ts" -acodec copy -vcodec copy -f mp4 cat.mp4




https://www.cnblogs.com/hojor/p/3718887.html
最近再做m3u8切片合并下载的小功能,因为要合并成mp4,所以考虑用ffmpeg来搞,mp4格式忒复杂了。
查了下文档ffmpeg支持concat demux和concat protocol.
用法如下:
ffmpeg -i "concat:input1.mpg|input2.mpg|input3.mpg" -c copy output.mpg //这个是concat protocal,这个命令只支持一部分视频格式 如mpeg1,2 mpegts,不支持flv,mp4

mylist.txt:
# this is a comment
file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'

ffmpeg -f concat -i mylist.txt -c copy output //这个是运用concat demux,和前面的命令有些不同,这个会把demux文件然后re-encode切片文件,所以只要ffmpeg支持的格式,这个命令都管用。

开始觉得这俩个命令功能是一样的。实验了第一个命令 flv不管用,只输出了第一片的flv。查了下官方文档找到这一段:

The flv container format doesn't support file-level concatenation; only afew container file types do. So the concat protocol won't work on them.The concat demuxer, as its name suggests, demuxes the input streams fromtheir container and then concatenates them, so it doesn't care about whatthe input container is (and if the codecs are all the same w/ similarcharacteristics, you can actually concatenate files of different containerformats).



论坛徽章:
0
6 [报告]
发表于 2018-07-13 11:08 |只看该作者
本帖最后由 hztj2005 于 2018-07-14 07:42 编辑

flv转mp4,第一次操作,网上找代码试着用:


1、转码:把ye0.flv转换为ye0.mp4,比较慢
ffmpeg -i ye0.flv -s 320x240 -r 30000/1001 -b 200k -bt 240k -vcodec libx264 -acodec libvo_aacenc -ac 2 -ar 48000 -ab 192k ye0.mp4


2、分离混流:把ye0.flv转换为ye0h.mp4,快
网上说:由于视频转码十分耗时间和cpu,假如flv和mkv正本便是选用的h264封装,完全不需要转码,只需要把h264视频和音频文件分别出来,从头混流一次即可,十几秒内即可结束,十分迅速,并且由于没有转码操作,也避免了转码进程的画面丢掉。
ffmpeg.exe -i ye0.flv -y -vcodec copy -acodec copy ye0h.mp4

参数说明:
-i filename 指定输入文件名
-y 覆盖已有文件
-vcodec 视频编解码格式,如:h264或者libx264(h264编解码)、copy(原样拷贝)、mpeg4(mp4编码)
-acodec 音频编码格式,如aac(aac编解码)

论坛徽章:
0
7 [报告]
发表于 2018-07-13 21:58 |只看该作者
本帖最后由 hztj2005 于 2018-07-20 14:35 编辑
  1. <div class="blockcode"><blockquote>#!/usr/bin/perl -w

  2. #本代码用于把B站下载的公开课flv文件合并同时转换为mp4

  3. #可以用下面bat批处理文件把公开课flv片段集中到test目录,再执行合并同时转换为mp4任务
  4. #@echo off
  5. #for /r D:\360Downloads\11813275 %%i in (*.flv) do move "%%i" D:\360Downloads\test
  6. #rem 把11813275下所有flv移动到test
  7. #echo 完成任务


  8. my $DIR_PATH="C:/Users/asdfgh/Downloads/bilibili/zhoulei";
  9. opendir DIR, ${DIR_PATH} or die "Can not open ".$DIR_PATH."\n";
  10. @filelist = readdir DIR;#所有碎片文件名


  11. my $filename ="11668434_"."[0-9]+";#23123847_1_0
  12. my %fileall =();#@ 需要的文件名

  13. #搜索建立全部主文件名
  14. foreach $file (@filelist)
  15. {
  16.    if($file =~ m/($filename).*flv/)
  17.    {            
  18.             $fileall{$1}="1";            
  19.    }   
  20. }

  21. my $indexh = 1;
  22. foreach $key (keys %fileall)
  23. {
  24.    
  25.     #print "$key\n";
  26.    
  27.     my @partname =();
  28.    
  29.     foreach $file (@filelist)
  30.                 {
  31.                    if($file =~ m/($key)_/)
  32.                    {            
  33.                              push @partname,$file;
  34.                    }   
  35.                 }
  36.                 my @sorted_partname = sort @partname;#给读入片段flv文件排序,保证合并连接秩序
  37.                
  38.                 my $string = "";
  39.     my $prestr ="file \'C:/Users/asdfgh/Downloads/bilibili/zhoulei/";
  40.                 foreach $partfile (@sorted_partname)
  41.                 {
  42.                   $string =  $string.$prestr.$partfile."\'\n";        
  43.           }
  44.                
  45.                 my $readlist = ">D:/360Downloads/test/mylist".$indexh.".txt";
  46.                 open (DOCLIST, $readlist) or die $!; #      
  47.     print DOCLIST $string;
  48.    
  49.     close DOCLIST;
  50.     my $readlist2 = "D:/360Downloads/test/mylist".$indexh.".txt"; #比$readlist少>号
  51.     my $flvout = "D:/360Downloads/test/out/".$key.".flv";#合并多个片段flv,得到的结果大文件,仍然是flv格式   
  52.     my $outstr = "ffmpeg -f concat -i ".$readlist2." -y -c copy ".$flvout;#构造合并指令语句
  53.     system($outstr);#执行合并      
  54.     #system("ffmpeg -f concat -i $outname -y -c copy output.flv");
  55.    
  56.     my $mp4out = "D:/360Downloads/test/out/".$key.".mp4";#用混流的方式把大flv文件转换成mp4
  57.     my $changestr ="ffmpeg.exe -i ".$flvout." -y -vcodec copy -acodec copy ".$mp4out; #构造混流转换指令语句
  58.     system($changestr);#执行混流转换   
  59.     #ffmpeg.exe -i ye0.flv -y -vcodec copy -acodec copy ye0h.mp4
  60.    
  61.     unlink $flvout;#删除合并的flv文件
  62.     $indexh++;
  63. }

  64. exit;
复制代码

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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP