2017-06-27 4 views
0

私はffmpegを使って.mkvと.mkaファイルを.mp4ファイルにマージしています。現在のコマンドは次のようになります。MKVとMKAファイルをmuxしてブラウザで再生するにはどうすればよいですか?

ffmpeg -i video.mkv -i audio.mka output_path.mp4 

オーディオとビデオファイルは、Amazon S3から事前に署名されたURLです。十分なリソースを持つサーバーであっても、このプロセスは非常に遅くなります。私はffmpegに各フレームの再エンコードをスキップするように指示できる状況を研究しましたが、私の状況では実際には各フレームを再エンコードする必要があると思います。

私は2つのサンプルファイルを自分のMacBook Proにダウンロードし、自宅経由でローカルにffmpegをインストールしました。私は、コマンド

ffmpeg -i video.mkv -i audio.mka -c copy output.mp4 

を実行すると、私は次のような出力が得られます。

ffmpeg version 3.3.2 Copyright (c) 2000-2017 the FFmpeg developers 
    built with Apple LLVM version 8.1.0 (clang-802.0.42) 
    configuration: --prefix=/usr/local/Cellar/ffmpeg/3.3.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --disable-lzma --enable-vda 
    libavutil  55. 58.100/55. 58.100 
    libavcodec  57. 89.100/57. 89.100 
    libavformat 57. 71.100/57. 71.100 
    libavdevice 57. 6.100/57. 6.100 
    libavfilter  6. 82.100/6. 82.100 
    libavresample 3. 5. 0/3. 5. 0 
    libswscale  4. 6.100/4. 6.100 
    libswresample 2. 7.100/2. 7.100 
    libpostproc 54. 5.100/54. 5.100 
Input #0, matroska,webm, from '319_audio_1498590673766.mka': 
    Metadata: 
    encoder   : GStreamer matroskamux version 1.8.1.1 
    creation_time : 2017-06-27T19:10:58.000000Z 
    Duration: 00:00:03.53, start: 2.831000, bitrate: 50 kb/s 
    Stream #0:0(eng): Audio: opus, 48000 Hz, stereo, fltp (default) 
    Metadata: 
     title   : Audio 
Input #1, matroska,webm, from '319_video_1498590673766.mkv': 
    Metadata: 
    encoder   : GStreamer matroskamux version 1.8.1.1 
    creation_time : 2017-06-27T19:10:58.000000Z 
    Duration: 00:00:03.97, start: 2.851000, bitrate: 224 kb/s 
    Stream #1:0(eng): Video: vp8, yuv420p(progressive), 640x480, SAR 1:1 DAR 4:3, 30 tbr, 1k tbn, 1k tbc (default) 
    Metadata: 
     title   : Video 
[mp4 @ 0x7fa4f0806800] Could not find tag for codec vp8 in stream #0, codec not currently supported in container 
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument 
Stream mapping: 
    Stream #1:0 -> #0:0 (copy) 
    Stream #0:0 -> #0:1 (copy) 
    Last message repeated 1 times 

だから、私が働いている特定のエンコーディングは、私は互換性がないと考えているVP8ビデオや作品オーディオファイル、あることが表示されます.mp4出力コンテナを使用します。私はvp8とopusを.mp4出力に最適にマージする方法をカバーしている答えに感謝します。答えはvp8 & opusと互換性のある出力メディアフォーマットの方向で私を指し示し、私はバイパスできるようにウェブとモバイルデバイスで再生できます再エンコードのステップをすべて完了します。

EDIT:

ちょうどLordNeckbeardのアドバイスに従った後のベンチマークを提供したかった:

4 min 41 second video transcoded locally on my mac 

LordNeckbeard’s approach : 15 mins 55 seconds (955 seconds) 
Current approach : 18 mins 49 seconds (1129 seconds) 

18% speed increase 
+2

入力フォーマットがMP4出力コンテナと互換性がある場合は、単にmuxに '-c copy'を追加して再エンコードを避けてください。はるかに速くなります。 – LordNeckbeard

+0

@ LordNeckbeardその結果、コマンドはffmpeg -i video.mkv -c copy -i audio.mka -c copy output_path.mp4になります。また、.mp4はMPEG-4で、.mkvと.mkaはMatroskaですので、互換性がないと思います。私はそこに間違っていますか? – Robert

+0

私はffmpeg -i video.mkv -i audio.mka -c copy output.mp4を使用してドキュメントに従ってコピーしようとしましたが、0バイトのファイルを書き込んでいます。 – Robert

答えて

4

あなたがこのようなWebブラウザ互換性のある形式にMUXへffmpegを使用し、および/または再エンコードMKVとMKAすることができますWebmまたはMP4。

WebMのマルチプレクサ:入力フォーマットがVorbisのかオーパスオーディオ

とVP8/VP9ビデオであれば、あなたの入力はVP8またはVP9ビデオとVorbisのかオーパスオーディオある場合は、ちょうどそのような中、入力として、WebMのにマルチプレクサ・することができますあなたの質問。 stream selection行動は、ストリームタイプごとに一つのストリームを選択することです

ffmpeg -i video.mkv -i audio.mka -c copy output.webm 

デフォルトあなたがミスを防ぐために選択するストリームそれを伝えることができ-mapとなるよう、:それは再エンコードをしませんので、これは高速である必要があります。例えば、両方の入力が複数のストリームが含まれていますが、あなただけaudio.mkaからvideo.mkvから最初のビデオストリームと最初のオーディオストリームにする場合:

ffmpeg -i video.mkv -i audio.mka -map 0:v:0 -map 1:a:0 -c copy -movflags +faststart output.webm 

MP4マルチプレクサ:入力フォーマットはH.264/H.265であればあなたがウェブの再生を述べたので、ビデオとAACオーディオ

ffmpeg -i video.mkv -i audio.mka -c copy -movflags +faststart output.mp4 
  • -movflags +faststartが追加されました。これにより、ビデオがクライアントによって完全にダウンロードされる前に再生が開始されます。

WebMの再エンコード:入力フォーマットは、WebMの

との互換性がない場合は、再エンコードする必要があります:

ffmpeg -i video.mkv -i audio.mka -c:v libvpx-vp9 -crf 33 -b:v 0 -c:a libopus output.webm 
  • VP9は本当に遅いです。代わりにVP8を使用したい場合は、-c:v libvpxを使用してください。詳細はFFmpeg Wiki: VP8FFmpeg Wiki: VP9を参照してください。

  • libopusサポートがない場合は、代わりにlibvorbisを使用してください。

MP4再エンコード:入力フォーマットはMP4ビデオの

ffmpeg -i video.mkv -i audio.mka -c:v libx264 -crf 23 -preset medium -c:a aac -movflags +faststart output.mp4 
  • -preset-crf有する制御品質と符号化速度と互換性がない場合。詳細は、FFmpeg Wiki: H.264FFmpeg Wiki: AACを参照してください。

  • ターゲットデバイスがサポートするH.264プロファイルに制限がある場合は、-profile:v mainまたは-profile:v baselineを追加できます。スクリプト

    ため

ffprobeあなたはこれを自動化するスクリプトを作成することができます。 ffprobeは、フォーマットを決定するために使用することができる。

$ ffprobe -loglevel error -select_streams v:0 -show_entries stream=codec_name -of csv=p=0 video.mkv 
h264 
$ ffprobe -loglevel error -select_streams a:0 -show_entries stream=codec_name -of csv=p=0 audio.mka 
aac 

ffprobe出力は、IF/then文の変数として使用することができます。

+0

これは素晴らしい答えです。私はあなたの再エンコードソリューションをすぐに試してみるつもりです。 vp8やopusと互換性があり、ウェブやモバイルでも再生可能な出力フォーマットを知っていますか?理想的には、効率の向上が劇的に見えるので、コピー手法を使用したいと思います。 – Robert

+0

@ロバート私はあなたがウェブの再生を望んでいなかったこと、あるいは最初にMP4が必要な理由を知らなかった。私は少し答えを更新します。 VP8/VP9ビデオとOpusをwebmに入れることができます。 FirefoxとChromeで少なくとも再生可能である必要があります。 – LordNeckbeard

+0

私はもっと具体的にすべきでした、私は謝罪します。それは素晴らしい解決策のように聞こえる。それを楽しみにしています! – Robert

関連する問題