AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-323079

Hashim Aziz's questions

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

Substitua as quebras de linha X por vírgula e exclua cada enésima quebra de linha

  • 5

Tenho registros em um arquivo texto formatado da seguinte forma:

Record1
Record1
Record1
Record1

Record2
Record2
Record2
Record2

...

Preciso converter este arquivo para CSV substituindo as 3 primeiras quebras de linha por vírgula e removendo a 4ª, resultando em uma saída como esta:

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

...

Qual é a melhor maneira de fazer isso no Bash, onde o melhor é mais robustez do que desempenho - a tarefa não será realizada com frequência, mas precisa permitir que os valores contenham praticamente quaisquer caracteres além de espaços em branco e quebras de linha.

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

Por que o filtro de escala está ignorando a opção out_color_matrix?

  • 6

Estou testando em uma entrada que não possui nenhum conjunto de metadados de cores:

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

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

Isso resulta em uma mudança de cor, que acredito ser devido à conversão automática do espaço de cores que o scalefiltro faz. No entanto, quando adiciono out_color_matrix=bt601ao scalefiltro para preservar o espaço de cores, a opção parece ser totalmente ignorada e o espaço de cores ainda é convertido para BT.709 (os metadados são gravados porque eu tenho -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

Por que é isso?

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

Como balancear o áudio de um arquivo de vídeo usando o FFmpeg

  • 5

Eu tenho um arquivo de vídeo com áudio desbalanceado - é mais alto em um canal do que no outro.

É possível corrigir isso usando o FFmpeg?

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

É possível habilitar ou desabilitar condicionalmente filtros/streams com entrada do usuário?

  • 7

Eu tenho um script Bash que executa o FFmpeg em um determinado arquivo de vídeo e - junto com muitas outras coisas - adiciona uma marca d'água PNG usando uma sobreposição. Eu gostaria de poder aplicar a marca d'água apenas em alguns vídeos, ativando ou desativando-a por meio da entrada do usuário, mas a única maneira que conheço de fazer isso é ramificar condicionalmente dois comandos FFmpeg separados - um que adiciona uma marca d'água e um isso não.

Aqui estão os dois comandos para comparação.

Com marca d'água:

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"

Sem marca d'água:

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"

Isso não é o ideal porque exigiria que eu mantivesse dois comandos diferentes que são 90% idênticos, o que viola o princípio DRY e resulta em duas vezes a manutenção. Sem mencionar que eu também precisaria de outras duas permutações do comando toda vez que quisesse habilitar condicionalmente outro recurso da mesma maneira, portanto, não é à prova de futuro e muito propenso a se tornar um código espaguete rápido.

Existe algo no FFmpeg que me permita ativar/desativar condicionalmente um determinado filtro com base na entrada do usuário? Se não, qual é a melhor maneira de realizar algo assim?

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

Fade in/out sobreposição de marca d'água PNG no vídeo

  • 6

Eu tenho um comando FFmpeg em um script que faz o crossfade de um vídeo principal com um outro e, em seguida, sobrepõe uma marca d'água PNG semitransparente em cima dele.

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"

Isso funciona bem o suficiente, mas quero que a sobreposição a) seja exibida apenas no vídeo principal eb) apareça e desapareça.

No entanto, tentando adicionar os fadefiltros necessários à marca d'água:

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

... simplesmente falha silenciosamente, produzindo uma saída de trabalho sem marca d'água para ser vista.

O que está acontecendo aqui?

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

As marcas d'água são limitadas pela qualidade do vídeo underlay?

  • 5

Esta pode ser uma pergunta estúpida, mas eu tenho que esclarecê-la para minha própria paz de espírito, então tenha paciência. A boa notícia é que é mais ou menos uma pergunta sim/não para os especialistas em FFmpeg/AV que sabem a resposta.

Digamos que eu tenha um vídeo de origem de baixa resolução, por exemplo. 320x240 e uma imagem de marca d'água PNG que foi realmente produzida nesta década, então pelo menos o dobro dessa resolução e alta qualidade.

Se eu usar o FFmpeg para sobrepor o PNG em cima do vídeo, é inevitável que a qualidade do PNG seja limitada a 320x240 pixels, sendo limitada pela resolução do vídeo... nítido e de alta qualidade (ou seja, como tem todos os seus pixels originais), mesmo enquanto o resto do vídeo não? Se for o último caso, provavelmente estou fazendo algo errado em meus experimentos.

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

Usando filtros condicionais no FFmpeg

  • 6

