AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-323079

Hashim Aziz's questions

Martin Hope
Hashim Aziz
Asked: 2024-03-09 07:55:54 +0800 CST

用逗号替换 X 换行符并删除每 N 个换行符

  • 5

我在文本文件中记录了以下格式的记录:

Record1
Record1
Record1
Record1

Record2
Record2
Record2
Record2

...

我需要将此文件转换为 CSV,方法是用逗号替换前 3 个换行符并删除第 4 个换行符,结果如下所示:

Record1,Record1,Record1,Record1
Record2,Record2,Record2,Record2

...

在 Bash 中执行此操作的最佳方法是什么,其中最好的方法更多的是健壮性而不是性能 - 该任务不会经常完成,但确实需要允许值包含除空格和换行符之外的几乎任何字符。

bash
  • 3 个回答
  • 38 Views
Martin Hope
Hashim Aziz
Asked: 2022-12-13 12:30:07 +0800 CST

为什么比例过滤器会忽略 out_color_matrix 选项?

  • 6

我正在测试没有设置任何颜色元数据的输入:

ffprobe -v error -show_streams "input.mp4" | grep color

color_range=unknown
color_space=unknown
color_transfer=unknown
color_primaries=unknown

这会导致颜色偏移,我认为这是因为scale滤镜进行的自动颜色空间转换。但是,当我添加out_color_matrix=bt601到scale过滤器以保留色彩空间时,该选项似乎被完全忽略并且色彩空间仍然转换为 BT.709(因为我有元数据被写入-color_range 1 -color_trc 1 -color_primaries 1):

ffprobe -v error -show_streams "out_color_matrix=bt601.mp4" | grep color
color_range=tv
color_space=bt709
color_transfer=bt709
color_primaries=bt709

为什么是这样?

ffmpeg
  • 1 个回答
  • 26 Views
Martin Hope
Hashim Aziz
Asked: 2021-12-03 08:29:39 +0800 CST

如何使用 FFmpeg 平衡视频文件的音频

  • 5

我有一个音频不平衡的视频文件 - 一个声道比另一个声道响亮。

是否可以使用 FFmpeg 解决此问题?

ffmpeg audio
  • 1 个回答
  • 136 Views
Martin Hope
Hashim Aziz
Asked: 2021-10-23 14:25:32 +0800 CST

是否可以通过用户输入有条件地启用或禁用过滤器/流?

  • 7

我有一个 Bash 脚本,它在给定的视频文件上运行 FFmpeg,并且 - 连同许多其他东西 - 使用叠加层为其添加了 PNG 水印。我希望能够通过用户输入启用或禁用它来仅在某些视频上应用水印,但我知道的唯一方法是有条件地分支两个单独的 FFmpeg 命令 - 一个添加水印,一个那不是。

以下是用于比较的两个命令。

带水印:

ffmpeg -y -i "$1" -i "outro.mp4" -loop 1 -i "../Watermark/watermark3.png" \     
-movflags +faststart \
-preset ultrafast \
-filter_complex \ 
"color=black:16x16:d=$total[base]; \
[0:v]scale=-2:'max(1080,ih)',setpts=PTS-STARTPTS[v0]; \
[1:v]fade=in:st=0:d=$fadeduration:alpha=1,setpts=PTS-STARTPTS+(($fadetime)/TB)[v1]; \
[2:v]lut=a=val*0.7,fade=in:st=5:d=2:alpha=1,fade=out:st=$length1:d=2:alpha=1[v2]; \
[base][v0]scale2ref[base][v0]; \
[base][v0]overlay[tmp]; \
[tmp][v1]overlay,setsar=1[tmp2]; \
[v2][tmp2]scale2ref=w=oh*mdar:h=ih*0.1[wm_scaled][video]; \
[video][wm_scaled]overlay=W-w-50:50:format=auto:shortest=1[outv]; \
[0:a][1:a]acrossfade=d=$fadeduration[outa]" \
-map "[outv]" -map "[outa]" -c:v libx264 -c:a libopus -crf 17 "$output"

无水印:

ffmpeg -y -i "$1" -i "outro.mp4" -loop 1 -i "../Watermark/watermark3.png" \ 
-movflags +faststart \
-preset ultrafast \
-filter_complex \
"color=black:16x16:d=$total[base]; \
[0:v]scale=-2:'max(1080,ih)',setpts=PTS-STARTPTS[v0]; \
[1:v]fade=in:st=0:d=$fadeduration:alpha=1,setpts=PTS-STARTPTS+(($fadetime)/TB)[v1]; \
[base][v0]scale2ref[base][v0]; \
[base][v0]overlay[tmp]; \
[tmp][v1]overlay,setsar=1[tmp2]; \
[tmp2]setsar=1[outv]; \
[0:a][1:a]acrossfade=d=$fadeduration[outa]" \
-map "[outv]" -map "[outa]" -c:v libx264 -c:a libopus -crf 17 "$output"

