Bir yanıt dosya boyutu hesaplanırken?

1 Cevap php

im çalıştıklarınıfarkediyorsun kod video ve ses (muhtemelen sadece şimdi için ses) ve mobil cihazlar akışı, şu anda burada (http://stackoverflow.com/questions/1608571/how-do-you-convert-audio-files-on-the-fly-to-the-browser) başka bir yerde yayınlanan script kullanarak im ama bu seemsto dinamik kodlama yapmak için bir komut dosyası sorunları olarak sahip ben kimse ben bu dynamicly hesaplamak ve doğru başlık geçmek nasıl önerebilirsiniz, outputted verilerin dosya boyutu hesaplamak için nasıl bilmiyorum?

1 Cevap

(Updated with final solution to specific problem at bottom of answer.)

You can't

Bu kesin edilen dosya boyutuna gelince ses ve video kodlama, bu durumda, (ve en diğerleri), öngörülebilir değildir. Ya kodlama sırasında kaynak malzemenin karakteristik ve son boyutu üzerinde etkisi tahmin edilemez olduğu gerçeğini unutmayın. Eğer 'sinek' transcoding iseniz, 1) sıkıştırarak iki şey yapıyor, 2) veri kaybetme. Bu sadece bir mp3 çıkış biçimi ile yapılamaz.

You might...if : kodlama kayıpsız oldu, ve algoritma çok özel bir kaynak malzeme özellikleri (örnekleme oranı, örneklem büyüklüğü, vb) ve kaynak ve hedef formatlarını sıkıştırılmamış hem de ayarlamışlar. Ama bu senin bir durum değildir.

Başlığına gelince: gönderdi yok! Content-Length başlık bir HTTP 1.1 gereklilik değildir. (; Hayır 'kalan zaman' ya mümkündür şimdiye% 100-sonu dosyaya kadar ne yaptığını bilemeyiz ilerleme çubuklarını) ama benim tahminim onsuz orada bu dezavantajları vardır.


Final discussion based on comments:

Bir tarayıcı ile, seni açıklayan davranış olsun. Ve (bu gibi düşük seviyeli ağrı hata ayıklama için yararlı) bu kıvrılma komutla birlikte, o da işe yaramazsa:

curl --trace-ascii trace0.txt "http://dmpwap.net/playmp3.php?b=128&file=Red_Hot_Chili_Peppers_-_15_-_Fortune_Faded.mp3" > test0.mp3

Ben 0 byte olsun, benim iz görüyoruz:

manoa:~ stu$ cat trace0.txt == Info: About to connect() to dmpwap.net port 80 (#0)
== Info:   Trying 64.191.50.69... == Info: connected
== Info: Connected to dmpwap.net (64.191.50.69) port 80 (#0)
=> Send header, 213 bytes (0xd5)
0000: GET /playmp3.php?b=128&file=Red_Hot_Chili_Peppers_-_15_-_Fortune
0040: _Faded.mp2 HTTP/1.1
0055: User-Agent: curl/7.19.4 (universal-apple-darwin10.0) libcurl/7.1
0095: 9.4 OpenSSL/0.9.8k zlib/1.2.3
00b4: Host: dmpwap.net
00c6: Accept: */*
00d3: 
<= Recv header, 17 bytes (0x11)
0000: HTTP/1.1 200 OK
<= Recv header, 19 bytes (0x13)
0000: Connection: close
<= Recv header, 37 bytes (0x25)
0000: Date: Fri, 11 Dec 2009 14:04:58 GMT
<= Recv header, 27 bytes (0x1b)
0000: Server: Microsoft-IIS/6.0
<= Recv header, 27 bytes (0x1b)
0000: X-Powered-By: PHP/5.2.9-2
<= Recv header, 35 bytes (0x23)
0000: Content-Transfer-Encoding: binary
<= Recv header, 26 bytes (0x1a)
0000: Content-Type: audio/mpeg
<= Recv header, 2 bytes (0x2)
0000: 
<= Recv data, 0 bytes (0x0)
== Info: Closing connection #0

But....

Ben bir --tcp-nodelay seçeneğini eklerseniz, it works just fine! Örneğin:

curl --tcp-nodelay --trace-ascii trace1.txt "http://dmpwap.net/playmp3.php?b=128&file=Red_Hot_Chili_Peppers_-_15_-_Fortune_Faded.mp3" > test1.mp3

Bu 3219104 bayt döndü. Trace.txt bu gibi görünüyor:

== Info: About to connect() to dmpwap.net port 80 (#0)
== Info:   Trying 64.191.50.69... == Info: TCP_NODELAY set
== Info: connected
== Info: Connected to dmpwap.net (64.191.50.69) port 80 (#0)
=> Send header, 213 bytes (0xd5)
0000: GET /playmp3.php?b=128&file=Red_Hot_Chili_Peppers_-_15_-_Fortune
0040: _Faded.mp3 HTTP/1.1
0055: User-Agent: curl/7.19.4 (universal-apple-darwin10.0) libcurl/7.1
0095: 9.4 OpenSSL/0.9.8k zlib/1.2.3
00b4: Host: dmpwap.net
00c6: Accept: */*
00d3: 
<= Recv header, 17 bytes (0x11)
0000: HTTP/1.1 200 OK
<= Recv header, 19 bytes (0x13)
0000: Connection: close
<= Recv header, 37 bytes (0x25)
0000: Date: Fri, 11 Dec 2009 13:56:47 GMT
<= Recv header, 27 bytes (0x1b)
0000: Server: Microsoft-IIS/6.0
<= Recv header, 27 bytes (0x1b)
0000: X-Powered-By: PHP/5.2.9-2
<= Recv header, 35 bytes (0x23)
0000: Content-Transfer-Encoding: binary
<= Recv header, 26 bytes (0x1a)
0000: Content-Type: audio/mpeg
<= Recv header, 2 bytes (0x2)
0000: 
<= Recv data, 1258 bytes (0x4ea)
0000: ID3.......TENC.......Lavf52.23.1...d.... ..=....w......oq......0
   ...  {many lines}
0180: UUUUUU
== Info: Closing connection #0

Ben herhangi bir sorun ile şarkı (3m21s, stereo, MPGA, 48kHz, 128kbps) dinleyebilirsiniz.

Yani, benim teori akışında ardışık 0x00 bayt olduğundan, müşteriler "OK, I got 0x00, 0x00...and nothing else has been sent, the connection must be over." düşünüyorsun Ama kıvırmak istemci üzerinde set --tcp-nodelay seçeneği ile, olmaz olmasıdır.

My candidate solution: sakatlar en azından bu dönüştürme isteği bağlantıları için Nagel's algorithm (set TCP soket seçenekleri üzerinde hiçbir gecikme) sunucu tarafı. Bu benim bırakılan bağlantıları lider şüpheli tamponlama önleyecektir.