নোড.জেএস ব্যবহার করে এইচটিএমএল 5 ক্লায়েন্টের কাছে ffmpeg এর রিয়েল টাইম আউটপুট প্রবাহের সর্বোত্তম উপায়টি বোঝার চেষ্টা করার জন্য আমি সত্যিই আটকে আছি, কারণ প্লেটিতে বেশ কয়েকটি ভেরিয়েবল রয়েছে এবং এই জায়গাতে আমার অনেক অভিজ্ঞতা নেই, বিভিন্ন সংমিশ্রণ চেষ্টা করে বেশ কয়েক ঘন্টা ব্যয় করেছেন।
আমার ব্যবহারের কেসটি হ'ল:
1) আইপি ভিডিও ক্যামেরা আরটিএসপি এইচ .264 স্ট্রিমটি এফএফএমপিইগ দ্বারা গ্রহণ করা হয় এবং নোডে নিম্নলিখিত এফএফএমপিইগ সেটিংস ব্যবহার করে স্টুডউটে আউটপুট ব্যবহার করে একটি এমপি 4 পাত্রে রিম্যাক্স করা হয়। এটি কেবলমাত্র প্রাথমিক ক্লায়েন্ট সংযোগে চালিত হয়, যাতে আংশিক সামগ্রীর অনুরোধগুলি আবার এফএফএমপিইগকে স্প্যান করার চেষ্টা না করে।
liveFFMPEG = child_process.spawn("ffmpeg", [
"-i", "rtsp://admin:12345@192.168.1.234:554" , "-vcodec", "copy", "-f",
"mp4", "-reset_timestamps", "1", "-movflags", "frag_keyframe+empty_moov",
"-" // output to stdout
], {detached: false});
2) আমি STDOUT ক্যাপচার করতে নোড http সার্ভার ব্যবহার করি এবং ক্লায়েন্টের অনুরোধের পরে ক্লায়েন্টের কাছে ফিরে যেতে পারি। যখন ক্লায়েন্টটি প্রথম সংযুক্ত হয় আমি উপরের এফএফএমপিইগ কমান্ড লাইনটিকে স্প্যান করি তারপরে STDOUT স্ট্রিমটি HTTP প্রতিক্রিয়াতে পাইপ করি।
liveFFMPEG.stdout.pipe(resp);
আমি এইচটিটিপি প্রতিক্রিয়াতে এফএফএমপিইগ ডেটা লিখতে স্ট্রিম ইভেন্টটিও ব্যবহার করেছি তবে কোনও তফাত হয় না
xliveFFMPEG.stdout.on("data",function(data) {
resp.write(data);
}
আমি নিম্নলিখিত HTTP শিরোলেখ ব্যবহার করি (যা প্রাক-রেকর্ডকৃত ফাইলগুলি স্ট্রিম করার সময়ও ব্যবহৃত হয় এবং কাজ করা হয়)
var total = 999999999 // fake a large file
var partialstart = 0
var partialend = total - 1
if (range !== undefined) {
var parts = range.replace(/bytes=/, "").split("-");
var partialstart = parts[0];
var partialend = parts[1];
}
var start = parseInt(partialstart, 10);
var end = partialend ? parseInt(partialend, 10) : total; // fake a large file if no range reques
var chunksize = (end-start)+1;
resp.writeHead(206, {
'Transfer-Encoding': 'chunked'
, 'Content-Type': 'video/mp4'
, 'Content-Length': chunksize // large size to fake a file
, 'Accept-Ranges': 'bytes ' + start + "-" + end + "/" + total
});
3) ক্লায়েন্টকে এইচটিএমএল 5 ভিডিও ট্যাগ ব্যবহার করতে হবে।
স্ট্রিমিং প্লেব্যাক নিয়ে আমার কোনও সমস্যা নেই (20s এইচটিটিপি আংশিক সামগ্রী সহ fs.createReadStream ব্যবহার করে) উপরের FFMPEG কমান্ড লাইনের সাথে রেকর্ড করা একটি ফাইল ফাইল (তবে STDOUT এর পরিবর্তে কোনও ফাইলে সংরক্ষণ করা হয়েছে), তাই আমি এফএফএমপিইগ স্ট্রিমটি জানি সঠিক, এবং HTTP নোড সার্ভারের সাথে সংযোগ করার সময় আমি ভিএলসি-তে সরাসরি লাইভ স্ট্রিমিংটি দেখতে পাচ্ছি see
তবে এফএফএমপিইগ থেকে নোড এইচটিটিপি-র মাধ্যমে সরাসরি প্রবাহিত করার চেষ্টা করা আরও শক্ত বলে মনে হচ্ছে কারণ ক্লায়েন্টটি একটি ফ্রেম প্রদর্শন করবে তারপরে থামবে। আমার সন্দেহ হয় যে সমস্যাটি হ'ল আমি এইচটিটিপি সংযোগটি এইচটিএমএল 5 ভিডিও ক্লায়েন্টের সাথে সামঞ্জস্য করতে সেট আপ করছি না। আমি এইচটিটিপি 206 (আংশিক সামগ্রী) এবং 200 টি প্রতিক্রিয়া ব্যবহার করে ডেটা বাফারে রাখার পরে ভাগ্যবিহীন স্ট্রিমিংয়ের মতো বিভিন্ন জিনিস চেষ্টা করেছি, তাই আমি এটিকে সঠিকভাবে স্থাপন করছি তা নিশ্চিত করার জন্য আমাকে প্রথম নীতিগুলিতে ফিরে যেতে হবে উপায়।
এটি কীভাবে কাজ করা উচিত তা সম্পর্কে আমার বোঝার জন্য, আমি ভুল হলে দয়া করে আমাকে সংশোধন করুন:
1) এফএফএমপিইগকে আউটপুট টুকরো টুকরো করে সেট করতে হবে এবং একটি ফাঁকা মুভ ব্যবহার করতে হবে (এফএফএমপিইজি ফ্রেজ_কিফ্রেম এবং খালি_মুভ মুভ ফ্ল্যাগ)। এর অর্থ ক্লায়েন্টটি মুভ অ্যাটম ব্যবহার করে না যা সাধারণত ফাইলের শেষে থাকে যা স্ট্রিমিংয়ের সময় প্রাসঙ্গিক নয় (ফাইলের শেষ নেই), তবে এর অর্থ কোনও সম্ভাবনা নেই যা আমার ব্যবহারের ক্ষেত্রে উপযুক্ত।
2) যদিও আমি এমপি 4 খণ্ডগুলি এবং খালি এমওওভি ব্যবহার করি, তবুও আমাকে এইচটিটিপি আংশিক সামগ্রী ব্যবহার করতে হবে, কারণ এইচটিএমএল 5 প্লেয়ার খেলার আগে পুরো স্ট্রিমটি ডাউনলোড না হওয়া পর্যন্ত অপেক্ষা করবে, যা কোনও লাইভ স্ট্রিম দিয়ে কখনই শেষ হয় না তাই অকার্যকর।
3) আমি বুঝতে পারি না যে HTTP প্রতিক্রিয়াতে STDOUT স্ট্রিমটি পাইপ করা এখনও কেন লাইভ স্ট্রিমিংয়ের সময় কাজ করে না যদি আমি কোনও ফাইল সংরক্ষণ করি তবে এই ফাইলটি এই জাতীয় কোড ব্যবহার করে এইচটিএমএল 5 ক্লায়েন্টগুলিতে সহজেই স্ট্রিম করতে পারি। এফএফএমপিইজি স্পোন শুরু হতে, আইপি ক্যামেরার সাথে সংযোগ স্থাপন করতে এবং নোডে খণ্ডগুলি প্রেরণ করতে, এবং নোডের ডেটা ইভেন্টগুলিও অনিয়মিত হওয়ার কারণ এটি একটি সময়সীমার সমস্যা হতে পারে। তবে উপস্থাপনাটি কোনও ফাইলে সংরক্ষণের মতোই হওয়া উচিত এবং এইচটিটিপি-র বিলম্বের জন্য উপযুক্ত হওয়া উচিত।
4) ক্যামেরা থেকে এফএফএমপিইগ দ্বারা নির্মিত একটি এমপি 4 ফাইল স্ট্রিমিং করার সময় এইচটিটিপি ক্লায়েন্টের নেটওয়ার্ক লগটি পরীক্ষা করার সময়, আমি দেখতে পাই 3 টি ক্লায়েন্টের অনুরোধ: ভিডিওটির জন্য একটি সাধারণ জিইটি অনুরোধ, যা এইচটিটিপি সার্ভারটি প্রায় 40Kb ফেরায়, তার পরে একটি আংশিক ফাইলের শেষ 10 কে এর জন্য বাইট সীমা সহ সামগ্রীর অনুরোধ, তারপরে মাঝের বিটগুলির জন্য একটি চূড়ান্ত অনুরোধ লোড হয়নি। সম্ভবত এইচটিএমএল 5 ক্লায়েন্টটি প্রথম প্রতিক্রিয়াটি পেয়ে গেলে এমপি 4 এমওওভি পরমাণুটি লোড করার জন্য ফাইলের শেষ অংশটি জিজ্ঞাসা করছে? যদি এটি হয় তবে এটি স্ট্রিমিংয়ের জন্য কাজ করবে না কারণ সেখানে এমওওভি ফাইল নেই এবং ফাইলটির শেষ নেই।
5) লাইভ স্ট্রিম করার চেষ্টা করার সময় নেটওয়ার্ক লগটি পরীক্ষা করার সময়, আমি প্রায় 200 বাইট পেয়েছি, তবে পুনরায় অনুরোধটি 200 বাইটের সাথে বাতিল এবং তৃতীয় অনুরোধ যা কেবল 2K দীর্ঘ। আমি বুঝতে পারছি না যে এইচটিএমএল 5 ক্লায়েন্ট কেন অনুরোধটি বাতিল করে দেবে কারণ রেকর্ডকৃত ফাইল থেকে স্ট্রিমিংয়ের সময় আমি সাফল্যের সাথে ব্যবহার করতে পারি বাইটাস্টিমটি ঠিক একই। এটি নোড ক্লায়েন্টের কাছে বাকি এফএফএমপিইগ স্ট্রিমটি প্রেরণ করছে না বলে মনে হয়, তবুও আমি .on ইভেন্টের রুটিনে এফএফএমপিইগ ডেটা দেখতে পাচ্ছি যাতে এটি এফএফএমপিইগ নোড এইচটিটিপি সার্ভারে পাওয়া যায়।
)) যদিও আমি মনে করি এইচটিটিপি রেসপন্স বাফারে এসটিডিউট স্ট্রিমটি পাইপ করা উচিত, তবে কি আমাকে একটি মধ্যবর্তী বাফার এবং প্রবাহ তৈরি করতে হবে যা HTTP আংশিক সামগ্রী ক্লায়েন্টের অনুরোধগুলিকে যথাযথভাবে কাজ করতে দেয় যখন এটি (সফলভাবে) কোনও ফাইল পড়ে ? আমি মনে করি এটিই আমার সমস্যার মূল কারণ তবে আমি নোডে ঠিক জানি না যে কীভাবে সেরা সেট আপ করা যায়। এবং ফাইলের শেষ নেই বলে ফাইলের শেষে কোনও ক্লায়েন্টের অনুরোধটি কীভাবে পরিচালনা করতে হয় তা আমি জানি না।
7) আমি কি 206 টি আংশিক সামগ্রী অনুরোধগুলি পরিচালনা করার চেষ্টা করে ভুল পথে চলেছি এবং এটি কি 200 টি এইচটিটিপি প্রতিক্রিয়া নিয়ে কাজ করা উচিত? এইচটিটিপি 200 প্রতিক্রিয়াগুলি ভিএলসির পক্ষে ঠিক কাজ করে তাই আমার সন্দেহ হয় যে এইচটিএমএল 5 ভিডিও ক্লায়েন্ট কেবল আংশিক সামগ্রী অনুরোধের সাথে কাজ করবে?
যেহেতু আমি এই জিনিসটি এখনও এই সমস্যার বিভিন্ন স্তর (এফএফএমপিইগ, নোড, স্ট্রিমিং, এইচটিটিপি, এইচটিএমএল 5 ভিডিও) এর মাধ্যমে কাজ করা কঠিন এটি শিখছি সুতরাং যে কোনও পয়েন্টার প্রশংসিত হবে। আমি এই সাইট এবং নেট নিয়ে গবেষণার জন্য কয়েক ঘন্টা ব্যয় করেছি এবং আমি নোডে রিয়েল টাইম স্ট্রিমিং করতে সক্ষম এমন কাউকেই পাইনি তবে আমি প্রথম হতে পারি না এবং আমি মনে করি এটি কাজ করতে সক্ষম হবে (একরকম) !)।
Content-Type
তোমার মাথায় রেখেছ? আপনি কি খণ্ড এনকোডিং ব্যবহার করছেন? আমি এখানেই শুরু করতাম। এছাড়াও, HTML5 এর অগত্যা কার্যকারিতা প্রবাহে, উপলব্ধ করা হয় না আপনি যে আরও পড়তে পারেন এখানে । আপনার সম্ভবত নিজস্ব উপায় ( এখানে দেখুন ) ব্যবহার করে ভিডিও স্ট্রিম বাফার এবং প্লে করার একটি উপায় বাস্তবায়নের প্রয়োজন হবে , ভেবেছিলেন এটি সম্ভবত সমর্থিত নয়। এছাড়াও মিডিয়াসোর্স এপিআইতে গুগল করুন।