这并不理想,因为它需要我维护两个 90% 相同的不同命令,这违反了 DRY 原则并导致两次维护。更不用说,每次我想以相同的方式有条件地启用另一个功能时,我还需要另外两个命令排列,所以它根本不是面向未来的,而且很容易很快变成意大利面条代码。

FFmpeg 中是否有任何东西可以让我根据用户输入有条件地启用/禁用某个过滤器?如果没有,完成这样的事情的最佳方法是什么?

bash ffmpeg
  • 1 个回答
  • 80 Views
Martin Hope
Hashim Aziz
Asked: 2021-10-17 08:27:36 +0800 CST

视频上的淡入/淡出 PNG 水印叠加

  • 6

我在一个脚本中有一个 FFmpeg 命令,它用一个结尾交叉淡化主视频,然后在它上面覆盖一个半透明的 PNG 水印。

ffmpeg -y -i "$1" -i "outro.mp4" -i "../Watermark/watermark3.png" \
-filter_complex \
"color=black:$res:d=$total[base]; \
[0:v]scale=-2:'max(720,ih)',setpts=PTS-STARTPTS[v0]; \
[1:v]format=yuva420p,fade=in:st=0:d=$fadeduration:alpha=1,setpts=PTS-STARTPTS+(($fadetime)/TB)[v1]; \
[2:v]lut=a=val*0.7[v2]; \
[v2][v0]scale2ref=w=oh*mdar:h=ih*0.1[wm_scaled][vidtmp1]; \
[base][vidtmp1]overlay[tmp]; \
[tmp][v1]overlay,format=yuv420p[tmp2]; \
[tmp2][wm_scaled]overlay=W-w-50:50:format=auto,format=yuva420p[outv]" \
-map "[outv]" -map 0:a:0 -c:v libx264 -crf 17 -c:a copy "$output"

这工作得很好,但我希望覆盖 a) 只显示在主视频上,b) 淡入淡出。

但是,尝试将必要的fade过滤器添加到水印:

[2:v]lut=a=val*0.7,fade=in:st=5:d=2:alpha=1,fade=out:st=150:d=2:alpha=1[v2];

...只是默默地失败,产生一个根本看不到水印的工作输出。

这里发生了什么?

bash command-line
  • 1 个回答
  • 128 Views
Martin Hope
Hashim Aziz
Asked: 2021-10-06 08:34:53 +0800 CST

水印是否受到底层视频质量的限制?

  • 5

这可能是一个愚蠢的问题,但为了我自己的安心,我必须澄清它,所以请耐心等待。好消息是,对于知道答案的 FFmpeg/AV 专家来说,这或多或少是一个是/否的问题。

假设我有一个低分辨率的源视频,例如。320x240,以及这十年实际制作的 PNG 水印图像,因此至少是分辨率和高质量的两倍。

如果我使用 FFmpeg 将 PNG 覆盖在视频之上,那么 PNG 的质量是否不可避免地会被限制为 320x240 像素,受视频分辨率的限制......或者它应该看起来即使视频的其余部分没有,也清晰且高质量(即,就像它具有所有原始像素一样)?如果是后一种情况,那么我可能只是在实验中做错了什么。

video ffmpeg
  • 2 个回答
  • 48 Views
Martin Hope
Hashim Aziz
Asked: 2021-09-03 10:21:09 +0800 CST

在 FFmpeg 中使用条件过滤器

  • 6

当我最近发现一些关于 FFmpeg 的新东西时,尽管我已经使用了多年,这让我大吃一惊——事实上它是开箱即用的,带有高级条件,如if语句和lt/gt过滤器。对我来说,这必须是它最被低估的功能,或者至少如果文档提到任何关于它们以及它们如何工作的话。

我想在我的 FFmpeg 脚本中利用它们来根据它们的高度智能地升级视频:如果视频的高度小于 720 像素,则将其升级到-1:720(即高度为 720 和保持其纵横比的比例宽度ratio),如果它是 720 像素或更大,则保持不变。使用和/看起来像这样的scale过滤器会是什么?ifltgt

ffmpeg conditional-statements
  • 1 个回答
  • 842 Views
Martin Hope
Hashim Aziz
Asked: 2021-08-24 07:28:53 +0800 CST

交叉淡入淡出时出现“无法分配内存”错误

  • 6

我调整了Gyan 的交叉淡入淡出算法——我更喜欢 to 的结果xfade——将两个视频连接在一起并与第三个视频交叉淡入淡出:

ffmpeg -i "source1.mp4" -i "source2.mp4" -i "source3.mp4" \
-preset ultrafast \
-movflags faststart \
-filter_complex \
"color=black:1440x1080:d=1789.145[base]; \
[0:v]scale=1440x1080,setpts=PTS-STARTPTS[v0]; \
[1:v]scale=1440x1080,trim=start=15.5,setpts=PTS-STARTPTS+((593.106000)/TB)[v1]; \
[2:v]scale=1440x1080,format=yuva420p,fade=in:st=0:d=2:alpha=1,setpts=PTS-STARTPTS+((1186.028000)/TB)[v2]; \
[base][v1]overlay[tmp]; \
[tmp][v2]overlay,format=yuv420p[crossfade]; \
[v0][crossfade]concat=n=2:v=1:a=0[fv]; \
[1:a]atrim=start=15.5,asetpts=PTS-STARTPTS[a1]; \
[0:a][a1]concat=n=2:v=0:a=1[aconcat]; \
[aconcat][2:a]acrossfade=d=2[fa]" \
-map "[fv]" -map "[fa]" -c:v libx264 -crf 15 -c:a libopus -shortest "test1.mp4"

在编码了大约一半的视频最终长度并用尽了我所有 16GB 的 RAM 之后,FFmpeg 最终耗尽并崩溃。

以下是崩溃后任务管理器中的内存使用情况:

在此处输入图像描述

这是完整的输出:

ffmpeg version N-100422-gff6f8c272e-g1eb751955e+1 Copyright (c) 2000-2020 the FFmpeg developers
  built with gcc 10.2.0 (Rev6, Built by MSYS2 project)
  configuration:  --pkg-config=pkgconf --cc='ccache gcc' --cxx='ccache g++' --disable-autodetect --enable-amf --enable-bzlib --enable-
cuda --enable-cuvid --enable-d3d11va --enable-dxva2 --enable-iconv --enable-lzma --enable-nvenc --enable-zlib --enable-sdl2 --enable-f
fnvcodec --enable-nvdec --enable-cuda-llvm --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --
enable-libx265 --enable-libdav1d --enable-libaom --disable-debug --enable-libfdk-aac --enable-openssl --extra-libs=-liconv --enable-gp
l --enable-nonfree
  libavutil      56. 62.100 / 56. 62.100
  libavcodec     58.115.102 / 58.115.102
  libavformat    58. 65.100 / 58. 65.100
  libavdevice    58. 11.103 / 58. 11.103
  libavfilter     7. 93.100 /  7. 93.100
  libswscale      5.  8.100 /  5.  8.100
  libswresample   3.  8.100 /  3.  8.100
  libpostproc    55.  8.100 / 55.  8.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'source1.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.65.100
  Duration: 00:09:54.11, start: 0.000000, bitrate: 372 kb/s
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 320x240, 242 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 125 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
Input #1, mov,mp4,m4a,3gp,3g2,mj2, from 'source2.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.65.100
  Duration: 00:09:52.92, start: 0.000000, bitrate: 315 kb/s
    Stream #1:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 320x240 [SAR 1:1 DAR 4:3], 181 kb/s, 25 fps, 25 tbr, 12800 tbn,
 50 tbc (default)
    Metadata:
      handler_name    : ISO Media file produced by Google Inc.
      vendor_id       : [0][0][0][0]
    Stream #1:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : ISO Media file produced by Google Inc.
      vendor_id       : [0][0][0][0]
Input #2, mov,mp4,m4a,3gp,3g2,mj2, from 'source3.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.65.100
  Duration: 00:10:02.12, start: 0.000000, bitrate: 314 kb/s
    Stream #2:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 320x240 [SAR 1:1 DAR 4:3], 180 kb/s, 25 fps, 25 tbr, 12800 tbn,
 50 tbc (default)
    Metadata:
      handler_name    : ISO Media file produced by Google Inc.
      vendor_id       : [0][0][0][0]
    Stream #2:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 127 kb/s (default)
    Metadata:
      handler_name    : ISO Media file produced by Google Inc.
      vendor_id       : [0][0][0][0]
File 'test1.mp4' already exists. Overwrite? [y/N] y
Stream mapping:
  Stream #0:0 (h264) -> scale
  Stream #0:1 (aac) -> concat:in0:a0
  Stream #1:0 (h264) -> scale
  Stream #1:1 (aac) -> atrim
  Stream #2:0 (h264) -> scale
  Stream #2:1 (aac) -> acrossfade:crossfade1
  concat -> Stream #0:0 (libx264)
  acrossfade -> Stream #0:1 (libopus)
Press [q] to stop, [?] for help
[libx264 @ 000002475283b600] using SAR=1/1
[libx264 @ 000002475283b600] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
[libx264 @ 000002475283b600] profile Constrained Baseline, level 4.0, 4:2:0, 8-bit
[libx264 @ 000002475283b600] 264 - core 161 r3027 4121277 - H.264/MPEG-4 AVC codec - Copyleft 2003-2020 - http://www.videolan.org/x264
.html - options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 tre
llis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 in
terlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=250 keyint_min=25 scenecut=0 intra_refresh=0 rc=crf mbtree=0
 crf=15.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=0
[libopus @ 0000024752837f40] No bit rate set. Defaulting to 96000 bps.
Output #0, mp4, to 'test1.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.65.100
    Stream #0:0: Video: h264 (avc1 / 0x31637661), yuv420p(tv, progressive), 1440x1080 [SAR 1:1 DAR 4:3], q=2-31, 25 fps, 12800 tbn (de