Fiquei impressionado quando recentemente encontrei algo novo sobre o FFmpeg, apesar de tê-lo usado por anos - o fato de ele sair da caixa com condicionais avançadas, como ifinstruções e lt/ gtpara filtros. Para mim, esse deve ser o recurso mais subestimado, ou pelo menos seria se a documentação mencionasse algo sobre eles e como eles funcionavam.

Eu quero aproveitá-los em meus scripts FFmpeg para fazer o upscale de vídeos de forma inteligente com base em sua altura: se a altura de um vídeo for menor que 720 pixels, fazer o upscale para -1:720(ou seja, uma altura de 720 e uma largura proporcional que mantém seu aspecto proporção) e para deixá-lo inalterado se for 720 pixels ou mais. Como seria um scalefiltro para fazer isso ife lt/ gtcomo?

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

Erro "Não é possível alocar memória" ao fazer crossfading

  • 6

Adaptei o algoritmo de Gyan para crossfading - do qual prefiro os resultados xfade- para concatenar dois vídeos e fazer crossfade com um terceiro:

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"

Depois de codificar cerca de metade do que seria o comprimento final do vídeo e usar todos os 16 GB da minha RAM, o FFmpeg finalmente se esgota e trava.

Veja como ficou o uso de memória no Gerenciador de Tarefas logo após a falha:

insira a descrição da imagem aqui

E aqui está a saída completa:

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!

Isso é um bug ou apenas algo no meu comando que estou perdendo?

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

Como passar cores com FFmpeg

  • 5

Percebi que os vídeos que codifiquei nos últimos meses são um pouco mais amarelos em comparação com suas fontes originais. Isso é muito irritante porque eu esperava que o comportamento padrão passasse pelas informações de cores. Não é este o caso?

Estou transcodificando de libvpxpara libx264. Aqui está a saída do último comando que executei no qual esse problema ocorreu:

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

Como passo as informações de cor da minha fonte para que a cor da saída seja sempre a mesma da minha fonte?

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

Como baixar uma parte de um vídeo do YouTube

  • 7

Costumo encontrar vídeos do YouTube dos quais preciso cortar partes, mas esses vídeos podem ser longos e baixar o vídeo inteiro apenas para processar uma pequena parte deles levaria muito tempo e seria um desperdício.

Apesar de haver um youtube-dlproblema no Github sobre isso desde 2013 e haver algum progresso nessa frente, nada ainda se materializou e, a partir de 2021, esse recurso permanece indisponível.

Que outras soluções existem para baixar apenas a parte do vídeo que eu preciso?

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

Usando `-to` em vez de `-t` ao usar o link do YouTube como entrada

  • 5

Esta resposta mostra como obter uma parte de um vídeo do YouTube usando URLs como entrada. O comando funciona muito bem, mas eu quero evitar usar -t, pois preciso cortar entre timestamps específicos e prefiro não ter que calcular a diferença entre timestamps de antemão.

No entanto, quando tento adaptar o comando para usar -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

...ele ignora o segundo timestamp e baixa até o final. Por que isso acontece e pode ser corrigido?

Ambas as ffmpegversões youtube-dlsão relativamente recentes e eu usei a -toopção sem problemas antes.

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

Usando read para capturar várias variáveis ​​da saída de um comando

  • 5

Eu tenho um youtube-dlcomando que, quando executado, gera duas novas linhas e estou tentando capturar cada uma delas para variáveis.

Aqui está o que tenho até agora, mas por algum motivo não consigo entender, ele apenas captura a primeira linha de saída enquanto descarta a segunda ( $audioestá vazia).

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

Como posso corrigi-lo para capturar as duas entradas ou, alternativamente, existe uma maneira mais confiável de fazer isso?

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

Como reescrever uma parede de instruções if-elif

  • 7

Para cigs.sh - o script completo pode ser encontrado aqui - escrevi a seguinte lógica feia (mas funcionando perfeitamente) para imprimir e formatar a saída do script, em parte apenas para descobrir todos os casos extremos, mas também porque não vi nenhum outra alternativa.

...

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

Talvez eu esteja apenas sendo burro, mas por mais embaraçoso que seja o código acima, não consigo ver uma maneira melhor de reescrevê-lo. Existe um, e em caso afirmativo, o que é?

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

Como exibir semanas, dias e horas no script

  • 5

Esta é uma pergunta de acompanhamento de uma pergunta anterior sobre um bashscript que escrevi para me ajudar a acompanhar com mais precisão meus vícios. Agora estou tentando modificar o script para exibir todas as unidades diferentes de zero:

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

