平板3 怎么连电脑和平板怎么传文件,怎样传文件

------解决方案--------------------有拖影子是什么意思?
我以前在视频中加文字图形什么的,都没问题,你说的拖影是什么样子的?------解决方案--------------------引用:Quote: 引用:
有拖影子是什么意思?
我以前在视频中加文字图形什么的,都没问题,你说的拖影是什么样子的?
播放的时候比如第10帧的视频画面有完整的文字显示,第11帧视频画面变了,但是文字那里还停留在第10帧。不知道你明白了没有,我试着看下次能不能截图给你。
你是怎么在视频中加文字图形的呢,指教一下吧,谢谢
我就是用gdi画的啊,还可以透明,没出现你这个问题,不过好久了。
你只用gdi画一根线,然后画多根线看看,估计是你这个水印有问题。
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有让FFMPEG支持实时流“伴随”转码
我的图书馆
让FFMPEG支持实时流“伴随”转码
4221人阅读
FFMPEG命令行工具目前无法针对视频实时流进行转码,而我们可以用它的新版本提供的支持TCP
SERVER的特性来实现这一功能。实现边录边用FFMPEG提供的命令行工具进行转码。(实践证明,FFMPEG
的SDK针对实时流开发比较繁琐,命令行工具相对来说稳定)
我们将实时流录制成正在增长的文件,这样问题就变成了FFMPEG如何针对正在增长的视频文件转码。(首先我们保证视频格式是可以支持正在增长文件解码,这不在本文的讨论范畴)
而我们如果直接使用它对正在增长的文件转码,我们会发现FFMPEG转码到文件末尾(转码速度比录制速度快)就会退出。我们要做的就是在
FFMPEG转码到末尾时如何将其挂起。若直接修改FFMPEG的源代码则比较繁琐,我们搭建一个TCP的FILE
SERVER,来控制给FFMPEG发送数据的速度,而FFMPEG使用TCP的方式来获取视频流,即可实现这个功能。
以下是代码,我们用python来实现:
FFMPEG version:N-32611-gd55b06b
[python] &&''&&&&&&&&import&SocketServer&&import&os&&import&threading&&import&time&&&&BIN_DIR&=&"bin\\"&&BLOCK_SIZE&=&188*1024&&FRONTOFFSET&=&1024&*&1024&*&1&&&&gparam={'output':'','source':'','port':9333,&&&&&&&&&&'start':0,'length':0,'ffmpeg_argvs':'',&&&&&&&&&&'ffmpegsema':None,'tcpserversema':None}&&&&class&MyFfmpegThread(threading.Thread):&&&&&&&&&def&run(self):&&&&&&&&&&if&os.path.exists(gparam['output']):&&&&&&&&&&&&&&os.remove(gparam['output'])&&&&&&&&&&argvs&=&gparam['ffmpeg_argvs'].replace("[filelocate]","tcp://127.0.0.1:%d"%gparam['port'])&+&"&"&+&gparam['output']&&&&&&&&&&cmd&=&"%s\\avconv&%s"%(BIN_DIR,argvs)&&&&&&&&&&os.system(cmd)&&&&&&&&&&gparam['ffmpegsema'].release()&&&&class&MyTcpServerThread(threading.Thread):&&&&&&&&&&def&run(self):&&&&&&&&&&while&True:&&&&&&&&&&&&&&try:&&&&&&&&&&&&&&&&&&ADDR&=&("127.0.0.1",&gparam['port'])&&&&&&&&&&&&&&&&&&self.tcpServ&=&SocketServer.ThreadingTCPServer(ADDR,&MyRequestHandler)&&&&&&&&&&&&&&&&&&break&&&&&&&&&&&&&&except&Exception,e:&&&&&&&&&&&&&&&&&&print&str(e)&&&&&&&&&&&&&&&&&&print&"port:%d&被占用..更换"%gparam['port']&&&&&&&&&&&&&&&&&&gparam['port']+=1&&&&&&&&&&self.tcpServ.serve_forever()&&&&&&&&&&&&&&&&def&close(self):&&&&&&&&&&self.tcpServ.shutdown()&&&&&&&&&&self.tcpServ.server_close()&&&&class&MyRequestHandler(SocketServer.BaseRequestHandler):&&&&&&&&&def&handle(self):&&&&&&&&&&print&'connected&from:',&self.client_address&&&&&&&&&&&&&&&&file&=&open(gparam['source'],"rb")&&&&&&&&&&&&&&&&&&&&startoffset&=&gparam['start']&&&&&&&&&&if&startoffset&0:startoffset=0&&&&&&&&&&&&&&&&&&&&&&&&print&"start&offset="+str(startoffset)&&&&&&&&&&file.seek(startoffset)&&&&&&&&&&&&&&&&&&&&left&=&gparam['length']&&&&&&&&&&while(True):&&&&&&&&&&&&&&try:&&&&&&&&&&&&&&&&&&if(left&BLOCK_SIZE&and&left!=-1):&&&&&&&&&&&&&&&&&&&&&&buffer_size&=&left&&&&&&&&&&&&&&&&&&else:&&&&&&&&&&&&&&&&&&&&&&buffer_size&=&BLOCK_SIZE&&&&&&&&&&&&&&&&&&data=file.read(buffer_size)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&not&data:&&&&&&&&&&&&&&&&&&&&&&print&"data&empty!&read&to&file_end,wait.."&&&&&&&&&&&&&&&&&&&&&&finish_filename=gparam['source'].replace(os.path.splitext(gparam['source'])[1],".finish")&&&&&&&&&&&&&&&&&&&&&&if(os.path.exists(finish_filename)):&&&&&&&&&&&&&&&&&&&&&&&&&&print&".finish&file&founded"&&&&&&&&&&&&&&&&&&&&&&&&&&break&&&&&&&&&&&&&&&&&&&&&&time.sleep(1)&&&&&&&&&&&&&&&&&&&&&&continue&&&&&&&&&&&&&&&&&&&&self.request.sendall(data)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if(left!=-1):&&&&&&&&&&&&&&&&&&&&&&&left&-=&buffer_size&&&&&&&&&&&&&&&&&&&&&&if(left&=0):&&&&&&&&&&&&&&&&&&&&&&&&&&print&"transfer&finished"&&&&&&&&&&&&&&&&&&&&&&&&&&break&&&&&&&&&&&&&&&&&&if(len(data)&buffer_size):&&&&&&&&&&&&&&&&&&&&&&&finish_filename=gparam['source'].replace(os.path.splitext(gparam['source'])[1],".finish")&&&&&&&&&&&&&&&&&&&&&&if(os.path.exists(finish_filename)):&&&&&&&&&&&&&&&&&&&&&&&&&&print&".finish&file&founded"&&&&&&&&&&&&&&&&&&&&&&&&&&break&&&&&&&&&&&&&&&&&&&&&&else:&&&&&&&&&&&&&&&&&&&&&&&&&&print&"read&to&file_end,wait.."&&&&&&&&&&&&&&&&&&&&&&&&&&time.sleep(1)&&&&&&&&&&&&&&except:&&&&&&&&&&&&&&&&&&print&"exception&occured,client&stopped"&&&&&&&&&&&&&&&&&&break&&&&&&&&&&print&"work&finished"&&&&&&&&&&file.close()&&&&&&&&&&gparam['tcpserversema'].release()&&&&&&&&&&&&def&ffmpegex(source,output,start,length,ffmpeg_argvs):&&&&&&gparam['source']=source&&&&&&gparam['output']=output&&&&&&gparam['start']=start&&&&&&gparam['length']=length&&&&&&gparam['ffmpeg_argvs']=ffmpeg_argvs&&&&&&&&&&&&try:&&&&&&&&&&while&True:&&&&&&&&&&&&&&gparam['ffmpegsema']=threading.Semaphore(0)&&&&&&&&&&&&&&gparam['tcpserversema']=threading.Semaphore(0)&&&&&&&&&&&&&&tcpServerThread&=&MyTcpServerThread()&&&&&&&&&&&&&&tcpServerThread.start()&&&&&&&&&&&&&&MyFfmpegThread().start()&&&&&&&&&&&&&&&&&&&&&&&&&&&&gparam['ffmpegsema'].acquire()&&&&&&&&&&&&&&gparam['tcpserversema'].acquire()&&&&&&&&&&&&&&tcpServerThread.close()&&&&&&&&&&&&&&&&&&&&&&&&&&&&filesize&=&os.path.getsize(gparam['output'])&&&&&&&&&&&&&&if(filesize&length/10):&&&&&&&&&&&&&&&&&&&if&gparam['start']==0:&return&False&&&&&&&&&&&&&&&&&&if&gparam['start']-FRONTOFFSET&=0:&&&&&&&&&&&&&&&&&&&&&&gparam['start']-=FRONTOFFSET&&&&&&&&&&&&&&&&&&else:&&&&&&&&&&&&&&&&&&&&&&gparam['start']=0&&&&&&&&&&&&&&else:&&&&&&&&&&&&&&&&&&return&True&&&&&&except:&&&&&&&&&&return&False&&&&&&&&&&&&if&__name__&==&"__main__":&&&&&&&&&&&&for&i&in&range(0,100):&&&&&&&&&&import&random&&&&&&&&&&start&=&random.randrange(0,1024*1024*1024)&&&&&&&&&&print&ffmpegex('C:\\16942.ts','C:\\test2\\%d-%d.wmv'%(i,start),start,1024*1024*5,\&&&&&&&&&&&&&&&&&&&&&&&&&"-i&[filelocate]&-acodec&wmav2&-vcodec&wmv2&-qscale&1&-ab&256k&-r&25")&&&&&&&&&&&&&&&&&&&
TA的最新馆藏iOS 集成FFmpeg环境(一):命令行转换视频格式 - 简书
iOS 集成FFmpeg环境(一):命令行转换视频格式
作用:FFmpeg 可以用来转换视频格式,根据FFmpeg实现环境的配置来更改视频的格式。例如:将flv格式转换成mp4格式,将mp4转换成mp3等等
另外,iOS下利用FFmpeg命令行进行视频裁剪,其中的内容会在下一期在具体谈。
iOS 环境下,集成FFmpeg
1. 集成FFmpeg之前, 需要下载:
gas-preprocessor是我们需要编译的ffmpeg的所需要的脚本文件。
1)我们将其解压后,发现内部只有简单的 4 个文件,如下图:
gas-preprocessor解压后的文件
2)将gas-preprocessor.pl文件复制粘贴到 /usr/sbin/ 目录下(按commd+G快捷键,复制此路径) ,若是根本就不能将这个文件复制到这个路径,我们需要换一个路径,/usr/local/bin/ 目录下,然后为文件开启可执行权限,打开终端输入以下命令行。
如果,报错
gas-preprocessor.pl文件拷贝到/usr/local/bin目录下
chmod 777 /usr/sbin/gas-preprocessor.pl或者chmod 777 /usr/local/bin/gas-preprocessor.pl
not permitted
如果还是不行,可以确定是权限问题,,那么执行之前加上
cp -R /Users/mical_lf/Desktop/gas-preprocessor.pl /usr/local/bin
2. Mac安装Brew
通过hombre 我们可以方便的来安装之后的yasm和ffmpeg
curl -LsSf /mxcl/homebrew/tarball/master | sudo tar xvz -C/usr/local --strip 1
当brew安装成功后,就可以随意安装自己想要的软件了,例如wget,命令如下:
sudo brew install wget
卸载的话,命令如下:
sudo brew uninstall wget
查看安装软件的话,命令如下:
sudo brew search /apache*/
注意/apache*/是使用的正则表达式,用/分割。
3. 下载安装yasm
1)yasm 又是什么呢?
Yasm是一个完全重写的 NASM 汇编。目前,它支持x86和AMD64指令集,接受NASM和气体汇编语法,
产出二进制,ELF32 , ELF64 , COFF , Mach - O的( 32和64 ),RDOFF2 ,的Win32和Win64对象的格式,
并生成STABS 调试信息的来源,DWARF 2 ,CodeView 8格式。
2)下载 yams
brew install yams
如果报错error,这执行
sudo brew install yams
检测是否已安装 yasm
brew install yams
如果安装成功,会输出如下信息:
brew info yasm
4. 下载安装FFmpeg
1)安装FFmpeg
brew install ffmpeg如果报错error,这执行
sudo brew install ffmpeg
如果报错,
错误信息:brew link yasm ,所以执行图中标记代码
sudo brew link yams
检测是否已安装 ffmpeg
brew install ffmpeg
2)当命令执行完毕,我们再输入:
brew info ffmpeg
ffmpeg info
看到以上这一大堆东西,我就知道我已经安装完毕了,只是正如大家所见,有很多选择库博主并没有安装。
当然,如果小伙伴们日后想升级 ffmpeg,可以输入以下命令行:
brew update && brew upgrade ffmpeg
3)转换视频格式:下载一个.mp4格式的视频,并将这个视频转换成mp4格式,并将码率设置成3.6MB。1)打开终端,输入以下命令行:(前提是找到这个视频文件,格式如下)
ffmpeg -i moments.mp4 -b:v 640k moments.flv
由于我把视频文件直接放到了桌面上,因此命令行如下:
dongdongwodewangluokankan:~ mical_lf$ ffmpeg -i /Users/mical_lf/Desktop/moments.mp4 -b:v 3.6MB moments.flv
虽然已经转换好了,但是找不到文件呀,卧槽,原来在“我的所有文件”里面:(如下图)
2)终端输出结果:
下一期,会写iOS集成FFmpeg 文档,并且获取视频的第一帧,裁剪视频等功能。
iOS 开发攻城狮一枚,共勉,一起进步。史林枫:C#.NET利用ffmpeg操作视频实战(格式转换,加水印 一步到位)
来源:博客园
ffmpeg.exe是大名鼎鼎的视频处理软件,以命令行参数形式运行。网上也有很多关于ffmpeg的资料介绍。但是在用C#做实际开发时,却遇到了几个问题及注意事项,比如如何无损处理视频?如何在转换格式的同时添加水印,以提升处理效率?,ffmpeg的版本应该选择什么版本?。今天史林峰将用实战的方式来探索C#操作ffmpeg的奥秘。
关于ffmpeg的使用及其参数命令,这里就不做过多介绍了。主要以项目实战中为主。
因工作需要,笔者手头有近300部短视频需要处理,在网上找了不少工具,虽然能用,但是用起来却有一种Hold不住的感觉。要么是处理后有软件水印或片花,要么是不能直接批量一次性处理完,视频要一个一个地去设置。
这里主要需求是给现有的视频做格式转换,如果视频格式已经满足要求,就直接在指定位置加水印(png图片),在处理完之后,为了解决磁盘空间,在视频处理完成之后要删除原视频。笔者对C#语言是最熟知的,因此选用C# Winform做一个简易的视频批处理软件。
先上一张完工的项目截图:
 

 
在指定目录中读取视频,然后一件处理即可(中间的截取秒数的参数,属于视频剪切,暂时没有这块功能)
 
