2011-11-29 121 views
8

Vì vậy, tôi đang làm việc trên một dự án php và một phần của nó là lấy một url video youtube và chèn nó vào một thẻ video html5. Tôi đã sử dụng một cuộc gọi curl đến http://youtube.com/get_video_info?video_id=XXX và nhận được các url tệp video phù hợp trên máy cục bộ của tôi.lấy URL video youtube từ curl hoặc get_video_info

Tuy nhiên, khi tôi tải mã của mình lên máy chủ web của mình và cố gắng chạy mã, không có URL video nào hoạt động. Các url có vẻ tốt nhưng một số thông số, như IP, nơi khác nhau. Tôi không thể hiểu tại sao nó hoạt động từ máy địa phương của tôi chạy xampp hoặc mamp nhưng không phải trên máy chủ web của tôi. Tôi thậm chí đã cố gắng chỉ làm một curl trên trang video youtube và nhận thấy rằng tại địa phương, nó sẽ sản lượng trang và chơi video nhưng trên máy chủ web của tôi, tất cả các cuộc gọi video có 404s.

Mọi thông tin về điều này? Dù sao tôi có thể lấy một url video youtube để tôi có thể chơi video youtube trong một thẻ video html5? Đây có phải là lý do tại sao keepvid và các trang web như vậy sử dụng applet java chết tiệt?

+0

Vì bạn đang nhận được 404, những gì URL được sử dụng? Bạn có thể đăng một số mã ví dụ để tìm nạp thông tin và dữ liệu phù hợp không? – drew010

+0

YouTube không cho phép bạn làm những việc như vậy? –

+0

Nó thực sự là một 403, bạn có thể nhìn thấy nó trong URL này: http://oo.preferred.iad09s12.v5.lscache8.c.youtube.com/videoplayback?sparams=id,expire,ip,ipbits,itag,source , ratebypass, cp & fexp = 907911,914060,916201 & itag = 43 & ip = 208.0.0.0 & chữ ký = 1810EA75ADD7E30581426A5262C030CF82348A98.5C2D5385C0DD8FCFCF46EF43BD7223C894825DB6 & SVER = 3 & ratebypass = yes & source = youtube & hết hạn = 1322629200 & key = yt1 & ipbits = 8 & cp = U0hRR1ZNV19FSkNOMV9OR0FDOlBIZnZ0Zl9jdXNF & id = 1c8acc21e379b6d1 & quality = vừa & fallback_host = tc.v5.cache8.c.youtube.com & type = video/webm – iwek

Trả lời

-3

lẽ cào YouTube không phải là một ý tưởng tốt, bạn nên có một cái nhìn vào API chính thức: http://code.google.com/apis/youtube/overview.html

"Dữ liệu API" dường như những gì bạn cần.

+1

API YouTube là nơi tôi đã xem trước và tôi không thấy việc truy xuất URL vào các tệp video theo cách chúng được cung cấp với http://youtube.com/get_video_info?video_id=XXX – iwek

10

Bạn nên xem qua dự án youtube-dl Tôi khá chắc chắn bạn có thể thực hiện một số ý tưởng để hiểu cách thích hợp để đạt được mục tiêu của mình.

+0

Ok, tôi vừa kiểm tra nó và thử nghiệm nó và nó hoạt động tuyệt vời nhưng tôi tự hỏi làm thế nào họ làm điều đó. Tôi không biết python, họ có sử dụng get_video_info không? – iwek

+0

