我正在尝试使用 ffmpeg 从 H.264 无线 IP 摄像机捕获静止图像。我在这里发现了一个类似的问题:如何使用 ffmpeg 从 H264 视频文件中提取高质量的 JPEG 图像?
ffmpeg -y -i rtsp://10.2.69.201:554/ch0_0.h264 -r 10 -f image2 /var/www/camera.jpg
Run Code Online (Sandbox Code Playgroud)
我已经实现了它,如该示例所示。你可以看到我在这里得到的图像样本:

基本上问题是图像的底部总是块状的。如果天空有更多细节和云彩,则图像的整个下半部分可能会出现块状或模糊。
我的相机的流选项有限。其中之一是 I-Frame 间隔,您可以在 25-100 之间改变它。
有没有人对我如何获得更好的图像有一些建议?我不介意是否可以将流实际存储到视频文件中并每 2 分钟提取一次静止图像。这很容易做到吗?
这是 ffmpeg 输出:
ffmpeg version 1.2.4 Copyright (c) 2000-2013 the FFmpeg developers
built on Oct 3 2013 07:36:02 with gcc 4.8 (Debian 4.8.1-10)
configuration: --prefix=/usr --extra-cflags='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security ' --extra-ldflags='-Wl,-z,relro' --cc='ccache cc' --enable-shared --enable-libmp3lame --enable-gpl --enable-nonfree --enable-libvorbis --enable-pthreads --enable-libfaac --enable-libxvid --enable-postproc --enable-x11grab --enable-libgsm --enable-libtheora …Run Code Online (Sandbox Code Playgroud) 我尝试将视频从 .raw 转换为 .mp4。出于这个原因,我确实下载、构建和安装了 x264 和 ffmpeg。但是,命令:
ffmpeg -f h264 -i output.raw -vcodec copy output.mp4
失败并出现错误(如下图所示)。有没有什么办法解决这一问题?