现有的视频均为flv格式的,通过C#调用ffmpeg,转换为mp4格式,并添加水印
C#调用ffmpeg的方法封装如下:


 1 /// &summary&
 2 /// 视频处理器ffmpeg.exe的位置
 3 /// &/summary&
 4 public string FFmpegPath { get; set; }
 5

 6 /// &summary&
 7 /// 调用ffmpeg.exe 执行命令
 8 /// &/summary&
 9 /// &param name="Parameters"&命令参数&/param&
10 /// &returns&返回执行结果&/returns&
11 private string RunProcess(string Parameters)
12 {
13 //创建一个ProcessStartInfo对象 并设置相关属性
14 var oInfo = new ProcessStartInfo(FFmpegPath, Parameters);
15 oInfo.UseShellExecute = false;
16 oInfo.CreateNoWindow = true;
17 oInfo.RedirectStandardOutput = true;
18 oInfo.RedirectStandardError = true;
19 oInfo.RedirectStandardInput = true;
20

21 //创建一个字符串和StreamReader 用来获取处理结果
22 string output = null;
23 StreamReader srOutput = null;
24

25 try
26 {
27
//调用ffmpeg开始处理命令
28
var proc = Process.Start(oInfo);
29
proc.WaitForExit();
31
//获取输出流
34
srOutput = proc.StandardE
35
//转换成string
37
output = srOutput.ReadToEnd();
38
//关闭处理程序
40
proc.Close();
41 }
42 catch (Exception)
43 {
44
output = string.E
45 }
46 finally
47 {
48
//释放资源
49
if (srOutput != null)
50
srOutput.Close();
52
srOutput.Dispose();
53
}
54 }
55 return
56 }