Nếu bạn không biết python, tôi đoán bạn biết [grep] (http://en.wikipedia.org/wiki/Grep) hoặc [ack] (http://betterthangrep.com/);) –

+0

Ok, sử dụng grep Tôi thấy rằng họ sử dụng get_video_info và nó rất giống với mã php của tôi. Nói cách khác, url họ cung cấp các công trình cục bộ nhưng không cung cấp trên máy chủ. Vì tệp tải xuống trên máy chủ, tôi cho rằng đây là sự cố với IP của trình duyệt. Tại địa phương trình duyệt của tôi là giống như máy địa phương của tôi, nhưng đây không phải là trường hợp khi tôi sử dụng trình duyệt của tôi để nhấn một trang từ máy chủ của tôi. Vì vậy, URL là chính xác cho máy chủ của tôi, đó là lý do tại sao nó hoạt động và tải xuống, nhưng là người dùng cuối, url đó là không chính xác. Bất kỳ ý tưởng nào khác? – iwek

6

Tôi đã tạo một tập lệnh bằng PHP để phát trực tuyến video trên youtube đến các phòng khám gần đây và tôi nghĩ bằng cách thay đổi một chút tập lệnh của tôi có thể phù hợp với mục đích của bạn.

Đây là kịch bản PHP của tôi:

<?php 
@set_time_limit(0); //disable time limit to make sure the whole video is streamed to the client 
$id = $_GET['id']; //the youtube video ID 
$type = $_GET['type']; //the MIME type of the desired format 

parse_str(file_get_contents('http://www.youtube.com/get_video_info?video_id='.$id),$info); //get video info 
$streams = explode(',',$info['url_encoded_fmt_stream_map']); //split the stream map into streams 

foreach($streams as $stream){ 
    parse_str($stream,$real_stream); //parse the splitted stream 
    $stype = $real_stream['type']; //the MIME type of the stream 
    if(strpos($real_stream['type'],';') !== false){ //if a semicolon exists, that means the MIME type has a codec in it 
     $tmp = explode(';',$real_stream['type']); //get rid of the codec 
     $stype = $tmp[0]; 
     unset($tmp); 
    } 
    if($stype == $type && ($real_stream['quality'] == 'large' || $real_stream['quality'] == 'medium' || $real_stream['quality'] == 'small')){ //check whether the format is the desired format 
     header('Content-type: '.$stype); //send the HTTP headers 
     header('Transfer-encoding: chunked'); //necessary for streaming 
     @readfile($real_stream['url'].'&signature='.$real_stream['sig']); //send the content to the client 
     ob_flush(); //disable PHP caching 
     flush(); //flush the content out 
     break; 
    } 
} 
?> 

Tôi hy vọng nó có thể giúp bạn.

P.S. Bạn cần phải gửi nội dung từ máy chủ vì URL video khác nhau tùy theo ISP.

+0

Nó hoạt động nhưng bất cứ ai có mã tương tự trong pascal/delphi? – Artem

2

Liên kết mà bạn trích xuất chỉ hoạt động cho địa chỉ IP mà từ đó bạn trích xuất. Vì vậy, nếu bạn trích xuất nó từ máy địa phương của bạn, nó sẽ làm việc trong trình duyệt trên máy tính của bạn. Tuy nhiên, nếu bạn trích xuất nó từ máy chủ của bạn, chỉ có máy chủ mới có thể truy cập tệp video từ liên kết đó.

1

Bạn có thể sử dụng mã này để tải về youtube video:

<?php 
$id='5HDw7sQE2H0'; 
$dt=file_get_contents("http://www.youtube.com/get_video_info?video_id=$id&el=embedded&ps=default&eurl=&gl=US&hl=en"); 
$x=explode("&",$dt); 
$t=array(); $g=array(); $h=array(); 
echo "<pre>\r\n"; 
foreach($x as $r){ 
    $c=explode("=",$r); 
    $n=$c[0]; $v=$c[1]; 
    $y=urldecode($v); 
    $t[$n]=$v; 
} 
$streams = explode(',',urldecode($t['url_encoded_fmt_stream_map'])); 
foreach($streams as $dt){ 
    $x=explode("&",$dt); 
    foreach($x as $r){ 
     $c=explode("=",$r); 
     $n=$c[0]; $v=$c[1]; 
     $h[$n]=urldecode($v); 
    } 
    $g[]=$h; 
} 
print_r($g); 
echo "\r\n</pre>"; 
?> 
+1

mã trên không hoạt động nữa. – Hassaan

+0

bạn có thể cần phải thêm chữ ký cho nó để làm việc – LZH

+0

Trên dòng 10, '$ y' không bao giờ được sử dụng. Tôi nghĩ những gì bạn muốn viết cho dòng 11 là '$ t [$ n] = urldecode ($ v)'. Hay đúng hơn, '$ table [$ name] = urldecode ($ value)', gây ra ai có một khẩu súng vào đầu bạn, buộc bạn phải sử dụng các tên biến một chữ cái khủng khiếp? –

0

Bạn chỉ có thể xây dựng một URL nhúng từ ID video

Ưu điểm lớn ở đây là bạn có thể thêm các thông số của riêng bạn để người chơi theo yêu cầu.

Ví dụ một src iframe,

http://www.youtube.com/embed/ {$ video_id}? Theme = ánh sáng & autoplay = 1 & ...

Các vấn đề liên quan