我还运行的命令:
1
root@beagleboard:/# v4l2-ctl --list-formats
ioctl: VIDIOC_ENUM_FMT
Index : 0
Type : Video Capture
Pixel Format: 'YUYV'
Name : YUV 4:2:2 (YUYV)
Index : 1
Type : Video Capture
Pixel Format: 'MJPG' (compressed)
Name : MJPEG
Run Code Online (Sandbox Code Playgroud)
2
root@beagleboard:/dev# v4l2-ctl --set-fmt-video=pixelformat=0
Run Code Online (Sandbox Code Playgroud) 我有一个很长的 MKV 文件,我想将其拆分为各个章节。
运行ffmpeg -i long.mkv为我提供了有关文件中嵌入的章节的所有信息:
Duration: 01:23:45.80, start: 0.000000, bitrate: 8116 kb/s
Chapter #0.0: start 0.000000, end 235.000000
Metadata:
title : Chapter 01
Chapter #0.1: start 235.000000, end 450.160000
Metadata:
title : Chapter 02
Chapter #0.2: start 450.160000, end 789.400000
...
Run Code Online (Sandbox Code Playgroud)
文件中有 10 章 - 我想最终得到 10 个单独的文件。
它看起来-map_chapters可能类似于类似的东西 - 但我找不到任何关于它的文档。
我目前正在使用 ffmpeg 来切片视频文件。我通过一个名为 ffmpeg_split.sh 的脚本自动化了这个过程。虽然这很慢,但它可以有效地将视频拆分为等效的设置。唯一的问题是它有帧速率问题。下面的邪恶汤推荐了一种segment在 ffmpeg 中使用的方法。我试过这个,但它没有给我等效的持续时间段。
更新
每个 evilsoup 使用此命令分割视频:
ffmpeg -i input.mp4 -c copy -map 0 -segment_time 8 -f segment output%03d.mp4
老的:
以下是使用脚本切片视频的语法: ffmpeg_split.sh -s test_vid.mp4 -o video-part%03d.mp4 -c 00:00:08
结果
my_split_script.sh
input.mp4 – Duration 00:01:20
#EXTINF:10,
Output01.mp4
#EXTINF:10,
Output02.mp4
#EXTINF:10,
Output03.mp4
#EXTINF:9,
Output04.mp4
#EXTINF:10,
Output05.mp4
#EXTINF:10,
Output06.mp4
#EXTINF:11,
Output07.mp4
#EXTINF:10,
Output08.mp4
real 0m30.517s #execution time
Run Code Online (Sandbox Code Playgroud)
ffmpeg
input.mp4 – Duration 00:01:20
#EXTINF:10,
Output01.mp4
#EXTINF:10,
Output02.mp4
#EXTINF:6,
Output03.mp4
#EXTINF:10,
Output04.mp4
#EXTINF:10,
Output05.mp4
#EXTINF:7,
Output06.mp4
#EXTINF:10,
Output07.mp4
#EXTINF:9, …Run Code Online (Sandbox Code Playgroud) 我使用以下命令将两个视频合并到一个文件中。不幸的是,第二个视频涵盖了第一个视频,并且不可见。如何使第二个视频透明(例如 50%)?
ffmpeg
-i in1.mp4 -i in2.mp4
-filter_complex "nullsrc=size=480x360 [base];
[0:v] setpts=PTS-STARTPTS, scale=480x360 [top];
[1:v] setpts=PTS-STARTPTS, scale=480x360 [bottom];
[base][top] overlay=shortest=1 [temp];
[temp][bottom] overlay=shortest=1"
-acodec libvo_aacenc -vcodec libx264 out.pm4
Run Code Online (Sandbox Code Playgroud) 我可以使用以下命令从使用 ffmpeg 的视频中提取图像,并将它们保存到文件系统:
... | ffmpeg -i - -f image2 'img-%03d.png'
Run Code Online (Sandbox Code Playgroud)
我想将这些图像通过管道传输到另一个应用程序,而不是将它们保存到文件系统 - 它们在管道中的分离方式并不重要,因为它将是我自己控制的 NodeJS 脚本。
以下不起作用:
... | ffmpeg -i - -f image2 pipe: | ...
Run Code Online (Sandbox Code Playgroud)
错误与
[image2 @ 0xe1cfc0] Could not get frame filename number 2 from pattern 'pipe:' (either set updatefirst or use a pattern like %03d within the filename pattern)
av_interleaved_write_frame(): Invalid argument
Run Code Online (Sandbox Code Playgroud)
有没有办法在不使用文件系统的情况下使用 ffmpeg 从视频中提取图像?
我根本不熟悉 FFMPEG,想知道如何将 MP4 转换为 OGV 格式,同时仍保持相同的视频和音频质量?
我手动创建了一些 5.1 DTS 轨道的立体声混音。现在我想将新的音轨添加到原始电影文件中,而不删除旧的音轨。
我的问题似乎是我要么错过了将曲目的正确映射交给 ffmpeg(该文件已经有两个音轨和一些子图块,这似乎也很重要),所以我收到了“流图的数量必须匹配输出流的数量”(从内存中引用),或者我什至把整个流/映射概念都弄错了。
我正在尝试做的事情有什么好的解释吗?我什至阅读了有关该主题的整篇文章,ffmpeg.org 中的文档在这种情况下并没有那么有用。
更具体地说:我想知道是否有任何方法可以让 ffmpeg 显示文件的实际流映射,以及如何将我的立体声轨道合并到其中?
到目前为止,我发现的所有内容都涉及无声视频或替换音轨,这不是我想要做的。
我有一个包含 H264 视频 (25 FPS) 的 MP4 文件。某些时间戳不正确(出于某些原因......)。我可以处理文件并只重新生成时间戳而不重新编码吗?我试过这个
ffmpeg -r 25 -i infile -c copy outfile
Run Code Online (Sandbox Code Playgroud)
但即使“-r”的文档说:
作为输入选项,忽略存储在文件中的任何时间戳, 而是假设恒定帧速率 fps 生成时间戳。
我也试过提到的建议,这里的底部:
ffmpeg -fflags +genpts -i infile -c copy outfile
Run Code Online (Sandbox Code Playgroud)
这也不会更改输出文件中的时间戳。还有其他方法可以执行此任务吗?时间戳是一种元数据,所以我认为它应该以某种方式成为可能。
我有一个旧视频(由 Casio Exilim EX-Z40 制作,如果重要的话),其音频流ffprobe报告为pcm_u8, 8000 Hz, mono, u8.
我想把它转码成现代的东西。
使用 FFmpeg 默认值转码失败:
libfaac 不支持这种输出格式!
所以大概 libfaac 不支持 8 kHz,因为-c:a copy有效。
哪些编码器支持 8 kHz 采样率?这里的列表几乎没有提到采样率。
我可以编写脚本来尝试每个已安装的编解码器,从...
ffmpeg -codecs | grep EA`
Run Code Online (Sandbox Code Playgroud)
...直接查看哪些有效?