Para esse fim, aqui estão as partes relevantes do script que tenho até agora:

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

Isso funciona perfeitamente por horas e dias (executando o script com um valor de horas de -b 50shows 2 days and 2 hours). No entanto, quando um valor de hora é inserido no script com pelo menos uma semana, as variáveis $W​​e $Dsão preenchidas. Isso significa que para um valor de -b 168(1 semana em horas), a saída será:

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

Como posso corrigir isso, de preferência ao implementar períodos de tempo singulares como:

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

Também estou ciente de que provavelmente estou verificando minha lógica de maneira muito grosseira, então, se houver uma maneira mais inteligente / mais comum de fazer isso, gostaria de ser esclarecido e

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

Como tornar o parâmetro getopts opcional

  • 7

Eu escrevi o script a seguir bash como uma ferramenta de orçamento para calcular com mais precisão (e moderar) quando comprei um maço de cigarros pela última vez.

Além -hde imprimir a saída, é preciso uma outra opção: -bcom (o que se pretende) um parâmetro opcional para definir o deslocamento em horas. Então -b 5registra um novo pacote de cigarros comprado há 5 horas, e as execuções subsequentes cigs.shindicam quantas semanas, dias ou horas se passaram desde então. Se o tempo decorrido desde a última vez que comprei um pacote for menor que $threshold, a saída será impressa em vermelho; se o tempo decorrido for maior que $threshold, a saída será verde, indicando que agora está "ok" para eu comprar um novo pacote.

Eu consegui fazer tudo isso funcionar bem, exceto por uma coisa: atualmente não é possível especificar -b sem um deslocamento (ou seja, registrar a compra como sendo feita agora em vez de algumas horas no passado). Até onde eu pude dizer, isso parece ser uma limitação de getopts: sem os dois pontos em b:h, $OPTARG falha ao preencher fazendo com que a lógica na b)opção case falhe; com os dois pontos, impede que -bseja usado sem parâmetro, lançando o seguinte erro:

/usr/local/bin/scripts/cigs.sh: opção requer um argumento -- b
Parâmetro desconhecido passado: -b

Aqui está a getoptsparte do meu script:

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 respostas
  • 1036 Views
Martin Hope
Hashim Aziz
Asked: 2021-05-17 04:39:41 +0800 CST

Acesse parâmetros posicionais fora de ordem em um loop for

  • 6

Eu tenho um script que faz uso de vários argumentos (ou seja, posicionais) da linha de comando e, dentro dele, um forloop que itera por meio desses argumentos:

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

Isso significa que os argumentos são preenchidos $ium por um, na ordem em que são especificados na linha de comando.

Isso parece significar que é impossível selecionar um argumento que não esteja sendo preenchido no momento $i.

Por exemplo, na linha a seguir no meu script, preciso referenciar duas variáveis ​​diferentes, que fora de um forloop seriam $1, $2e $1respectivamente:

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

O script é executado no seguinte formato:

./script.sh image.jpg *.flac

...mas pelo que entendi, esse problema se aplicaria até mesmo a scripts que não funcionam com globs.

É possível acessar argumentos posicionais de um forloop conforme necessário, em vez de simplesmente na ordem em que são especificados?

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

Como acessar parâmetros posicionais de dentro de um loop for

  • 5

Meu script de shell contém um forloop. O script faz uso de argumentos posicionais via $1, $2, $3, etc. No entanto, tentando acessar esses parâmetros do forloop usando algo assim:

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

... seleciona o primeiro valor expandido. Por exemplo, quando fornecido com uma lista de arquivos por meio de um glob ( ./script.sh *.mp4), em cada iteração do forloop o valor de $1será o primeiro arquivo para o qual o glob se expande.

O mesmo parece se aplicar a fazer:

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

É possível usar argumentos posicionais dentro de um forloop e, em caso afirmativo, como?

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

Fade-in transforma todo o fluxo de vídeo em preto

  • 5

Adaptei o seguinte crossfade de Gyan para criar um vídeo a partir de uma imagem e um arquivo de áudio e, em seguida, faça o crossfade com um outro. Isso funciona bem, mas eu também quero ter o primeiro fluxo de vídeo fade-in.

Usar o fadefiltro para fazer isso simplesmente torna todo o fluxo preto por motivos que não consigo compreender:

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"

Isso é possível?

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

Como especificar o tamanho do filtro de cores dinamicamente

  • 5

