명령 출력을 여러 프로그램으로 파이프하는 방법

명령 출력을 여러 프로그램으로 파이프하는 방법

저는 FFmpeg를 사용하고 있으며 TCP 서버인 사용자 정의 애플리케이션을 만들었습니다. ffmpeg에서 중복 출력을 사용하고 있습니다.

내가 원하는 것은 각 출력에 대해 특정 포트에서 수신 대기하는 프로그램을 시작하려는 것입니다. 예를 들어 지금 무엇을 할 수 있나요?

ffmpeg -i "stream_link" -codec copy -f mpegts - \
    | myprogram -h 127.0.0.1 -p 12345 -f -

내 프로그램은 ffmpeg에서 데이터를 가져와 서버 내부에 저장합니다. 이제 다음 작업을 수행할 수 없습니다.

ffmpeg -i "stream_link" -codec copy -f mpegts - -codec copy -f flv - \
    | myprogram -h 127.0.0.1 -p 12345 -f - \
    | myprogram -h 127.0.0.1 -p 12345 -f -

내 생각엔 당신이 날 잡은 것 같아요. 2개의 서로 다른 컨테이너 mpegts, flv를 출력하고 내 프로그램의 2개 인스턴스를 다시 열려고 합니다. 그러면 어떻게 해야 합니까?

이 질문은 파이프에만 관련되어 있습니다. 방금 FFmpeg를 사용하여 실제 예를 들었습니다.

답변1

ffmpeg -i "stream_link" -codec copy -f mpegts - -codec copy -f flv - |  
myprogram -h 127.0.0.1 -p 12345 -f - | 
myprogram -h 127.0.0.1 -p 12345 -f -

따라서 내가 올바르게 이해했다면 이 두 명령을 하나로 결합하려고 하는 것입니다.

mpegts체재

ffmpeg -i "stream_link" -codec copy -f mpegts - |  
myprogram -h 127.0.0.1 -p 12345 -f - 

영화체재

ffmpeg -i "stream_link"  -codec copy -f flv - |  
myprogram -h 127.0.0.1 -p 12345 -f -

tee따라서 위의 이해가 정확하다면 명령을 사용하여 이를 수행할 수 있다고 믿습니다 . 이 질문에서 자세한 내용을 얻을 수 있습니다.여기.

따라서 명령을 다음과 같이 다시 작성할 수 있습니다.

 ffmpeg -i "stream_link" -codec copy -f mpegts - -codec copy -f flv - |  
 tee >(myprogram -h 127.0.0.1 -p 12345 -f -) 
     >(myprogram -h 127.0.0.1 -p 12346 -f -) 

그러나 사용자로서맥사이프그는 자신의 의견에서 다음과 같이 언급했습니다.

ffmpeg두 개의 스트림이 파일에 기록되고 있습니다. the 와 go mpegts둘 다flv표준 출력이것이 |파이프라인입니다.

따라서 솔루션에는 ffmpeg두 개의 서로 다른 파일에 쓰는 것이 포함되어야 합니다. 마찬가지로 ffmpeg flv processing -o flvfile, mpegts processing -o mpegtsfile두 프로세스는 두 출력에서 ​​데이터를 읽습니다.

해당 프로세스와 입력을 수신하는 프로세스 모두 ffmpeg출력을 구문 분석하여 의도한 스트림 읽기를 시작할 오프셋을 알아야 합니다.

따라서 이 접근 방식의 문제점은 tee중복 tee입력이 가능하고 ffmpeg두 개를 사용할 수 있다는 것입니다.ffmpeg

따라서 이 문제를 해결하는 더 좋은 방법은 다음 방법을 사용하는 것입니다.

{ { ffmpeg -i "stream_link"            #one input stream
        -codec copy -f flv /dev/fd/3   #duped and processed, out >&3
        -codec copy -f mpegts - |      #duped and processed, out >&1
        myprogram1 >&4                 #receives >&1 on <&0, out >&4
        } 3>&1 | myprogram2            #receives >&3 on <&0, out >&1
} 4>&1                                 #ensures both myprograms write to >&1

위의 방법을 사용할 때 ffmpeg출력을 명시적으로 분할합니다. 이는 실제로 링크를 이해하는 시스템에서 실행되는지에 따라 달라집니다 /dev/fd/[num].

관련 정보