FFmpeg 中是否有一个设置可以让我设置视频的源标签,以便我可以跟踪过去编码过(或未编码)的视频?也许可以向当前标签添加文本和/或替换标签?
我有一个(合法获得和复制的)h264 mp4 蓝光翻录文件,我正在尝试减小它的尺寸。
我曾尝试通过 FFmpeg 和 HandBrake 将其编码为 h265,但结果是隔行扫描的视频(源不是隔行扫描的),看起来非常烦人。
我应该向 FFmpeg 指定哪些选项来防止这种情况发生?
到目前为止,我一直使用 FFmpeg 中编解码器的默认选项hevc_nvenc
以及 HandBrake 中等效编解码器。
编辑:
FFprobe 对输入文件的输出(仅相关流):
Stream #0:0(eng): Video: h264 (High), yuv420p(top first), 1920x1080 [SAR 1:1 DAR 16:9], 29.97 fps, 29.97 tbr, 1k tbn
Metadata:
BPS-eng : 26434120
DURATION-eng : 01:58:41.013900000
NUMBER_OF_FRAMES-eng: 213417
NUMBER_OF_BYTES-eng: 23529714835
SOURCE_ID-eng : 001011
_STATISTICS_WRITING_APP-eng: MakeMKV v1.17.7 win(x64-release)
_STATISTICS_WRITING_DATE_UTC-eng: 2024-07-26 11:27:31
_STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES SOURCE_ID
我正在尝试使用 ffmpeg 从视频中截取一些片段并将它们组合在一起,类似于这样。
除了剪辑来自重叠的时间戳之外。我的命令如下所示:
"C:\Program Files\ffmpeg\bin\ffmpeg.exe" -y -i "C:\temp\5min.mp4" ^
-vf "select='between(t,4,6.5)+between(t,5,6)', setpts=N/FRAME_RATE/TB" ^
-af "aselect='between(t,4,6.5)+between(t,5,6)', asetpts=N/SR/TB" "C:\temp\5min-clip.mp4"
输出的视频仅包含第一个剪辑。我使用的是最新版本的 ffmpeg。
我如何实现这个目标?
我有一个非常简单的命令行可以将多幅图像转换为其他格式:
for %f in (*.png*) do ffmpeg -i "%f" -c:v libjxl -distance 0.0 "%~nf.jxl"
问题是,现在我正在处理小米 Redmi Note 13 4G 智能手机拍摄的 RAW 照片。这是我用手机拍摄的RAW 照片,并使用 Photoshop 进行了“去噪”,从而生成了修改后的 DNG 文件。
使用 ffprobe 我能够从文件中获取一些信息
[tiff @ 00000220445a4d80] Tiled TIFF is not allowed to strip
Input #0, tiff_pipe, from 'input.dng':
Duration: N/A, bitrate: N/A
Stream #0:0: Video: tiff, bayer_grbg16le, 4000x3000, 25 fps, 25 tbr, 25 tbn
我不知道之前的信息是什么意思,也不知道如何正确使用它将文件转换为 JPEG XL。在查阅了论坛后,我使用了这些信息并尝试:
for %f in (*.dng*) do ffmpeg -f rawvideo -r 25 -s 4000x3000 -pix_fmt bayer_grbg16le -i "%f" -c:v libjxl -distance 0.0 -update true -frames:v 1 "%~nf.jxl"
但由于我不知道自己在做什么,控制台显示:
[rawvideo @ 0000022fb537fa40] Estimating duration from bitrate, this may be inaccurate
Input #0, rawvideo, from 'input.dng':
Duration: 00:00:00.04, start: 0.000000, bitrate: 5746833 kb/s
Stream #0:0: Video: rawvideo ([186]GR[16] / 0x105247BA), bayer_grbg16le, 4000x3000, 4800000 kb/s, 25 tbr, 25 tbn
Stream mapping:
Stream #0:0 -> #0:0 (rawvideo (native) -> jpegxl (libjxl))
Press [q] to stop, [?] for help
Truncating packet of size 24000000 to 4734168
[rawvideo @ 0000022fb537fa40] Packet corrupt (stream = 0, dts = 1).
[in#0/rawvideo @ 0000022fb537f640] corrupt input packet in stream 0
[rawvideo @ 0000022fb5394dc0] Invalid buffer size, packet size 4734168 < expected frame_size 24000000
[vist#0:0/rawvideo @ 0000022fb538b7c0] [dec:rawvideo @ 0000022fb5392440] Error submitting packet to decoder: Invalid argument
Output #0, image2, to 'input.jxl':
Metadata:
encoder : Lavf61.9.101
Stream #0:0: Video: jpegxl, rgb24(pc, gbr/unknown/unknown, progressive), 4000x3000, q=2-31, 200 kb/s, 25 fps, 25 tbn
Metadata:
encoder : Lavc61.27.101 libjxl
[libjxl @ 0000022fb538f280] Unknown transfer function, assuming IEC61966-2-1/sRGB. Colors may be wrong.
[libjxl @ 0000022fb538f280] Unknown primaries, assuming BT.709/sRGB. Colors may be wrong.
[out#0/image2 @ 0000022fb537f400] video:31195KiB audio:0KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: unknown
frame= 1 fps=0.1 q=-0.0 Lsize=N/A time=00:00:00.04 bitrate=N/A speed=0.00473x
有人能帮帮我吗?我只想将必要的参数集成到我的一小行代码中,for %f in (*.dng*) do ffmpeg -i "%f" -c:v libjxl -distance 0.0 "%~nf.jxl"
以便将 RAW dng 文件无损转换为 JPEG XL 文件。
.jxl
PS,我知道 Windows 11 和 Android 都不原生支持 JPEG XL,但我只是想用文件而不是文件来节省硬盘上的一些空间.dng
。
当我使用时,force_original_aspect_ratio=decrease
视频居中。但是当我使用时,force_original_aspect_ratio=increase
只有高度会缩放以适合屏幕。宽度不会缩放,并且视频看起来被拉伸了。
这是我的代码和我正在使用的视频文件。
示例.bat
ffmpeg -i test1-.mp4 -r 30 -video_track_timescale 1000k -vf setsar=1 -q:v 1 -f mpegts -c:a copy test1.mp4
ffmpeg -i test3.mkv -r 30 -video_track_timescale 1000k -vf setsar=1 -q:v 1 -f mpegts -c:a copy test3.mp4
ffmpeg -f concat -i mylist1.txt -vf scale=720:1280:force_original_aspect_ratio=increase,setsar=1 merged_video2.mp4
我的列表1.txt
file test1.mp4
file test3.mp4
视频文件 https://drive.google.com/drive/folders/14mBJ_RyA-Pw1W-eCKn4ujB9FQ6UPZ1Y-?usp=sharing
test3.mp4 是使用时被拉伸的视频force_original_aspect_ratio=increase
。它具有自定义宽高比(屏幕录制)
我希望能够为所有主流音频文件格式添加章节标记,FFmpeg 可以做到这一点(使用-map_chapters
选项)——但FFmpeg 总是会破坏其他元数据。它无法识别的任何标签都会从目标文件中删除。如何通过命令行为音频文件添加章节标记而不操作任何其他元数据?
我想购买一些旧的迷你电脑来处理来自(也是旧的)TP Link IP 摄像机的流,添加时间戳并使用 H.265 重新编码视频以节省存储空间。
我有 4 个摄像头,源流是 640x480 的 mjpeg。
英特尔 i3-4 代处理器能胜任这项工作吗?还是我需要更快的处理器?PC 需要 24x7 全天候运行,因此功耗也是一个问题。
我目前正在使用以下命令(欢迎优化):
ffmpeg -i "http://<camera-ip>:8080/stream/video/mjpeg?Username=admin&Password=<base64-password>" -map 0 -c:v libx265 -preset veryfast -f segment -segment_time 60 -reset_timestamps 1 -segment_format mp4 -strftime 1 -vf "drawtext=fontsize=36:fontcolor=white:text='%{localtime\:%d/%m/%Y %H\\\\\:%M\\\\\:%S}'" "camera/frente/capture-%Y-%m-%d_%H-%M-%S.mp4"
我在视频上叠加水印,如下所示:
ffmpeg -y -vsync 0 -hwaccel cuda -hwaccel_output_format cuda -i ./input.avi -i ./watermark.png -filter_complex "
[0]hwdownload,format=nv12[downloaded_video];
[1]format=rgba,colorchannelmixer=aa=0.3[logo];
[logo]scale=300:300[scaled_logo];
[downloaded_video][scaled_logo]overlay=W-w-10:H-h+10[overlayed_video];
[overlayed_video]hwupload_cuda=extra_hw_frames=5" -c:v h264_nvenc ./output.mp4
有没有办法使用 nvidia 的缩放过滤器 (scale_cuda、scale_npp、scale2ref_npp) 和覆盖过滤器 (overlay_cuda) 来避免 hwdownload 和 hwupload?我尝试了很多方法,但无法保留 png 图像的透明度,这会使水印变成一个大的白色块。
我希望能够一次性将“ffmpeg”命令作为服务器运行,并让 REST 端点通过任何支持的协议调用服务器,而不是在 REST API 中的每个请求上运行“ffmpeg”命令。端点应该能够在每个请求上独立且同时地流式传输输入并从服务器接收流式输出。使用 ffmpeg CLI 可以做到这一点吗?
这与动态添加/删除输入及其相应的输出流的问题有关。我知道“ffmpeg”可以处理任意数量的输入和输出,但我正在寻找的是能够在命令启动后启动和结束流。
如果可以的话,请提供正确的配置/资源来实现它。谢谢。
我想将 8 位 h.265 视频转换为 h.264,且不损失质量,以便能够在现在有点旧的仅支持 h.264 的电视上观看它。
我发现这篇文章非常有用:如何将 10 位 H.265/HEVC 视频转换为 H.264 而不损失质量?
但不知何故,生成的 h.264 视频仍然无法在我的电视上观看。这个视频和原版一样,嵌入了字幕(我不知道这是否是我的电视的问题),音频流如下:
Format: AAC LC SBR.
Format/Info: Advanced Audio Codec Low.
Complexity with Spectral Band Replication.
Commercial name: HE-AAC.
Codec ID: A_AAC-2.
我对 ffmpeg 命令做了两处更改,效果不错。我仍未在平台上添加 +50 积分来发表评论,因此对于遇到同样问题的人,我撰写了这篇文章,下面是我的回复。