Eu tenho usado o seguinte crossfade de Gyan como parte do meu fluxo de trabalho por um tempo, pois achei ele superior a outras soluções de crossfade e fácil de adaptar para diferentes entradas. No entanto, agora estou tentando implementá-lo em um script Bash para fins de automação e estou tendo problemas para gerar dinamicamente a resolução na linha 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"

Na linha abaixo, posso usar scale=-2:1080para dimensionar a entrada e preservar sua proporção, mas usar a mesma sintaxe com o colorfiltro resulta em vários erros dizendo praticamente a mesma coisa:

Não é possível analisar o valor da opção "-2x1080" como tamanho da imagem

Existe alguma maneira de automatizar essa parte do script ou não tenho escolha a não ser fazê-lo manualmente?

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

Por que meu vídeo do YouTube está distorcido em tantos dispositivos móveis?

  • 3

Poucas horas depois de enviar um vídeo do YouTube codificado em FFmpeg , as poucas pessoas para quem eu o enviei começaram a relatar um problema estranho: que os primeiros 26 minutos do áudio soaram muito distorcidos; alguns descreveram como soando como se estivesse debaixo d'água. Aqui está um exemplo de como soa.

Comecei então a testar com mais pessoas e obtive os seguintes dados de um total de 31 dispositivos móveis.

Áudio normal:

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

Áudio distorcido:

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

O áudio para esses primeiros 26 minutos é interrompido para 7 de 31 dispositivos móveis, ou seja, 22%, e isso aumenta para mais de 50% quando apenas telefones Android são incluídos. A maioria dos que perguntei foram baseados em países desenvolvidos, o que significa que os dados também se inclinam para telefones mais novos e modernos, o que significa que esse número pode facilmente estar mais próximo de 80% em países menos desenvolvidos que usam principalmente Androids mais antigos.

Escusado será dizer que este é um grande problema para alguém como eu, que esperava poder fazer upload para o YouTube e deixá-lo lidar com o resto em vez de fazer a depuração de dispositivos do tipo web-dev.

Compilei o vídeo de vários vídeos de origem, codificando e concatenando-os usando o FFmpeg.

Ele usa H264 e OPUS como codecs, mas mais relevante, verificando o vídeo de origem desses primeiros 26 minutos mostra que esse problema se origina nesse vídeo, então agora a pergunta se torna:

a) O que há nesse vídeo de origem específico que está fazendo com que o áudio fique distorcido em uma proporção tão grande de dispositivos móveis?

b) Como posso corrigi-lo usando o FFmpeg?

ffmpeg audio
  • 1 respostas
  • 1347 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como posso reduzir o consumo do processo `vmmem`?

    • 11 respostas
  • Marko Smith

    Baixar vídeo do Microsoft Stream

    • 4 respostas
  • Marko Smith

    O Google Chrome DevTools falhou ao analisar o SourceMap: chrome-extension

    • 6 respostas
  • Marko Smith

    O visualizador de fotos do Windows não pode ser executado porque não há memória suficiente?

    • 5 respostas
  • Marko Smith

    Como faço para ativar o WindowsXP agora que o suporte acabou?

    • 6 respostas
  • Marko Smith

    Área de trabalho remota congelando intermitentemente

    • 7 respostas
  • Marko Smith

    O que significa ter uma máscara de sub-rede /32?

    • 6 respostas
  • Marko Smith

    Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows?

    • 1 respostas
  • Marko Smith

    O VirtualBox falha ao iniciar com VERR_NEM_VM_CREATE_FAILED

    • 8 respostas
  • Marko Smith

    Os aplicativos não aparecem nas configurações de privacidade da câmera e do microfone no MacBook

    • 5 respostas
  • Martin Hope
    Vickel O Firefox não permite mais colar no WhatsApp web? 2023-08-18 05:04:35 +0800 CST
  • Martin Hope
    Saaru Lindestøkke Por que os arquivos tar.xz são 15x menores ao usar a biblioteca tar do Python em comparação com o tar do macOS? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh Como posso reduzir o consumo do processo `vmmem`? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Pesquisa do Windows 10 não está carregando, mostrando janela em branco 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    andre_ss6 Área de trabalho remota congelando intermitentemente 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney Por que colocar um ponto após o URL remove as informações de login? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca Todos os meus complementos do Firefox foram desativados repentinamente, como posso reativá-los? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK É possível criar um código QR usando texto? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 Altere o nome da ramificação padrão do git init 2019-04-01 06:16:56 +0800 CST

Hot tag

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

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve