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 / unix / Perguntas / 412877
Accepted
LeoRochael
LeoRochael
Asked: 2017-12-25 18:46:28 +0800 CST2017-12-25 18:46:28 +0800 CST 2017-12-25 18:46:28 +0800 CST

Converta áudio dentro de MKV para AC3 ou DTS preservando 6.1 canais

  • 772

Tenho alguns .mkvarquivos que contém áudio 6.1 no formato FLAC. mediainforelata a faixa de áudio nesses arquivos como:

Audio
ID                       : 2
Format                   : FLAC
Format/Info              : Free Lossless Audio Codec
Codec ID                 : A_FLAC
Duration                 : 2mn 29s
Bit rate mode            : Variable
Channel(s)               : 7 channels
Channel positions        : Front: L C R, Side: L R, Back: C, LFE 
Sampling rate            : 48.0 KHz
Bit depth                : 24 bits
Delay relative to video  : 14ms
Writing library          : libFLAC 1.3.0 (UTC 2013-05-26)
Language                 : English
Default                  : Yes
Forced                   : No

Eu também tenho um amplificador "Home Theater" 6.1 (Sony STR-DE895 , se alguém se importa) que aceita áudio digital nativamente através de uma conexão S/PDIF (óptica e coaxial) nos seguintes formatos:

  • PCM (limitado a 2 canais em S/PDIF)
  • DTS (5.1)
    • DTS-ES (6.1)
    • NEO6 (6.1)
  • Dolby Digital (5.1)
    • DIGITAL-EX (6.1)
    • PRO LÓGICA II

Eu gostaria de ter esses .mkvarquivos dirigindo todos os alto-falantes 6.1 do amplificador, mas se eu converter o .mkvarquivo com um comando como este:

ffmpeg -i Input.FLAC.6.1.mkv -c:s copy -c:v copy -c:a ac3 Output.AC3.6.1.mkv

Então eu recebo áudio 5.1, ou seja, perco o canal traseiro central. Por mediainfo:

Audio
ID                           : 2
Format                       : AC-3
Format/Info                  : Audio Coding 3
Mode extension               : CM (complete main)
Format settings, Endianness  : Big
Codec ID                     : A_AC3
Duration                     : 2mn 29s
Bit rate mode                : Constant
Bit rate                     : 448 Kbps
Channel(s)                   : 6 channels
Channel positions            : Front: L C R, Side: L R, LFE
Sampling rate                : 48.0 KHz
Bit depth                    : 16 bits
Compression mode             : Lossy
Delay relative to video      : 9ms
Stream size                  : 8.00 MiB (9%)
Writing library              : Lavc57.107.100 ac3
Language                     : English
Default                      : Yes
Forced                       : No
DURATION                     : 00:02:29.768000000
NUMBER_OF_FRAMES             : 1755
NUMBER_OF_BYTES              : 56974307
_STATISTICS_WRITING_APP      : mkvmerge v8.2.0 ('World of Adventure') 64bit
_STATISTICS_WRITING_DATE_UTC : 2015-08-01 13:29:10
_STATISTICS_TAGS             : BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES

Observe como mudou de:

Channel(s)               : 7 channels
Channel positions        : Front: L C R, Side: L R, Back: C, LFE 

Para:

Channel(s)                   : 6 channels
Channel positions            : Front: L C R, Side: L R, LFE

Se eu tentar forçar o número de canais -ac 7, recebo:

[ac3 @ 0x43f2a40] Specified channel layout '6.1' is not supported

Tentar converter para DTStem exatamente o mesmo resultado. Ou seja, substituindo:

-c:a ac3

Com:

-strict experimental -c:a dts

Resultados em um mediainfode:

Audio
ID                            : 2
Format                        : DTS
Format/Info                   : Digital Theater Systems
Mode                          : 16
Format settings, Endianness   : Big
Codec ID                      : A_DTS
Duration                      : 2mn 29s
Bit rate mode                 : Constant 
Bit rate                      : 1 413 Kbps 
Channel(s)                    : 6 channels 
Channel positions             : Front: L C R, Side: L R, LFE
Sampling rate                 : 48.0 KHz 
Bit depth                     : 16 bits
Compression mode              : Lossy
Delay relative to video       : 14ms
Stream size                   : 25.2 MiB (23%)
Writing library               : Lavc57.107.100 dca
Language                      : English
Default                       : Yes
Forced                        : No
DURATION                      : 00:02:29.774000000
NUMBER_OF_FRAMES              : 1755
NUMBER_OF_BYTES               : 56974307 
_STATISTICS_WRITING_APP       : mkvmerge v8.2.0 ('World of Adventure') 64bit
_STATISTICS_WRITING_DATE_UTC  : 2015-08-01 13:29:10
_STATISTICS_TAGS              : BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES

E tentar forçar 6.1 -ac 7causa o mesmo '6.1' is not supportederro acima.

Por que vale a pena, o ffmpegusado nos testes acima foi:

$ ffmpeg -version
ffmpeg version 3.4.1-static https://johnvansickle.com/ffmpeg/  Copyright (c) 2000-2017 the FFmpeg developers
built with gcc 6.4.0 (Debian 6.4.0-10) 20171112
configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc-6 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gray --enable-libfribidi --enable-libass --enable-libvmaf --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-librtmp --enable-libsoxr --enable-libspeex --enable-libvorbis --enable-libopus --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzimg
libavutil      55. 78.100 / 55. 78.100
libavcodec     57.107.100 / 57.107.100
libavformat    57. 83.100 / 57. 83.100
libavdevice    57. 10.100 / 57. 10.100
libavfilter     6.107.100 /  6.107.100
libswscale      4.  8.100 /  4.  8.100
libswresample   2.  9.100 /  2.  9.100
libpostproc    54.  7.100 / 54.  7.100

Então, como posso converter o áudio do .mkvarquivo para um formato suportado pelo meu sistema, preservando o formato de canal 6.1?

audio ffmpeg
  • 2 2 respostas
  • 11246 Views

2 respostas

  • Voted
  1. Gyan
    2017-12-25T20:47:39+08:002017-12-25T20:47:39+08:00

    Como seu amplificador suporta PCM, use-o.

    ffmpeg -i Input.FLAC.6.1.mkv -c:s copy -c:v copy -c:a pcm_s16le  Output.PCM.6.1.mkv
    
    • 1
  2. Best Answer
    dirkt
    2017-12-29T00:18:09+08:002017-12-29T00:18:09+08:00

    Resposta parcial (não testada):

    Portanto, o principal problema parece ser que você está preso a uma conexão óptica/coaxial S/PDIF por algum motivo, que não possui largura de banda suficiente (na verdade, como você disse, nem mesmo possui largura de banda suficiente para mais de dois canais de áudio não compactados; a variante 5.1 já está compactada).

    Posso confirmar que ffmpegnão suporta a codificação de mais de 6 canais, observando o código para DTS ou AC3 . Se ffmpegnão for compatível, meu palpite é que não existem ferramentas prontas para Linux que o suportem.

    Observando como o DTS-ES e o Dolby Digital EX funcionam, pode-se ver que todos eles também não oferecem um canal independente adicional, mas misturam (ou "matrizam") o canal traseiro central nos outros canais de alguma forma , e defina um sinalizador especial para o modo 6.1 no fluxo de dados digitais. O codificador então precisa separar os canais novamente, o que (devido à perda de informações) nem sempre é possível e pode levar a artefatos de som, dependendo do material de origem.

    (A possível exceção é "DTS-ES Discrete 6.1", que afirma ter um canal real separado além da codificação da matriz, mas não está claro como esse canal é codificado e como ele deve se ajustar ao S/PDIF limitado largura de banda se transportada via S/PDIF, então é bem provável que a separação só exista no material de origem e seja perdida em S/PDIF, de qualquer maneira).

    Portanto, existem dois problemas: como habilitar o sinalizador 6.1 no fluxo de dados e como misturar o canal extra nos canais existentes. Felizmente, seu Sony STR-DE895 parece ter um SB DEC [MATRIX]modo ( manual página 32), que ignora o sinalizador e sempre aplica a matriz do decodificador Dolby Digital EX independentemente do sinalizador. Isso resolve o primeiro problema sem ter que modificar, por exemplo ffmpeg, o código-fonte.

    Não consegui encontrar informações exatas sobre os coeficientes dessa matriz, mas como ela é "semelhante na prática ao formato Pro-Logic anterior da Dolby", que simplesmente adiciona o canal central à esquerda e à direita depois de diminuí-lo em 3 dB (fator 0.5), em primeira aproximação eu tentaria o mesmo para os canais traseiros usando o filtro ffmpeg pan , codificaria isso como ac3, e veria se o resultado é aceitável.

    Supondo que isso funcione, uma solução de longo prazo seria hackear o plug-in ALSA A52 para suportar esse tipo de mixagem internamente, para que você tenha um verdadeiro dispositivo ALSA de 6.1 canais. Você pode usar isso para reproduzir uma fonte 6.1 em qualquer formato, sem ter que passar pelas contorções de recodificar o material de origem.

    Outra abordagem completamente diferente (e eu recomendo tentar isso e fazer uma comparação de audição para ter uma ideia sobre a diferença de qualidade e a possível presença de artefatos de som) é usar seu Multi Ch In 1campo na Sony, junto com um boa placa de som analógica 7.1 (se você tiver uma, ou pode emprestar uma). Isso fornecerá uma verdadeira separação de canais, mas é claro que agora usará os conversores D/A da placa de som e não da Sony.

    • 1

relate perguntas

  • ffmpeg: 'Protocolo não encontrado' para nome de arquivo normal

  • Minha placa de som não é reconhecida pelo Kali

  • Como alguém pode configurar o áudio no Arch Linux suportando vários programas que emitem áudio ao mesmo tempo sem criar um asoundrc?

Sidebar

Stats

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

    Matriz JSON para bash variáveis ​​usando jq

    • 4 respostas
  • Marko Smith

    A data pode formatar a hora atual para o fuso horário GMT? [duplicado]

    • 2 respostas
  • Marko Smith

    bash + lê variáveis ​​e valores do arquivo pelo script bash

    • 4 respostas
  • Marko Smith

    Como posso copiar um diretório e renomeá-lo no mesmo comando?

    • 4 respostas
  • Marko Smith

    conexão ssh. Conexão X11 rejeitada devido a autenticação incorreta

    • 3 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Marko Smith

    comando systemctl não funciona no RHEL 6

    • 3 respostas
  • Marko Smith

    rsync porta 22 e 873 uso

    • 2 respostas
  • Marko Smith

    snap /dev/loop em 100% de utilização -- sem espaço livre

    • 1 respostas
  • Marko Smith

    chave de impressão jq e valor para todos no subobjeto

    • 2 respostas
  • Martin Hope
    EHerman Matriz JSON para bash variáveis ​​usando jq 2017-12-31 14:50:58 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Drux A data pode formatar a hora atual para o fuso horário GMT? [duplicado] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC Como posso copiar um diretório e renomeá-lo no mesmo comando? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve Como as permissões de arquivo funcionam para o usuário "root"? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe Altere o editor padrão para vim para _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey Como baixar o pacote não instalá-lo com o comando apt-get? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao Por que os diretórios /home, /usr, /var, etc. têm o mesmo número de inode (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg — o comando list-keys gera uid [ desconhecido ] depois de importar a chave privada para uma instalação limpa 2017-11-26 18:26:02 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

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