A maneira como aprendi a fazer isso (de partes de respostas anteriores) é usar o codec rawvideo
do vídeo, o codec de áudio pcm_s16le
e o wrapper nut
do FFmpeg para codificar o fluxo. O nut
não é suportado pelos principais programas fora do FFmpeg, mas é o único contêiner que conheço atualmente que pode suportar os formatos descompactados necessários para distribuir dados com eficiência entre os processos.
Os argumentos para essa codificação podem ser assim:
... -c:v rawvideo -c:a pcm_16le -f nut - ...
Algum áudio é armazenado com amostras de 24 bits ou maiores e, para essas, você deve usar pcm_24le
ou um formato diferente. A lista completa de formatos de áudio não compactados será listada executando ffmpeg -codecs
(você terá que pesquisar a lista por eles). Se você não sabe qual é o tamanho de amostra do seu áudio, usar pcm_16le
não deve causar perda perceptível de qualidade.
Na extremidade de recebimento do pipe, defina a entrada como entrada padrão e o ffmpeg detectará o formato e decodificará o fluxo.
... ffmpeg -i - ...
As elipses (...) nesta resposta não fazem parte do código. Aqui é onde o seu código vai. Os hífens solitários (-) dizem ao FFmpeg para usar a entrada padrão ou saída padrão, dependendo de onde eles aparecem.
ATUALIZAÇÃO:
Eu tentei um experimento simples para melhorar isso, e parece que um container melhor é o AVI, porque outros programas irão entendê-lo (pelo menos o VLC irá).
... -c:v rawvideo -c:a pcm_16le -f avi - ...
Isso funcionará exatamente como a versão antiga, com a vantagem adicional de compatibilidade.
Em retrospecto, me arrependi de postar uma pergunta que não foi útil em muitas situações, apesar da minha afirmação de que as perguntas deveriam ser úteis para todos. Isso torna a resposta mais útil.