View Code
 
转换格式的命令参数:-i orignal.flv -y -b 1024k -acodec copy -f mp4 newFile.mp4
添加水印的命令参数:-i orignal.flv -i water.png -filter_complex \"overlay=10:10\" newFile.flv
参数简要说明和细节提示:

orignal.flv : 要处理的原始视频文件(最好是绝对路径)
-y : 覆盖已有文件(注意,加水印不可覆盖原始文件,否则只能生成1秒的视频)
-b:视频的码率 这里设置1024k 基本可满足无损处理 如不设置-b参数则默认为200k 视频会非常模糊
-acodec copy : 保持音频质量不变
-f mp4 : 表示转换的视频格式
 
-i water.png : 水印图片路径
overlay=10:10 : 水印距离视频的左上角坐标
其他位置参数:
右上角:main_w-overlay_w-10:10
左下角:10:main_h-overlay_h-10
右下角:main_w-overlay_w-10:main_h-overlay_h-10
 
newFile.mp4
要保存的文件路径

 
上面这个方法就是核心处理。笔者在实际执行的过程中,发现了以下问题:
 
  在使用cmd窗口执行以上命令时(cmd中参数前面要加 ffmpeg 注意文件位置),可以成功处理,但在运行Winform测试的时候,发现只有一个大小为0kb的新文件生成,但迟迟不见处理。给人一种假死的现象。而当笔者关掉调试的Winform程序时,过几秒钟,貌似ffmpeg.exe 又起作用了,文件处理成功了。这个不得其解。(在调用处理程序时,新开了一个线程执行的)