fault)
    Metadata:
      encoder         : Lavc58.115.102 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
    Stream #0:1: Audio: opus (Opus / 0x7375704F), 48000 Hz, stereo, flt, 96 kb/s (default)
    Metadata:
      encoder         : Lavc58.115.102 libopus
Error while filtering: Cannot allocate memorye=00:16:48.79 bitrate=7107.6kbits/s speed=3.19x
    Last message repeated 1 times
Failed to inject frame into filter network: Cannot allocate memory
Error while processing the decoded data for stream #1:0
[libx264 @ 000002475283b600] frame I:101   Avg QP: 7.17  size:104091
[libx264 @ 000002475283b600] frame P:25125 Avg QP: 9.65  size: 34810
[libx264 @ 000002475283b600] mb I  I16..4: 100.0%  0.0%  0.0%
[libx264 @ 000002475283b600] mb P  I16..4:  3.9%  0.0%  0.0%  P16..4: 37.3%  0.0%  0.0%  0.0%  0.0%    skip:58.8%
[libx264 @ 000002475283b600] coded y,uvDC,uvAC intra: 36.5% 45.6% 16.1% inter: 23.8% 13.9% 0.3%
[libx264 @ 000002475283b600] i16 v,h,dc,p: 43% 29% 11% 16%
[libx264 @ 000002475283b600] i8c dc,h,v,p: 39% 26% 14% 21%
[libx264 @ 000002475283b600] kb/s:7017.47
[libopus @ 0000024752837f40] 1 frames left in the queue on closing
Conversion failed!

这是一个错误,还是我的命令中缺少的东西?

memory ffmpeg
  • 1 个回答
  • 465 Views
Martin Hope
Hashim Aziz
Asked: 2021-08-17 10:22:29 +0800 CST

如何使用 FFmpeg 传递颜色

  • 5

我注意到过去几个月我一直在编码的视频与它们的原始来源相比稍微偏黄。这很烦人,因为我本以为默认行为会传递颜色信息。不是这样吗?

我正在从转码libvpx到libx264. 这是我运行的最后一个出现此问题的命令的输出:

ffmpeg -i "source.mkv" -preset ultrafast -to 6:53 -c:v libx264 -crf 15 -c:a copy -vf "crop=320:160:0:40,scale=-2:1080" "test.mp4"
ffmpeg version N-100422-gff6f8c272e-g1eb751955e+1 Copyright (c) 2000-2020 the FFmpeg developers
  built with gcc 10.2.0 (Rev6, Built by MSYS2 project)
  configuration:  --pkg-config=pkgconf --cc='ccache gcc' --cxx='ccache g++' --disable-autodetect --enable
-amf --enable-bzlib --enable-cuda --enable-cuvid --enable-d3d11va --enable-dxva2 --enable-iconv --enable-
lzma --enable-nvenc --enable-zlib --enable-sdl2 --enable-ffnvcodec --enable-nvdec --enable-cuda-llvm --en
able-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --e
nable-libdav1d --enable-libaom --disable-debug --enable-libfdk-aac --enable-openssl --extra-libs=-liconv
--enable-gpl --enable-nonfree
  libavutil      56. 62.100 / 56. 62.100
  libavcodec     58.115.102 / 58.115.102
  libavformat    58. 65.100 / 58. 65.100
  libavdevice    58. 11.103 / 58. 11.103
  libavfilter     7. 93.100 /  7. 93.100
  libswscale      5.  8.100 /  5.  8.100
  libswresample   3.  8.100 /  3.  8.100
  libpostproc    55.  8.100 / 55.  8.100
Input #0, matroska,webm, from 'source.mkv':
  Metadata:
    ENCODER         : Lavf58.65.100
  Duration: 00:07:49.28, start: 0.000000, bitrate: 240 kb/s
    Stream #0:0(eng): Video: vp9 (Profile 0), yuv420p(tv), 320x240, SAR 1:1 DAR 4:3, 18 fps, 18 tbr, 1k t
bn, 1k tbc (default)
    Metadata:
      DURATION        : 00:07:49.221000000
    Stream #0:1: Audio: aac (LC), 44100 Hz, stereo, fltp (default)
    Metadata:
      HANDLER_NAME    : ISO Media file produced by Google Inc. Created on: 05/11/2019.
      VENDOR_ID       : [0][0][0][0]
      DURATION        : 00:07:49.275000000
Stream mapping:
  Stream #0:0 -> #0:0 (vp9 (native) -> h264 (libx264))
  Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
[libx264 @ 000002575cffe040] using SAR=1/1
[libx264 @ 000002575cffe040] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
[libx264 @ 000002575cffe040] profile Constrained Baseline, level 5.0, 4:2:0, 8-bit
[libx264 @ 000002575cffe040] 264 - core 161 r3027 4121277 - H.264/MPEG-4 AVC codec - Copyleft 2003-2020 -
 http://www.videolan.org/x264.html - options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=
