推 LPH66:我倒認為是那些程式在 win32 上沒處理好 binary stdin 12/13 10:42
→ LPH66:你要不要試試把你的程式 redirect 到檔案去試聽看看? 12/13 10:42
→ logs:可以簡單提供讀 stdin 然後寫入檔案的程式嗎? 12/13 11:03
→ logs:我寫的都會錯誤 12/13 11:03
→ logs:我寫出來了,測試中... 12/13 11:29
#include "stdafx.h"
#include <io.h>
int _tmain(int argc, _TCHAR* argv[])
{
FILE* pOut;
int i=0;
char byte;
fopen_s(&pOut,"stdouts.wav","wb");
while (fread(&byte,1,1,stdin)){
i++;
fwrite(&byte,1,1,pOut);
}
printf("gets %d bytes from stdin\n",i);
fclose(pOut);
return 0;
}
倘若無誤的話,我的電腦只能吃到該有的 695,852 中的 1,804 Bytes
比用 NeroAACEnc 或者 lame 還要慘
附上測試用的 stdout 產生器,用65535的大魔王血量長度是測試正常的
#include "stdafx.h"
#include <io.h>
#include <fcntl.h>
int _tmain(int argc, _TCHAR* argv[])
{
_setmode(_fileno( stdout ), _O_BINARY);
for(int i=0;i<65535;i++){
fwrite("a",1,1,stdout);
}
return 0;
}
================================================================
除此之外,另一個軟體 MeGUI
看過原始碼,裡頭用的也是 stdout 送給 audio encoder
位置: \megui\trunk\packages\audio\AudioEncoderInterface.cs
只不過他用的是 C#
看起來有在寫wave檔頭,註解裡也有提到送出資料到 encoder 的 stdin
所以可以判斷 MeGUI 一樣使用 stdout
那既然同樣都是 stdout
MeGUI 可以正確轉檔,avs2wav 卻不行
似乎更可以確定 audio encoder 的 stdin 接收應該沒有問題
而是 avs2wav 的 stdout 有問題
※ 編輯: logs 來自: 125.229.14.202 (12/13 11:49)
推 LPH66:唔...剛剛拿了個比較程式去比發現了一個嚴重的問題: 12/13 13:35
→ LPH66:avs2wav 在 scanning 時會輸出 MPEG 1.0 layer II ...的訊息 12/13 13:36
→ LPH66:但這些訊息並不是送去 stderr 的 而是送去 stdout 的...||| 12/13 13:36
→ LPH66:所以當輸出檔也輸出到 stdout 就會全部寫入檔案裡...orz 12/13 13:36
推 LPH66:然後這個訊息貌似不在 avs2wav.cpp 裡面..|| 12/13 13:38
推 LPH66:OK, 確認問題是在那個地方了 orz 那個東西以外都是一樣的 12/13 13:44
→ LPH66:然後你的測試程式的問題在於你用了 text mode 讀 stdin... 12/13 13:44
→ LPH66:所以碰到 0x1A 就被認為是 EOF 了 12/13 13:45
→ logs:也有發現 "標準出力" 的問題. 但那個下載後沒有解決 12/13 13:49
→ logs:因為我用的avs是 MpaSource 所以搭配 NeroAACEnc 要執行兩次 12/13 13:50
→ logs:生成 d2a 之後,再一次執行才會正常 ?? 原因不明 12/13 13:52
→ logs:用 lame 搭配則一次生成.可能是這樣導致 cpp 中找不到 12/13 13:53
→ logs:然後網路上的 EZBuilder 用的 avs2wav 跟我附的完全一樣 12/13 13:53
→ logs:---- 那有沒有辦法藉由修改 avs2wav.cpp 讓字串為 MPEG 1.0.. 12/13 14:13
→ logs:的那些被自動過濾掉,這樣應該就可以解決了吧? 12/13 14:13