排查情况:
  可能是ffmpeg的版本问题,于是下载了2.8.2版本(应该是最新的),测试,没有任何变化
  检查程序的调用流程,将调用过程cmd窗口显示出来。结果一片空白,什么也没有,依然是没有效果。
最后在经过各种资料的查找之后,在不经意间看到有人说 proc.WaitForExit(); 这句执行会造成程序一直处于等待状态。是的,没错,以前做类似程序调用也是这样做的,也没出现过这种问题。于是,抱着试试看的态度,注释了这一句。当然,程序不再等待执行完毕,proc.Close(); 这一句也要注释一下。测试结果成功!!(懂得底层原理的大牛,望告知一二)
 
问题解决了,但是还有一个处理效率的问题:如何更快的处理?
笔者尝试了各种命令的组合,发现对于不同版本的ffmpeg,有的参数是不能使用的,就笔者使用的2.8.2版本最终 找了一个比较好的解决方案:
可以选择使用以下命令参数:
-i orignal.flv -i water.png -filter_complex \"overlay=10:10\" -y -b 1024k -acodec copy -f mp4
 
-i orignal.flv -i water.png -filter_complex \"overlay=10:10\" -b 1024k -acodec copy
 
上面一个适合同时转换格式和加水印
下面一个适合只加水印,不做格式转换
这些核心问题解决了,剩下的就是文件的读取,保存,判断等等细节了。
 
总结:


C#调用ffmpeg时 不要使用proc.WaitForExit();方法,否则会假死


ffmpeg的版本最好使用最新版本,并参考命令参数说明


无损转换,无损加水印 要注意保证视频的码率 和音频的参数(直接copy,视频不能这样写-avcodec copy
会报错,只能用-b设置视频码率) 


一步到位的处理方法(转换的同时加水印,参考上面的命令参数)

 
程序开发好之后,笔者不用再苦逼地一个一个去设置,处理了,电脑开着,显示器关闭,只听见主机嗷嗷叫的处理,等吃完饭,所有事情均已搞定。。。
 
 
 
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动

我要回帖

更多关于 电脑和平板怎么传文件 的文章

 

随机推荐