1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip
=1 chroma_qp_offset=0 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_
compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=250 keyint_min=18 scenecut=0 intra_refresh=0 rc=c
rf mbtree=0 crf=15.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=0
Output #0, mp4, to 'test.mp4':
  Metadata:
    encoder         : Lavf58.65.100
    Stream #0:0(eng): Video: h264 (avc1 / 0x31637661), yuv420p(tv, progressive), 2160x1080 [SAR 1:1 DAR 2
:1], q=2-31, 18 fps, 18432 tbn (default)
    Metadata:
      DURATION        : 00:07:49.221000000
      encoder         : Lavc58.115.102 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
    Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp (default)
    Metadata:
      HANDLER_NAME    : ISO Media file produced by Google Inc. Created on: 05/11/2019.
      VENDOR_ID       : [0][0][0][0]
      DURATION        : 00:07:49.275000000
frame= 7434 fps= 47 q=-1.0 Lsize=  748614kB time=00:06:52.99 bitrate=14849.4kbits/s speed=2.62x
video:741826kB audio:6454kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.044636%
[libx264 @ 000002575cffe040] frame I:30    Avg QP:10.10  size:284105
[libx264 @ 000002575cffe040] frame P:7404  Avg QP:12.51  size:101446
[libx264 @ 000002575cffe040] mb I  I16..4: 100.0%  0.0%  0.0%
[libx264 @ 000002575cffe040] mb P  I16..4: 14.4%  0.0%  0.0%  P16..4: 71.5%  0.0%  0.0%  0.0%  0.0%    sk
ip:14.1%
[libx264 @ 000002575cffe040] coded y,uvDC,uvAC intra: 45.1% 37.2% 14.8% inter: 53.1% 32.5% 0.9%
[libx264 @ 000002575cffe040] i16 v,h,dc,p: 45% 20% 10% 25%
[libx264 @ 000002575cffe040] i8c dc,h,v,p: 47% 17% 21% 15%
[libx264 @ 000002575cffe040] kb/s:14714.37

如何传递源的颜色信息,以使输出的颜色始终与源的颜色相同?

video ffmpeg
  • 2 个回答
  • 822 Views
Martin Hope
Hashim Aziz
Asked: 2021-07-07 10:43:37 +0800 CST

如何下载 YouTube 视频的一部分

  • 7

我经常遇到需要从中裁剪部分的 YouTube 视频,但这些视频可能很长,下载整个视频只是为了处理其中的一小部分会花费太长时间并且非常浪费。

尽管自 2013 年以来youtube-dl在这方面存在 Github 问题,并且在这方面取得了一些进展,但尚未实现任何事情,并且截至 2021 年,此功能仍然不可用。

还有哪些其他解决方案可以仅下载我需要的视频部分?

bash ffmpeg
  • 1 个回答
  • 923 Views
Martin Hope
Hashim Aziz
Asked: 2021-07-07 07:02:55 +0800 CST

使用 YouTube 链接作为输入时使用 `-to` 而不是 `-t`

  • 5

此答案显示了如何使用 URL 作为输入来获取 YouTube 视频的一部分。该命令大部分工作正常,但我想避免使用-t,因为我需要在特定时间戳之间进行切换,而且我不想事先计算时间戳之间的差异。

但是,当我尝试调整要使用的命令时-to:

# get URLs
youtube-dl --get-url --youtube-skip-dash-manifest "https://www.youtube.com/watch?v=MfnzBYV5fxs"

# crop 1 min from 6 mins onwards
ffmpeg -ss 00:06:00.00 -i "$video_url" -ss 00:06:00.00 -i "$audio_url" -to 00:07:00.00 -c:v libx264 -preset ultrafast test.mkv

...它忽略第二个时间戳并下载直到结束。为什么会这样,可以修复吗?

ffmpeg和版本都是youtube-dl相对较新的,我之前使用过该-to选项没有问题。

bash ffmpeg
  • 1 个回答
  • 56 Views
Martin Hope
Hashim Aziz
Asked: 2021-07-06 09:23:06 +0800 CST

使用 read 从命令的输出中捕获多个变量

  • 5

我有一个youtube-dl命令,当运行时输出两个新行,我试图将每一个捕获到变量中。

这是我到目前为止所拥有的,但由于某种原因我无法理解,它只捕获第一行输出而丢弃第二行($audio为空)。

read -r video audio <<< "$(youtube-dl -g --youtube-skip-dash-manifest https://www.youtube.com/watch?v=-gcvAxJJiGo)"

如何修复它以使其捕获两个输入,或者,是否有更可靠的方法可以做到这一点?

bash command-line
  • 2 个回答
  • 866 Views
Martin Hope
Hashim Aziz
Asked: 2021-06-03 06:29:12 +0800 CST

