我希望能够为所有主流音频文件格式添加章节标记,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 积分来发表评论,因此对于遇到同样问题的人,我撰写了这篇文章,下面是我的回复。
我正在录制 SOOPLive(AfreecaTV)直播。
它们都是使用HLS协议的,我尝试使用StreamLink和N_m3u8DL-RE将流下载为.ts文件,但是ffplay在播放这些.ts文件时总是出现很多错误。
[mpegts @ 0000019db9106500] Packet corrupt (stream = 0, dts = 49208280).
[mpegts @ 0000019db9106500] Packet corrupt (stream = 0, dts = 49388370).
[mpegts @ 0000019db9106500] Packet corrupt (stream = 0, dts = 49568460).
[mpegts @ 0000019db9106500] Packet corrupt (stream = 0, dts = 49748820).
[mpegts @ 0000019db9106500] Packet corrupt (stream = 0, dts = 49928730).
[mpegts @ 0000019db9106500] Packet corrupt (stream = 0, dts = 50108640).
[mpegts @ 0000019db9106500] Packet corrupt (stream = 0, dts = 50288640).
[mpegts @ 0000019db9106500] Packet corrupt (stream = 0, dts = 50468280).
[mpegts @ 0000019db9106500] Packet corrupt (stream = 0, dts = 50648280).
[mpegts @ 0000019db9106500] Packet corrupt (stream = 0, dts = 50828820).
但是视频和音频看起来不错,并且也没有寻道问题。
对我来说这是一个很好的视频,我不知道为什么 ffplay 一直报告这些错误。
如果这确实是一个错误,我该如何修复它?
这是文件: https: //www.mediafire.com/file/ef0z1528dcg07j9/sample3.rar/file
我首先生成了ASS文件:
ffmpeg -i foo.srt bar.ass
然后创建了这个:
[Script Info]
; Script generated by FFmpeg/Lavc60.31.102
ScriptType: v4.00+
PlayResX: 384
PlayResY: 288
ScaledBorderAndShadow: yes
YCbCr Matrix: None
[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Arabic Poetry,16,&Hffffff,&Hffffff,&H0,&H0,0,0,0,0,100,100,0,0,1,1,0,2,10,10,10,1
[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:01.00,0:00:05.00,Default,,0,0,0,,هذا نص تجريبي باللغة العربية لاستخدامه في العروض.
使用以下方法刻录:
ffmpeg -i input.mp4 -vf subtitles=bar.ass output.mp4
[] [] [] [] []
但是阿拉伯语单词的文本看起来是这样的。为什么?
注意:“阿拉伯诗歌”显然是阿拉伯文本的字体,所以肯定不是原因。
我正在录制直播,很多人都会因为PK而调整分辨率。
比如solo时分辨率为720x1280,开始PK后,分辨率变为900x720,PK结束后,回到solo,分辨率又变为720x1280。
这些录制的视频文件太大了,而且都是h264,所以我尝试将它们重新编码为AV1以减小文件大小。
但重新编码后,分辨率是固定的,不会像以前那样正确调整。
这是图片,我没有足够的声誉来发布图片。https ://i.sstatic.net/LhLAXMjd.gif
例如,原始文件在左侧,重新编码的文件在右侧。
本视频以 900x720 开始,PK 结束并于 00:00:06 回到独奏,分辨率变为 720x1280。
ffplay 播放原始视频文件,一切看起来都很好。
ffplay 播放重新编码的视频文件,在 00:00:06 之后,分辨率仍然保持 900x720,并导致图形拉伸和切断。
这是我使用的命令:
ffmpeg -i original.flv -y -c:v libsvtav1 re-encode.mp4
我尝试使用相同的编解码器 h264 重新编码,但同样的问题仍然存在
ffmpeg -i original.flv -y -c:v libx264 re-encode.mp4
不知道如何解决这个问题
这是视频文件:https ://www.mediafire.com/file/0vaxtzurwhom8bn/ReEncode_Resolution.zip/file
我希望重新编码的视频文件可以在 ffplay 中正确播放(需要时分辨率会改变)
我想将 JPG 图像与 MP4 剪辑连接起来(Windows 10)。图像必须在生成的剪辑的前 5 秒内静默播放,然后播放原始视频。JPG 需要缩放以匹配剪辑分辨率,原始剪辑的帧速率和分辨率必须保持不变。我想在不重新编码视频的情况下完成此操作,因为我有 100 多个剪辑需要处理:
ffmpeg -y -loop 1 -t 5 -i %1.jpg -f lavfi -t 1 -i anullsrc -i %1.mp4 -filter_complex "[0:v][2:v]scale2ref[logo][video]; [logo]setsar=sar=1[logo]; [logo][1:a][video][2:a]concat=n=2:v=1:a=1" %1-output.mp4
但是,ffmpeg 卡在第 69 帧,没有前进。如果我终止程序,结果将只剩下 5 秒的图像和几帧源音频/视频。我做错了什么?
ps Ffmpeg 是最新版本。
作为问题的背景,我使用一个程序生成的复杂过滤器从许多输入中合成一个视频。小错误会累积起来,所以我需要精确的修剪(重新编码就可以了)。
例如,我需要从链接视频(FPS=30)的给定帧开始的 44 帧。
以下是两次尝试(使用ffmpeg
版本 6.1.1):
尝试 1:
ffmpeg -i input.mp4 -vf "trim=start=3.2666666666666666:end=4.7333,setpts=PTS-STARTPTS" -an output.mp4
尝试2:
ffmpeg -i input.mp4 -vf "trim=start=3.2666666666666666:end=4.7334,setpts=PTS-STARTPTS" -an output.mp4
虽然时间戳的差异end
只有 0.0001,但第一次尝试产生了 43 帧(持续时间为 1.433333 秒),而第二次尝试产生了 45 帧(持续时间为 1.50 秒)。无论我在时间戳中输入什么end
,我都无法获得 44 帧...
我通过以下方式获取帧数:
ffprobe -show_frames output.mp4 | grep FRAME | wc -l
(将此数字除以二,因为同时计算[FRAME]
和[/FRAME]
)
如何解释这种行为?我怎样才能有预见地修剪我需要的帧?
更新start_frame
如果我使用和,会观察到相同的行为end_frame
。对于从 98 到 141 的范围,我得到 43 帧。对于从 98 到 142 的范围,我得到 45 帧。我无法得到 44...