यदि अन्य लोग इस पर आते हैं और देखना चाहते हैं कि इस समाधान में वास्तविक कोड क्या है, तो मैं यहां अपना कोड पोस्ट कर रहा हूं। मैं क्रोमकास्ट अनुरोध के लिए एसडी कार्ड से वीडियो फ़ाइल स्ट्रीम करने के लिए अपने एंड्रॉइड डिवाइस का उपयोग कर रहा हूं। इस कोड का उपयोग करके, मैं बीच में स्ट्रीम शुरू करने में सक्षम हूं और/या स्ट्रीम में किसी विशिष्ट स्थान की तलाश कर रहा हूं।
@Override
@SuppressWarnings("deprecation")
public Response serve(String uri, Method method, Map<String, String> headers, Map<String, String> params, Map<String, String> files) {
String mimeType = getMimeType();
String currentUri = getCurrentUri();
if (currentUri != null && currentUri.equals(uri)) {
String range = null;
Log.d(TAG, "Request headers:");
for (String key : headers.keySet()) {
Log.d(TAG, " " + key + ":" + headers.get(key));
if ("range".equals(key)) {
range = headers.get(key);
}
}
try {
if (range == null) {
return getFullResponse(mimeType);
} else {
return getPartialResponse(mimeType, range);
}
} catch (IOException e) {
Log.e(TAG, "Exception serving file: " + filePath, e);
}
} else {
Log.d(TAG, "Not serving request for: " + uri);
}
return new Response(Response.Status.NOT_FOUND, mimeType, "File not found");
}
private Response getFullResponse(String mimeType) throws FileNotFoundException {
cleanupStreams();
fileInputStream = new FileInputStream(filePath);
return new Response(Response.Status.OK, mimeType, fileInputStream);
}
private Response getPartialResponse(String mimeType, String rangeHeader) throws IOException {
File file = new File(filePath);
String rangeValue = rangeHeader.trim().substring("bytes=".length());
long fileLength = file.length();
long start, end;
if (rangeValue.startsWith("-")) {
end = fileLength - 1;
start = fileLength - 1
- Long.parseLong(rangeValue.substring("-".length()));
} else {
String[] range = rangeValue.split("-");
start = Long.parseLong(range[0]);
end = range.length > 1 ? Long.parseLong(range[1])
: fileLength - 1;
}
if (end > fileLength - 1) {
end = fileLength - 1;
}
if (start <= end) {
long contentLength = end - start + 1;
cleanupStreams();
fileInputStream = new FileInputStream(file);
//noinspection ResultOfMethodCallIgnored
fileInputStream.skip(start);
Response response = new Response(Response.Status.PARTIAL_CONTENT, mimeType, fileInputStream);
response.addHeader("Content-Length", contentLength + "");
response.addHeader("Content-Range", "bytes " + start + "-" + end + "/" + fileLength);
response.addHeader("Content-Type", mimeType);
return response;
} else {
return new Response(Response.Status.RANGE_NOT_SATISFIABLE, HTML_MIME_TYPE, rangeHeader);
}
}
क्या आप अपना कोड साझा करना चाहते हैं? मैं एक ऐप बनाने की तलाश में हूं जो इनपुट इनपुट से वीडियो स्ट्रीम करता है, और मुझे यह देखना अच्छा लगेगा कि मैं आपके कोड से कोई पॉइंटर्स प्राप्त कर सकता हूं या नहीं। मुझे आपकी मदद के लिए आपको एक उपहार देने के लिए खुशी होगी। अग्रिम में धन्यवाद! –
एक इनपुटस्ट्रीम से स्ट्रीमिंग वीडियो वास्तव में समस्या पर मेरा पहला शॉट था, लेकिन जब ऐसा लगता है कि मैंने एंड्रॉइड के मीडिया प्लेयर पर इसे आजमाया था, तो यह वास्तव में इनपुट पट्टी() विधियों का उपयोग करके इनपुटस्ट्रीम का उपभोग नहीं कर रहा है, बल्कि यह केवल इनपुट स्ट्रीम को संदर्भ – josephus
के रूप में उपयोग करता है आप वास्तव में मेरे प्रश्न के लिंक से नैनो एचटीपीडी सर्वर कोड का उपयोग कर सकते हैं, और अधिकांश खिलाड़ियों से वीडियो स्ट्रीम करने के लिए यह आपके लिए पर्याप्त काम करना चाहिए। मेरा मामला विशिष्ट था, हालांकि मुझे क्लाइंट को डेटा लिखने से पहले कुछ बाइट मैनिपुलेशन करने की ज़रूरत थी। – josephus