如何重写 if-elif 语句的墙

  • 7

对于cigs.sh - 完整的脚本可以在这里找到- 我编写了以下丑陋(但完美工作)逻辑来打印和格式化脚本的输出,部分只是为了找出所有边缘情况,但也因为我没有看到任何其他选择。

...

if [[ $W -le 0 && $D -le 0 && $H -eq 1 ]]; then string="$H hour"
elif [[ $W -le 0 && $D -le 0 && $H -gt 1 ]]; then string="$H hours"
elif [[ $W -le 0 && $D -eq 1 && $H -le 0 ]]; then string="$D day" 
elif [[ $W -le 0 && $D -eq 1 && $H -eq 1 ]]; then string="$D day and $H hour"
elif [[ $W -le 0 && $D -eq 1 && $H -gt 1 ]]; then string="$D day and $H hours"   
elif [[ $W -le 0 && $D -gt 1 && $H -le 0 ]]; then string="$D days"
elif [[ $W -le 0 && $D -gt 1 && $H -eq 1 ]]; then string="$D days and $H hour"
elif [[ $W -le 0 && $D -gt 1 && $H -gt 1 ]]; then string="$D days and $H hours"
elif [[ $W -eq 1 && $D -le 0 && $H -le 0 ]]; then string="$W week"
elif [[ $W -eq 1 && $D -le 0 && $H -eq 1 ]]; then string="$W week and $H hour"
elif [[ $W -eq 1 && $D -le 0 && $H -gt 1 ]]; then string="$W week and $H hours"
elif [[ $W -eq 1 && $D -eq 1 && $H -le 0 ]]; then string="$W week and $D day"
elif [[ $W -eq 1 && $D -gt 1 && $H -le 0 ]]; then string="$W week and $D days"
elif [[ $W -eq 1 && $D -eq 1 && $H -eq 1 ]]; then string="$W week, $D day and $H hour"
elif [[ $W -eq 1 && $D -eq 1 && $H -gt 1 ]]; then string="$W week, $D day and $H hours"
elif [[ $W -eq 1 && $D -gt 1 && $H -eq 1 ]]; then string="$W week, $D days and $H hour"
elif [[ $W -eq 1 && $D -gt 1 && $H -gt 1 ]]; then string="$W week, $D days and $H hours"
elif [[ $W -gt 1 && $D -le 0 && $H -le 0 ]]; then string="$W weeks"
elif [[ $W -gt 1 && $D -le 0 && $H -eq 1 ]]; then string="$W weeks and $H hour"
elif [[ $W -gt 1 && $D -le 0 && $H -gt 1 ]]; then string="$W weeks and $H hours"
elif [[ $W -gt 1 && $D -eq 1 && $H -le 0 ]]; then string="$W weeks and $D day"
elif [[ $W -gt 1 && $D -gt 1 && $H -le 0 ]]; then string="$W weeks and $D days"
elif [[ $W -gt 1 && $D -eq 1 && $H -eq 1 ]]; then string="$W weeks, $D day and $H hour"
elif [[ $W -gt 1 && $D -eq 1 && $H -gt 1 ]]; then string="$W weeks, $D day and $H hours"
elif [[ $W -gt 1 && $D -gt 1 && $H -eq 1 ]]; then string="$W weeks, $D days and $H hour"
elif [[ $W -gt 1 && $D -gt 1 && $H -gt 1 ]]; then string="$W weeks, $D days and $H hours"
fi

colour1='\033[0;31m'
colour2='\033[0;32m'
if (($elapsed < threshold))
then echo -e "${colour1}It's been $string since you last bought a $item."
else
echo -e "${colour2}It's been $string since you last bought a $item."
fi

也许我只是很笨,但是像上面的代码一样尴尬,我看不出有更好的方法可以重写它。是否存在,如果存在,它是什么?

bash automation
  • 4 个回答
  • 142 Views
Martin Hope
Hashim Aziz
Asked: 2021-06-02 06:59:06 +0800 CST

如何在脚本中显示周、日和小时

  • 5

这是上一个关于我编写的脚本的问题的后续问题,bash以帮助我更准确地跟踪我的恶习。我现在正在尝试修改脚本以显示所有非零单位:

It's been 2 weeks, 1 day and 5 hours since you last bought a deck.

为此,这里是我到目前为止脚本的相关部分:

last_bought=$(cat "$lb_file") # file contains time in epoch seconds
...
now=$(date -u +%s)
elapsed="$((now-last_bought))"
W=$((elapsed/60/60/24/7))
D=$((elapsed/60/60/24))
H=$((elapsed/60/60%24))
if [[ $W -le 0 && $D -le 0 && $H -gt 0 ]]; then string="$H hours"
elif [[ $W -le 0 && $D -gt 0 && $H -gt 0 ]]; then string="$D days and $H hours"
elif [[ $W -gt 0 && $D -gt 0 && $H -le 0 ]]; then string="$W weeks and $D days"
elif [[ $W -gt 0 && $D -le 0 && $H -gt 0 ]]; then string="$W weeks and $H hours"
elif [[ $W -gt 0 && $D -gt 0 && $H -gt 0 ]]; then string="$W weeks, $D days and $H hours"
fi

