我有2个视频:HEADSHOT.MOV和SCREEN.MOV.它们都是大文件,我希望缩小(大小,比特率等)并将这两个并排放置在同一个非常宽的视频帧中.最终的结果是,当您播放output_video.mp4时,您将拥有一个非常宽的帧,两个视频同步并以相同的速率播放.
这是我想要做的合成不正确的版本:
ffmpeg -i HEADSHOT.MOV -t 00:02:00 -acodec libfaac -ab 64k -vcodec libx264 -r 30 -pass 1 -s 374x210 -vf "movie=SCREEN.MOV [small]; [in][small] -an -r 30 -pass 1 -s 374x210 overlay=10:10 -t 00:02:00 [out]" -threads 0 output_movie.mp4
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,我也尝试将测试电影的持续时间设置为2分钟,这引出了另一个问题:处理2部不同长度的电影的最佳方式是什么(如果它们很接近)?
到目前为止我发现有用的资源是:
http://ffmpeg.org/ffmpeg.html#overlay-1
非常感谢任何帮助/建议.我在使用FFMPEG语法时遇到问题!谢谢!
我目前正在开发一个Web应用程序,需要接受用户以任何格式(.avi,.mov等)上传的视频,并将它们转换为flv,以便在基于flash的播放器中播放.
由于该站点是基于OpenCms的,因此最好的解决方案是OpenCms的现成插件,允许上传和播放在后台进行转码操作的视频,但只需要一组Java类来进行转码就可以了.我可以自己制作上传表格和播放部分.
我使用分段器将我的MPEG 2 Ts文件分割成一系列用于HTTP直播的媒体段
并且每个段的开始时间跟在前一段之后(例如:段的开始时间:00:00,00:10,00:20,00:30,......)
(在Ubuntu中)
问题是:
当我使用ffmpeg转码其中一个媒体片段(ex 800k bps到200k bps)
转码媒体段的开始时间将重置为0
例如:当我转码第三段时,
开始段的时间改变为:00:00,00:10,00:00,00:30,...
一旦播放转码媒体片段,它会导致我的播放器冻结
有相同的开始时间转码媒体文件的解决方案吗?
我想这是ffmpeg重置段的PTS(演示时间戳)
但我不知道如何解决它...
这是我的ffmpeg命令(转码为250k bps)
============================
ffmpeg -y -i sample-03.ts -f mpegts -acodec libfaac -ar 48000 -ab 64k -vcodec libx264 -b 250k -flags +loop -cmp +chroma \
-partitions +parti4x4+partp8x8+partb8x8 -subq 7 -trellis 0 -refs 0 -coder 0 -me_range 16 -keyint_min 25 \
-sc_threshold 40 -i_qfactor 0.71 -maxrate 250k -bufsize 250k -rc_eq 'blurCplx^(1-qComp)' -qcomp 0.6 \
-qmin 10 -qmax 51 -qdiff 4 -level 30 …
Run Code Online (Sandbox Code Playgroud) 我试图使用调用ffmpeg的JAVE将*.mov文件转码为*.mp4文件.输入文件和输出文件都是InputStream和OutputStream形式.这意味着我需要将InputStream和OutputStream作为-f和-y parematers传递给ffmpeg.我怎么做 ?
//Read a movfile.mov converted into a FileInputStream
InputStream fileInputStream = getFileInputStream();
OutputStream fileOutputStream = new FileOutputStrea(outputMP4File) //Output
Process p = Runtime.exec("ffmpeg -i - -y -");
InputStream pInStrm = p.getInputStream();
OutputStream pOutStrm = p.getOutputStream();
int vin = 0, vout = 0;
Thread read = new Thread() {
byte[] buff = new byte[4096];
void run() {
while ((vin=fileInputStream.read(buf))!=-1) {
pOutStrm.write(buf, 0, vin);
}
}
}; read.start();
Thread write = new Thread() {
byte[] buff = new byte[4096];
void run() …
Run Code Online (Sandbox Code Playgroud) 我正在尝试生成一个SVG图像,然后使用Apache Batik将其转码为PNG.但是,我最终得到一个空图像,我不明白为什么.
我使用SVGDomImplementation中的Document作为我的代码转换的基础(避免将SVG写入磁盘并再次加载).这是一个例子:
DOMImplementation domImpl = SVGDOMImplementation.getDOMImplementation();
String namespace = SVGDOMImplementation.SVG_NAMESPACE_URI;
Document document = domImpl.createDocument(namespace, "svg", null);
//stuff that builds SVG (and works)
TranscoderInput transcoderInput = new TranscoderInput(svgGenerator.getDOMFactory());
PNGTranscoder transcoder = new PNGTranscoder();
transcoder.addTranscodingHint(PNGTranscoder.KEY_WIDTH, new Float(svgWidth));
transcoder.addTranscodingHint(PNGTranscoder.KEY_HEIGHT, new Float(svgHeight));
try {
File temp = File.createTempFile(key, ".png");
FileOutputStream outputstream = new FileOutputStream(temp);
TranscoderOutput output = new TranscoderOutput(outputstream);
transcoder.transcode(transcoderInput, output);
outputstream.flush();
outputstream.close();
name = temp.getName();
} catch (IOException ioex) {
ioex.printStackTrace();
} catch (TranscoderException trex) {
trex.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
我的问题是结果图像是空的,我不明白为什么.任何提示?
最近我一直在摆弄 FFMPEG 和通过 Nodejs 进行流传输。我的最终目标是通过 HTTP 提供来自任何输入文件类型的转码视频流,根据分段需要实时生成。
我目前正在尝试使用 HLS 来处理这个问题。我使用输入视频的已知持续时间预先生成一个虚拟 m3u8 清单。它包含一堆指向各个恒定持续时间段的 URL。然后,一旦客户端播放器开始请求各个 URL,我就会使用请求的路径来确定客户端需要哪个时间范围的视频。然后我对视频进行转码并将该片段传输回给他们。
现在解决问题:这种方法大部分有效,但有一个小的音频错误。目前,对于大多数测试输入文件,我的代码生成的视频虽然可播放,但在每个片段的开头似乎有一个非常小的(< 0.25 秒)音频跳跃。
我认为这可能是 ffmpeg 中分割使用时间的问题,其中音频流可能无法在视频的确切帧处准确地切片。到目前为止,我一直无法找到解决这个问题的方法。
如果有人有任何方向,他们可以指导我 - 甚至是解决这个用例的现有库/服务器 - 我很感谢指导。我对视频编码的了解相当有限。
我将在下面包含我的相关当前代码的示例,以便其他人可以看到我陷入困境的地方。您应该能够将其作为 Nodejs Express 服务器运行,然后将任何 HLS 播放器指向 localhost:8080/master 以加载清单并开始播放。请参阅transcode.get('/segment/:seg.ts'
末尾的行,了解相关的转码位。
'use strict';
const express = require('express');
const ffmpeg = require('fluent-ffmpeg');
let PORT = 8080;
let HOST = 'localhost';
const transcode = express();
/*
* This file demonstrates an Express-based server, which transcodes & streams a video file.
* All transcoding is handled …
Run Code Online (Sandbox Code Playgroud) 我正在我的服务器上测试 FFMPEG。我正在尝试将 H265 10 位转码为 H264 8 位,以支持在所有主要网络浏览器上播放视频。
1 . 这是第一条命令:
ffmpeg -i 4K.ts -c:a aac -c:v h264 -crf 19 -preset ultrafast out.mp4
Run Code Online (Sandbox Code Playgroud)
结果:视频只能在 VLC 媒体播放器上播放。无法在任何浏览器上播放
2 . 然后我尝试使用这个命令:
ffmpeg -i 4K.ts -c:a aac -c:v h264 -crf 19 -profile:v main -preset ultrafast -vf "format=yuv420p" out.mp4
Run Code Online (Sandbox Code Playgroud)
结果:视频可以在任何地方播放,但颜色损失很大。
3 . 然后我尝试了另一个命令:
ffmpeg -i 4K.ts -c:a aac -c:v h264 -crf 19 -profile:v main -preset ultrafast -vf "format=yuvj420p" out.mp4
Run Code Online (Sandbox Code Playgroud)
结果:视频可以在任何地方播放,但颜色范围增加
我不知道我是否遗漏了任何内容,或者我是否应该完全禁止用户上传 10 位深度的视频。任何帮助将不胜感激
如果有人对我正在测试的视频感兴趣,请点击以下链接:https://drive.google.com/uc?export =download&id=1pGsnknkoIDRPKrW-YPFS7U31J09PeM4N
我通过许多谷歌结果得出了这些命令,其中一些是:
基本上,这就是我要做的事情:1.用户将URL作为GET参数传递给我的servlet.2. Servlet使用ProcessBuilder将该URL中包含的媒体转换为有效的媒体格式(即:MP3).3. servlet将由FFMPEG转码的输出文件流回到浏览器.
1和2工作正常,但它是3我有问题.我能做的最好的事情是为正在转码的输出文件创建一个FileInputStream,并将其作为响应发送,但它不起作用.我的猜测是,因为我正在尝试流式传输文件.
无论如何拦截FFMPEG中的输出文件参数并将其读入InputStream?在我看来,似乎不应该难以获取输入文件A,将其转码为输出文件B,然后将输出文件B流式传输回客户端.
ProcessBuilder pb = new ProcessBuilder("ffmpeg.exe", "-i", url, "file.mp3");
Process p = pb.start();
final InputStream inStream = p.getErrorStream();
new Thread(new Runnable() {
public void run() {
InputStreamReader reader = new InputStreamReader(inStream);
Scanner scan = new Scanner(reader);
while (scan.hasNextLine()) {
System.out.println(scan.nextLine());
}
}
}).start();
ServletOutputStream stream = null;
BufferedInputStream buf = null;
try {
stream = response.getOutputStream();
File mp3 = new File(file.mp3");
//set response headers
response.setContentType("audio/mpeg");
response.addHeader("Content-Disposition", "attachment; filename=file.mp3");
response.setContentLength(-1);
//response.setContentLength((int) mp3.length());
FileInputStream input = new FileInputStream(mp3); …
Run Code Online (Sandbox Code Playgroud) 我在一次噩梦中试图解决这个问题。昨天我问了一个问题,但到目前为止,长话短说,我一生无法解决。
我要做的就是在node.js应用程序中使用FFmpeg将.avi文件转码为.flv文件,这仅适用于FFmpeg的命令行,而在应用程序中无效,这是代码:
var ffmpeg = require('fluent-ffmpeg');
//make sure you set the correct path to your video file
var proc = new ffmpeg({ source: 'C:/Users/Jay/Documents/movie/drop.avi', nolog: true });
//Set the path to where FFmpeg is installed
proc.setFfmpegPath("C:\\Users\\Jay\\Documents\\FFMPEG\\bin");
proc
//set the size
//.withSize('50%') <-- error appears after this line
// set fps
//.withFps(24)
// set output format to force
//.toFormat('flv')
// setup event handlers
.on('end', function() {
console.log('file has been converted successfully');
})
.on('error', function(err) {
console.log('an error happened: ' + err.message); …
Run Code Online (Sandbox Code Playgroud) 我在使用 VLC 播放器录制 rtsp 流时遇到问题。实际上我的方法适用于 MacOS X,但不适用于 Windows。命令行:
vlc -vvv rtsp://admin:admin@192.168.0.151/live/h264/ --sout="#transcode{vcodec=mp4v,vfilter=canvas{width=800,height=600}}:std{access=file,mux=mp4,dst=C:\123.mp4}"
Run Code Online (Sandbox Code Playgroud)
在 MacOS 上它工作正常,但在 Windows 下它会创建不可读的文件。媒体信息输出:
General
Complete name : C:\123.mp4
Format : MPEG-4
Format profile : Base Media
Codec ID : isom
File size : 1.08 MiB
Run Code Online (Sandbox Code Playgroud)
有什么建议?
我正在尝试使用ffmpeg实现部分转码.我目前使用的命令是:
ffmpeg.exe -ss start-time -i 源文件 -t duration -y -s 640x360 -b:v 1024k -vcodec libx264 -r 29.7 -movflags faststart -pix_fmt yuv420p outputfile
在ffmpeg文档中,我读到了-to参数:
- 到位置(输出)停止将输出写入位置.position可以是以秒为单位的数字,也可以是hh:mm:ss [.xxx]形式.
-to和-t是互斥的,-t具有优先权.
但是,当我试图以诚代替"-t",输出是一样的,我的意思后的值-to被当作了把视频的持续时间.我认为它会像结束时间那样对待价值.我错过了什么吗?
我正在使用 ffmpeg 将一种视频格式转换为另一种:
“ffmpeg -ac 1 -i vid1.mp4 -sameq vid1.avi”
我收到错误:
“mp2 中不允许编码 6 个通道”
现在我明白这意味着什么 - 如果我关闭声音转码(使用“-an”选项),转码工作正常。我如何解决这个问题并仍然保留声音?
更多信息
输入文件:
似乎流 0 编解码器帧速率与容器帧速率不同:47.95 (5000000/104271) -> 23.98 (24000/1001) Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'vid1.mp4': Duration : 00:02:03.24, 开始: 0.000000, 比特率: 8236 kb/s Stream #0.0(und): Video: h264, yuv420p, 1920x816, 23.98 tbr, 23.98 t95: aundc.ac. , 48000 Hz, 5.1, s16 必须至少指定一个输出文件