2016-11-30 6 views
-1

私はUstreamサイトの別のバージョンからビデオをダウンロードしようとしています。このサイトは、明らかにDRM保護に使用されています。実際には、このサイトからのログインを経ずにこのビデオを見ることはできません。 ビデオシステムは、ustream(同じリンク)で同じものを使用する必要があります。つまり、x秒ごとに異なるflvチャンクを呼び出し、ストリームにマージします(rtmpサービスに似ていますが、このプロトコルは使用しません)。ストリームサイトからの.flvチャンク

私はこのビデオを構成するすべての.flvチャンクをダウンロードすることができましたが、それらを1つのファイルにマージする際に問題がありました。まず最初に、これらのflvファイルにはオーディオ/ビデオのラグ/問題がありますが、このビデオをダウンロードする方法は他にありませんので、ラグについては不平を言っていません。

実際の問題は、すべてのflvファイルが通常のサイズを持っているにもかかわらず、継続時間が増加していることです。動画の再生時間は約6秒ですので、最初のチャンクは6秒、2番目のチャンクは12秒です(残りの6個は「破損しています」)。私は(ffmpegまたはビデオ結合ソフトウェアで)これらのファイル(約600-700、1時間15分の合計時間)をマージしようとすると、最初の2つのセクションだけが表示され、その後何も見えません。 (最初の2つのチャンクをマージしようとすると、ファイルの長さは18秒、最初の12のファイルは見えます;最初の3つのチャンクをマージしようとすると、ファイルの長さは36秒になります。最初の12秒間)

誰でも知っていますか?

+0

スタックオーバーフローはプログラミングに関する質問のみのため、コードを表示する必要があります。 – LordNeckbeard

+0

あなたが質問を読んだのかどうかはわかりませんが、表示するコードはありません。私が尋ねたのは、flvチャンクを類似した/同一の環境(後続するすべてのチャンクが前のチャンクの持続時間をもたらす)でマージする方法でした。マージコマンドはデフォルトです。私の問題はチャンクの実際の時間を取得することです。私は.flvファイルごとにトリミングすることを考えましたが、700個のファイルがあり、最後のものから1時間マイナス6秒をトリミングする必要があります。 – Iztooi

+0

@Iztooiはffmpeg "merge"コマンドを少なくとも表示します。たぶんそれは間違って使用されています。たとえば、2〜3つのflvをどのようにマージしますか? 2つの連続したチャンクの例題へのリンクがありますか?各チャンクが別々のflvヘッダーを持っているか、そのタイムスタンプがどのように見えるかを確認する必要があります。基本的には、チャンク1が6秒のタイムスタンプで終了する場合、チャンク2はゼロのタイムスタンプを持つ最初のフレームを持つことができません。そのような場合は、チャンク2のflvヘッダーを削除し、各フレームのタイムスタンプを編集して6秒以上にする必要があります。あなたのコーディング言語はバイト編集を処理しますか?あるいは、ffmpegの 'genpts'コマンドを試してみてください。 –

答えて

0

FLVチャンクを確認しました。タイムスタンプは実際にはです。

短いバージョン:
チャンク1には不要なFLVヘッダーがあります。それを削除し、Chunk-0の最後にデータを貼り付けます。いくつかのHex Editorツールでそれを行うか、コーディング言語(PHP?Java?C++?あなたの質問にタグを付けなかった)で各ファイルを自動修正するための基本的なユーティリティを書いてください。

コードを避けるには、FFmpegだけを使用して、各FLVチャンク内に含まれるビデオとオーディオ部分を抽出してみてください。たとえば:

ffmpeg -i chunk1.flv -c:v copy chunk1.h264 //to get video 
ffmpeg -i chunk1.flv -c:a copy chunk1.aac //to get audio 
  • は一つの大きなH264ビデオファイルに別のビデオファイル(H264)をマージします。
  • 個別のオーディオファイル(aac)を1つの大きなAACオーディオファイルに結合します。
  • ビデオファイル&に、オーディオファイルをFLVまたはMP4コンテナのいずれかとして結合します。

ロングバージョンは:

問題は、両方のチャンクはFLVヘッダ(各ファイルの最初の13バイト)を有することです。
Chunk-1は次の6秒間のFLVファイルを提供するビデオの単なる続きであるため、Chunk-0だけがヘッダーを必要とします。

問題を視覚化するには、FLVの内部を見てみましょう。図示のように、余分なバイトを削除した後、ちょうどの残りのチャンク-1バイトをチャンク0の末尾に貼り付け、working FLVファイルのために再保存することができます。

だから、簡単なロジックでユーティリティをコーディングするプログラミング言語を使用します、チャンク-0ではありません各昇順チャンク番号について

その最初の13の バイトを削除し、残りのペーストChunk-0.flvの終わりに。

大量のChunk-0 FLVファイルが完全に再生されるまで、各チャンクを繰り返します。

テストでは、無料の16進エディターソフトウェアを使用してチャンクを手動で編集できます。 WindowsではHxDを使用します。上の画像はそれからつかまれます。

  • 開きチャンク1に六角エディタ
  • における両方のチャンクだけ& を(12までの範囲0)FLVヘッダの最初の13のバイトを削除(ハイライト)を選択します。ヘッダーは、スロット0で46で始まり、スロット12で00で終了します。
  • 次のバイトは09(ビデオフレーム)で始まります。あなただけ(「すべて選択」と)...チャンク-1の代わりに最後に現在の46 4C 56 01 etc etc
  • の上記バイトを始めたい
  • 09 00 25 FF 00 17 etc etcのように見えますすべてのチャンク-1バイトとペーストそれらをカットチャンク0の終わりのバイト。 新しいFLVとしてを保存して再生を試みます。それが動作します!!

これはworking FLVの結果です。

+1

あなたの答えをありがとう。私の質問はflvファイルの奇妙な振る舞いが何であるかを知ることでした。それはヘッダーの13バイトの「不必要」でした。だから:あなたのリンクは動作しませんが、私はプロセスを再現し、同じファイルであると信じているものを得ることができました。私はオーディオビデオ抽出を使用しないかもしれません。なぜなら、私は実際には専門家ではないかもしれないからです。私は別のサイト/ビデオから別のFLVファイルをコンカットコマンドとマージしたことを思い出しています。私はそこに何か似たものがあると思っていましたが、あなたはすべてのバイトを一つのファイルにコピーしなければならないので、 – Iztooi

関連する問題