这在几个小时和几天内都可以正常工作(运行带有-b 50shows小时值的脚本2 days and 2 hours)。但是,当在脚本中输入至少一周的小时值时,会填充 和变量。这意味着对于(以小时为单位的 1 周)的值,输出将是:$W$D-b 168

It's been 1 weeks and 7 days since you last bought a deck.

我怎样才能解决这个问题,最好同时实现这样的单一时间段:

It's been 1 week and 1 hour since you last bought a deck.

我也知道我可能会以一种非常粗略的方式检查我的逻辑,所以如果有更聪明/更常见的方法可以做到这一点,我将不胜感激,并且

bash script
  • 3 个回答
  • 241 Views
Martin Hope
Hashim Aziz
Asked: 2021-05-30 12:19:26 +0800 CST

如何使 getopts 参数可选

  • 7

我编写了以下 bash脚本作为预算工具,以更准确地计算(和适度)我上次购买一包香烟的时间。

除了-h打印输出之外,它还有一个选项:-b使用(预期的)一个可选参数来设置偏移量(以小时为单位)。因此,-b 5记录 5 小时前购买的一包新香烟,随后的运行cigs.sh表明从那时起已经过了多少周、几天或几小时。如果自上次购买包以来经过的时间小于$threshold,则输出为红色;如果经过的时间超过$threshold,则输出为绿色,表示我现在可以购买新包了。

我已经设法让所有这些工作正常,除了一件事:目前无法指定-b 没有偏移量(即,将购买记录为现在进行而不是过去几个小时)。据我所知,这似乎是一个限制getopts:如果没有冒号b:h,$OPTARG 无法填充,导致b)case 选项中的逻辑失败;使用冒号,它可以防止-b在没有参数的情况下使用,引发以下错误:

/usr/local/bin/scripts/cigs.sh:选项需要一个参数
--b 传递的未知参数:-b

这是getopts我的脚本的一部分:

while getopts "b:h" OPTION; do
    case $OPTION in
    h)
        echo "$usage"
        exit
        ;;
    b)
        offset=$OPTARG
        if [[ -n $offset && ! $offset =~ ^[0-9]+$ ]]; then 
        echo "HOURS parameter passed to -b must be an integer."
        exit
        fi
        echo -e "Bought a new $item...\nResetting timer to 0 days and $offset hours."
        offset=$((offset*60*60))
        last_bought="$(date -u +%s)"
        new_lb=$((last_bought-offset))
        echo $new_lb > $lb_file
        exit
        ;;
    *)
        echo "Unknown parameter passed: $1"
        exit 1
        ;;
    esac
done
bash script
  • 1 个回答
  • 1036 Views
Martin Hope
Hashim Aziz
Asked: 2021-05-17 04:39:41 +0800 CST

在 for 循环中乱序访问位置参数

  • 6

我有一个脚本,它使用命令行中的多个(即位置)参数,并在其中有一个for循环遍历这些参数:

for i in "$@"; do 
...
done

这意味着参数$i会按照在命令行中指定的顺序一一填充。

这似乎意味着不可能选择当前未填充的参数 $i。

例如,在我的脚本的以下行中,我需要引用两个不同的变量,for循环外分别是$1,$2和$1:

ffmpeg -i "$i" -i "$i" ... "${i%.*}.mp4"

该脚本以以下格式执行:

./script.sh image.jpg *.flac

...但据我了解,这个问题甚至适用于不适用于 glob 的脚本。

是否可以根据需要从循环中访问位置参数for,而不是简单地按照它们指定的顺序?

bash command-line
  • 1 个回答
  • 54 Views
Martin Hope
Hashim Aziz
Asked: 2021-05-14 12:11:11 +0800 CST

如何从 for 循环中访问位置参数

  • 5

我的 shell 脚本包含一个for循环。$1该脚本通过, $2,等使用位置参数$3。但是,尝试使用以下方法从for循环中访问这些参数:

for i in "$@"; do 
echo "$1"
done

... 选择第一个扩展值。例如,当通过 glob ( ./script.sh *.mp4) 提供文件列表时,在for循环的每次迭代中, 的值$1将是 glob 扩展到的第一个文件。

完全相同似乎适用于做:

for i in "$@"; do 
echo "$i"
done

是否可以在for循环中使用位置参数,如果可以,如何使用?

bash command-line
  • 1 个回答
  • 270 Views
Martin Hope
Hashim Aziz
Asked: 2021-05-07 11:17:32 +0800 CST

淡入将整个视频流变为黑色

  • 5

我改编了Gyan 的以下交叉淡入淡出,从图像和音频文件创建视频,然后用结尾交叉淡入淡出。这很好用,但我也想让第一个视频流淡入。

