2017-04-18 65 views
1

給定命令行ffmpeg -f lavfi -i "sine=frequency=1000:duration=5" -ar 8000 -c:a FOO pipe:1,ffmpeg可能會抱怨它「無法找到合適的輸出格式」。對於某些編解碼器,ffmpeg具有默認的容器格式,例如-c:a libmp3lame會產生MP3的。對於其他編解碼器,你只需重複自己(排序):-c:a pcm_alaw -f alawffmpeg用於「原始」輸出的格式/協議?

但是,如果我想流原始編解碼器輸出,並且沒有匹配-f?我可以拿-f alaw並假設它沒有做任何事情嗎? (G711 alaw是一個簡單的編解碼器,它可以產生一個字節流,所以-f alaw大概就是複製那個字節流)

很明顯,管道的另一端需要知道數據流如何解釋,如果沒有容器信息。但假定我已經知道管道的另一端正在等待以8 kHz採樣的音頻流,編碼爲-c:a FOO

回答

2

是的,原始數據流就是這樣:沒有封裝編解碼器的有效載荷。

爲了清楚在你的命令語法起見,你可以使用data

ffmpeg -f lavfi -i "sine=frequency=1000:duration=5" -ar 8000 -c:a FOO -map 0 -f data pipe:1 
+0

'-map 0'完成了這個技巧。 – MSalters

1

我假設'生'你的意思是未壓縮的音頻樣本(PCM)。

除了alaw之外,ffmpeg支持PCM格式的其他變化。

ffmpeg -formats | grep PCM 

顯示

 
DE alaw   PCM A-law 
DE f32be   PCM 32-bit floating-point big-endian 
DE f32le   PCM 32-bit floating-point little-endian 
DE f64be   PCM 64-bit floating-point big-endian 
DE f64le   PCM 64-bit floating-point little-endian 
DE mulaw   PCM mu-law 
DE s16be   PCM signed 16-bit big-endian 
DE s16le   PCM signed 16-bit little-endian 
DE s24be   PCM signed 24-bit big-endian 
DE s24le   PCM signed 24-bit little-endian 
DE s32be   PCM signed 32-bit big-endian 
DE s32le   PCM signed 32-bit little-endian 
DE s8    PCM signed 8-bit 
DE u16be   PCM unsigned 16-bit big-endian 
DE u16le   PCM unsigned 16-bit little-endian 
DE u24be   PCM unsigned 24-bit big-endian 
DE u24le   PCM unsigned 24-bit little-endian 
DE u32be   PCM unsigned 32-bit big-endian 
DE u32le   PCM unsigned 32-bit little-endian 
DE u8    PCM unsigned 8-bit 

同樣,

ffmpeg -codecs | grep PCM 

將顯示PCM格式的音頻編解碼器的列表。

+0

都能跟得上;就像編解碼器中出現的那樣,這可能是也可能不是PCM的味道。請注意,alaw和mulaw本質上是有損壓縮方案; 16到8位。 – MSalters

+0

感謝您的澄清。我認爲'-f數據'由@Mulvya回答應該工作。 – wto