PDA

View Full Version : ایجاد یک فایل به صورت موقت برای هر فایل صوتی



پدرخوانده
یک شنبه 27 اسفند 1385, 13:32 عصر
در قسمت لیست فایلهای صوتی یک سایت داینامیک که کاربر قادر به آپلود فایل صوتی می باشد (البته اکثرا به صورت فایلهای wma هست)
در قسمت لیست فایلهای صوتی دو امکان پخش فایل و دان لود فایل را قرار داده ام
در قسمت دان لود که با استفاده از تابع header و ... قابل دان لود را به کاربر داده ام
ولیکن در قسمت پخش فایل صوتی که لینک مستقیم فایل صوتی را داده ام معمولا مشکل ایجاد می شود به این صورت که در فایرفاکس (پنجره مخصوصی که به هنگام اشاره به یک فایل می آید (که قابلیت ذخیره و یا باز کردن توسط برنامه خاص می آید) که حتی وقتی اشاره می شود که با برنامه مثلا media player فایل باز شود (و یا هر برنامه پخش صوتی دیگر) ابتدا کل فایل دان لود می شود و سپس اجرا می شود (که خوب با وجود حجم بالا فایلهای صوتی و اصلا اصل قابلیت که قرار است پخش شود متناقض است)
و در IE نیز در صورتی که نرم افزارهای مدیریت دان لودی همچون dap باشد که مدیریت را دست گرفته و اجازه باز کردن آن توسط نرم افزار پیش فرض پخش فایل صوتی (که در اینجا منظور مدیاپلیر می باشد) را ندارد ولیکن در صورتی که برنامه دان لود خاصی وجود نداشته باشد توسط مدیاپلیر به صورت آبشاری (یعنی پخش هنگام دانلود) انجام می شود
وحالا اصل مشکل
در جایی از این سایت خواندم که با استفاده از اشاره به یک فایل asx که در آن اشاره به نام فایل wma موردنظر شده شما می توانید مستقیما اشاره کنید که این فایل باید به صورت آبشاری پخش شود
لینک ذیل
http://barnamenevis.org/forum/showthread.php?t=15740
ولیکن حالا از آنجا که نام فایلهای متغیر هست و توسط کاربر به صورت داینامیک ایجاد می شود
می خواهم این فایل را به هنگام کلیک کاربر بر روی فایل ایجاد کنم و سپس توسط تابع header به آن اشاره کنم
ولیکن مشکلاتی ایجاد می شود
اگر در همان مسیر یک فایل با این پسوند قرار دهم (asx) و هر سری محتوی آن را تغییر دهم ، خوب به علت شبکه بودن و به هرحال احتمال که یقینا چندین کاربر بخواهند فایل صوتی را پخش کنند خوب مشکل ایجاد می شود
پس سراغ فایل یونیک (غیرتکراری) باید رفت و بالطبع به علت دردسرهای مدیریت آن (حذف بعد از آن و ...) سراغ شاخه موقت خود سرور رفتم ولیکن آنجا نیز توسط توابع tempnam و یا tmpfile فایلهای با پسوند tmp می سازد و مرورگر به هنگام لینک به این پسوند عمل موردنظر را در مورد محتوی فایل (asx) را انجام نمی دهد
خلاصه روشهای مختلف را امتحان کردم به جواب نرسیدم
ممنون میشم دوستان راه حلی پیشنهاد دهند ، که بتوان برای این فایلهای صوتی لینک مستقیم پخش (بدون درنظر گرفتن اینکه چه برنامه ایی در سیستم کاربر نصب هست (مثل برنامه های مدیرت دان لود و یا محیط فایرفاکس و... هست) را ارائه داد

cybercoder
یک شنبه 27 اسفند 1385, 16:26 عصر
این مشکل شما قبلا حل شده
از بافت Real استفاده کنید مثل RA (Real Audio) و RM (Real Movie)



(بدون درنظر گرفتن اینکه چه برنامه ایی در سیستم کاربر نصب هست (مثل برنامه های مدیرت دان لود و یا محیط فایرفاکس و... هست) را ارائه داد

استفاده از ActiveX که مشکلات خودشو داره

موفق باشید.

پدرخوانده
دوشنبه 28 اسفند 1385, 02:29 صبح
با تشکر از شما دوست گرامی
بنده در توضیحم تعمدا فورمت wma را آوردم که تاکید کنم حتما به این عنوان می خوام
(هرچند راجع به مقوله نوع فورمت فایلهای صوتی فورمت ra در قدیم مناسب بود و البته با استفاده از ram نیز می توانستم لینک به فایل جهت اجرای آبشاری فایل صوتی بدهیم ولیکن با توجه به کیفیت wma و همچنین مقدار فشرده گی آن که می توان به راحتی آن را کم حجمتر از ra درآورد و از همه مهمتر در سیستم عامل های ویندوز xp به راحتی توسط media player پشتیبانی می شود وکاربر نیاز به نصب برنامه اضافه ای همچون realplayer نیست (البته این مقوله در لینوکس متفاوت است (چرا که اکثریت از این نرم افزار نیز استفاده می کنند) )
ولیکن حال اصلا در نظر بگیریم یکسری فایل ra داریم و جهت اجرای آنها می خواهیم به فایل ram آنها اشاره کنیم (همانطور که می دانید فایل ram یک فایل متنی است که در حقیقت در داخل آن به فایل ra اصلی اشاره شده است (درحقیقت همان لینک فایل اصلی ra است با این پیشوند: pnm://)
مثل:
http://www.al-shia.com/html/far/10media/media.php?i_d=rah
ولیکن این فایل ram وجود نداشته و به هنگام کلیک کاربر بر روی پخش فایل صوتی موردنظر می خواهیم آن را ایجاد و سپس توسط تابع header به آن اشاره کنیم
خوب با توجه به این توضیحات و توضیحات پست قبل برای این منظور چه باید کرد؟ (درنظر داشته باشید که فایل rm وجود ندارد و به هنگام کلیک می خواهیم آن را ایجاد و سپس اجرا نماییم)


استفاده از ActiveX که مشکلات خودشو داره
به هیچ عنوان به دنبال استفاده از active-x نیستم (چرا که واقعا دردسرهای خاص خودش را دارد و ....)
منظورم این بود روشی مشابه همین روشی که عرض کردم (ایجاد یک فایل دوم متنی مثل asx و یا ram و اشاره به این فایل جهت اجرای فایل اول)

armin390
دوشنبه 28 اسفند 1385, 21:14 عصر
ولیکن حالا از آنجا که نام فایلهای متغیر هست و توسط کاربر به صورت داینامیک ایجاد می شود
می خواهم این فایل را به هنگام کلیک کاربر بر روی فایل ایجاد کنم و سپس توسط تابع header به آن اشاره کنم
ولیکن مشکلاتی ایجاد می شود
اگر در همان مسیر یک فایل با این پسوند قرار دهم (asx) و هر سری محتوی آن را تغییر دهم ، خوب به علت شبکه بودن و به هرحال احتمال که یقینا چندین کاربر بخواهند فایل صوتی را پخش کنند خوب مشکل ایجاد می شود
پس سراغ فایل یونیک (غیرتکراری) باید رفت و بالطبع به علت دردسرهای مدیریت آن (حذف بعد از آن و ...) سراغ شاخه موقت خود سرور رفتم ولیکن آنجا نیز توسط توابع tempnam و یا tmpfile فایلهای با پسوند tmp می سازد و مرورگر به هنگام لینک به این پسوند عمل موردنظر را در مورد محتوی فایل (asx) را انجام نمی دهد
چرا این کار رو به صورت مجازی انجام نمیدی؟ (مثلاً تو اسکریپتت محتویات فایل asx یا ram... + هدر های تعیین کننده ی هویت فایل رو برای هر درخواست تو خروجی نمی فرستی)
دیگه نیاز به ساختن حقیقی! فایل و حذفش هم برای هر درخواست نیست...

پ.ن: تو وب فقط خروجی ها (محتویات+هدرها) مهمن و مهم نیست که این خروجی ها چطور ایجاد میشه

پدرخوانده
سه شنبه 29 اسفند 1385, 13:20 عصر
با تشکر
خواستم اول کار به صورت مجازی این کار را انجام دهم بدین صورت که محتوی فایل asx مربوطه را در یک فایل php با دستور echo شبیه سازی کنم


echo '<asx version="3.0">';
echo '<entry>';
echo '<ref href="'.$file.'"/>';
echo '</entry>';
echo '</asx>';
ولی خوب از آنجایی که اصلا پسوند این فایل php بود و... که اصلا از پایه اشتباه بود
(چرا که باید پسوند لینک مورد اشاره حتما پسوند asx باشد)

و بعد کد زیر در در یک فایل نوشته و آدرس فایل صوتی را به آن ارسال کردم:


$tmpfname = tempnam("/tmp", "FOO");
$handle = fopen($tmpfname, "w");
fputs($handle, '<asx version="3.0">');
fputs($handle, '<entry>');
fputs($handle, '<ref href="'.$file.'"/>');
fputs($handle, '</entry>');
fputs($handle, '</asx>');
fclose($handle);

و بعد کد ذیل را دادم


$newfile = ereg_replace (".tmp", ".asx", $tmpfname);
echo '<script>window.location="'.$newfile .'"</script>';
ولیکن به علت وجود فایل در مسیر temp سرور این آدرس را قبول نمی کرد
(البته فکر می کنم اینجا را به صورت تابع header باید اشاره می کردم مثل:


header ("Content-type: audio/x-pn-realaudio");
readfile($newfile);
ولیکن اولا که با برنامه readaudio باز می کرد (چون کد مربوط به اشاره توسط مدیاپلیر یا پخش صوت دیگر را نداشتم و همین اینکه باز فایل را ابتدا دان لود می کرد) وحالا بدون توجه به برنامه پخش کننده نیز در برنامه real قادر به باز کردن این فایل نبود

ونهایتا به صورت

$toName=$tmpfname;
$toInfo=pathinfo($tmpfname);
$toInfo=pathinfo($toName);
$Ext=$toInfo['extension'];
$basepath = '../sound/';
$file = basename($toName,'.'.$Ext);
$uniqID=date('U');
$to = $basepath.$file.'_'.$uniqID.'.asx';
rename($tmpfname, $to);
echo '<script>window.location="'.$to .'"</script>';
انجام دادم در این روش در IE درست کار می کند ولی در Firefox به صورت یک فایل متنی به آن نگاه می کند و محتوی فایل موردنظر را می آورد (حالا آنکه باید این فایل را با یک برنامه صوتی پخش کند)
والبته از همه مهمتر که از شاخه temp سرور فراخوانی نشده بلکه در یکی از شاخه های سرور که مجوز رایت (نوشتن) دارد اینکار را انجام می دهد

armin390
سه شنبه 29 اسفند 1385, 14:26 عصر
خواستم اول کار به صورت مجازی این کار را انجام دهم بدین صورت که محتوی فایل asx مربوطه را در یک فایل php با دستور echo شبیه سازی کنماول کدت اضافه کن:


header('Content-type: video/x-ms-asf');
header('Content-Disposition: inline; filename=' . YOUR_FILE_NAME);

ولی خوب از آنجایی که اصلا پسوند این فایل php بود و... که اصلا از پایه اشتباه بوداشتباه نیست...


(چرا که باید پسوند لینک مورد اشاره حتما پسوند asx باشد)اگه می خوای این کار رو کنی مثلاً میتونی از وب سرورت کمک بگیری اگه از آپاچی استفاده می کنی می تونی تو شاخه مورد نظرت به کمک htaccess فایل های با پسوند asx رو به عنوان فایلی php به وب سرور بشناسونی(AddType) تا اسکریپت توش اجرا شه و برای مرورگر ارسال شه


AddType application/x-httpd-php .php .asx
ولی در این حالت هم نوع محتویات رو باید با هدر مشخص کنی تا برای مرورگرهای استاندارد مشکلی در تشخیص نوع محتویات ایجاد نشه (مثل بالا)


انجام دادم در این روش در IE درست کار می کند ولی در Firefox به صورت یک فایل متنی به آن نگاه می کند و محتوی فایل موردنظر را می آورد (حالا آنکه باید این فایل را با یک برنامه صوتی پخش کند)۱- ممکنه وب سرورت این نوع فایل رو نشناسه که باید بهش اضافه کنی
۲- اگه از اسکریپت استفاده می کنی باید نوع فایل رو با استفاده از هدر مشخص کنی
۳- ممکنه مرورگرت این نوع از فایل رو نشناسه

برای فایرفکس در ویندوز اگه ویندوز مدیا پلیر نسبه نباید مشکلی باشه (اگه نوع فایل (محتویات دریافتی) درست به مرورگر شناسونده! شده باشه)
تو فیلد آدرس تایپ کن about:plugin ببین پلاگینش فعاله...
در هر صورت باید بدونی که مرورگرهای متداول مختلف (چه استاندارد چه غیر استاندارد) چطور نوع فایل (در واقع محتویات دریافت شده) رو تشخیص میدن:
http://developer.mozilla.org/en/docs/How_Mozilla_determines_MIME_Types
http://msdn.microsoft.com/workshop/networking/moniker/overview/appendix_a.asp

پدرخوانده
پنج شنبه 02 فروردین 1386, 13:25 عصر
با تشکر از راهنمایی شما
همین یه تیکه کد


header('Content-type: video/x-ms-asf');
header('Content-Disposition: inline; filename=' . YOUR_FILE_NAME);
کلی کار ما رو راحت کرد که به معنای واقعی بدون دردسر و ایجاد فایل دیگر و فقط به صورت مجازی درست کرد

----
اتفاقا بهتر است که دوستان مخصوصا جهت پخش فایلهای صوتی بدین صورت عمل کنند
چرا که از جهت سرعت پخش مناسبتر است (به علت آبشاری پخش کردن فایل صوتی)
البته درنظر بگیرید که با توجه به سیستم عامل ویندوز و وجود مدیا پلیر (که معمولا در ویندوزها الزاما نصب است) این روش را بنده انتخاب کردم (البته در مورد لینوکس و ... می توان به نرم افزارهای مشابه دیگر همچون ریل پلیر اشاره کرد ولیکن بحث کلی بنده ایجاد فایل مجازی جهت اشاره به فایل صوتی اصلی است که آن را به صورت تیکه تیکه (آبشاری) و با استفاده از بافرینگ بخواند.
این سورس روتین مربوط به پخش فایلهای صوتی است که بنده از آن استفاده می کنم و از عملکردش راضی هستم
کافی است تا به این روتین نام فایل صوتی خود را بفرستید


$file=htmlspecialchars($HTTP_GET_VARS['file']);
$toInfo=pathinfo($file2);
$Ext=strtoupper($toInfo['extension']);
header('Content-type: video/x-ms-asf');
header('Content-Disposition: inline; filename='.basename($file).'.asx');
echo '<asx version="3.0">';
echo '<entry>';
echo '<ref href="'.$file.'"/>';
echo '</entry>';
echo '</asx>';