fade由于我无法理解的原因,使用过滤器来执行此操作只会使整个流变黑:

ffmpeg -i "image.jpg" -i "audio.flac" -i "outro.mp4" \
-movflags faststart \
-filter_complex \
"color=black:1384x1080:d=186.367[base]; \
[0:v]fade=in:st=0:d=2,scale=1384:1080,setpts=PTS-STARTPTS[v0]; \
[2:v]format=yuva420p,fade=in:st=0:d=2:alpha=1,setpts=PTS-STARTPTS+((168)/TB)[v1]; \
[base][v0]overlay[tmp]; \
[tmp][v1]overlay,format=yuv420p[fv]; \
[1:a][2:a]acrossfade=d=2[fa]" \
-map [fv] -map [fa] -map -0:v:1 -c:v libx264 -c:a libopus -shortest "track1.mp4"

这可能吗?

video ffmpeg
  • 1 个回答
  • 39 Views
Martin Hope
Hashim Aziz
Asked: 2021-05-07 10:52:07 +0800 CST

如何动态指定滤色器的大小

  • 5

一段时间以来,我一直在使用Gyan 的以下交叉渐变作为我工作流程的一部分,因为我发现它看起来优于其他交叉渐变解决方案并且易于适应不同的输入。但是,我现在正尝试在 Bash 脚本中实现它以实现自动化,并且在动态生成该行中的分辨率时遇到了麻烦color=black:1384x1080。

ffmpeg -i "$1" -i "$2" -i "$3" \
-movflags faststart \
-filter_complex \
"color=black:1384x1080:d=186.367[base]; \
[0:v]scale=-2:1080,setpts=PTS-STARTPTS[v0]; \
[2:v]format=yuva420p,fade=in:st=0:d=2:alpha=1,setpts=PTS-STARTPTS+((168)/TB)[v1]; \
[base][v0]overlay[tmp]; \
[tmp][v1]overlay,format=yuv420p[fv]; \
[1:a][2:a]acrossfade=d=2[fa]" \
-map [fv] -map [fa] -map -0:v:1 -c:v libx264 -c:a libopus -shortest "output.mp4"

在下面的行中,我可以用来scale=-2:1080缩放输入并保持其纵横比,但使用与color过滤器相同的语法会导致几个错误,说明几乎相同的事情:

无法将选项值“-2x1080”解析为图像大小

有没有办法自动化这部分脚本,还是我别无选择,只能手动完成?

bash ffmpeg
  • 1 个回答
  • 118 Views
Martin Hope
Hashim Aziz
Asked: 2021-03-17 13:09:23 +0800 CST

为什么我的 YouTube 视频在这么多移动设备上失真?

  • 3

在我上传了一个FFmpeg 编码的 YouTube 视频几个小时后,我发送给它的少数人开始报告一个奇怪的问题:音频的前 26 分钟听起来非常失真;有人形容它听起来像是在水下。这是一个听起来像的例子。

然后我开始与更多人进行测试,并从总共 31 台移动设备中得出以下数据。

普通音频:

Galaxy S10 (x2)
Galaxy S20 (x3)
Galaxy A50
iPhone XR (x3)
iPhone 7
iPhone 8 (x2)
iPhone 10 Pro
iPhone 11
iPhone 11 Pro
iPhone 11 Pro Max
iPhone 12 (x3)
iPhone 12 Pro
Oppo F11
OnePlus 7T
Pixel 3A XL
OnePlus 7 Pro

失真的音频:

iPhone 6S
Galaxy S7 Edge
Galaxy S8+
Galaxy S10 Lite
Huawei Y6 2019
Huawei P30 Pro
Honor 10 Lite

前 26 分钟的音频在 31 台移动设备中有 7 台出现故障,即 22%,如果仅包括 Android 手机,这一比例会增加到 50% 以上。我询问的大多数人都来自发达国家,这意味着数据也偏向于更新、更现代的手机,这意味着在主要使用旧版 Android 的欠发达国家中,这一数字很容易接近 80%。

不用说,对于像我这样希望能够上传到 YouTube 并让它处理其余部分而不是进行类似 web-dev 的设备调试的人来说,这是一个相当大的问题。

我从几个源视频中编译了视频,使用 FFmpeg 对它们进行编码和连接。

它使用 H264 和 OPUS 作为编解码器,但更相关的是,检查前 26 分钟来自的源视频表明这个问题源于该视频,所以现在问题变成了:

a) 在如此大比例的移动设备中,导致音频出现乱码的特定源视频是什么?

b)如何使用 FFmpeg 修复它?

ffmpeg audio
  • 1 个回答
  • 1347 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    Vickel Firefox 不再允许粘贴到 WhatsApp 网页中? 2023-08-18 05:04:35 +0800 CST
  • Martin Hope
    Saaru Lindestøkke 为什么使用 Python 的 tar 库时 tar.xz 文件比 macOS tar 小 15 倍? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve