H264ビデオストリームを再エンコードせずに、ffmpegで.MTSファイル(AVCHD)を.mp4に変換するにはどうすればよいですか?


20

注:少し前に、このコミュニティをまだ見つけていないときに、同じ質問をstackoverflowに投稿しました。質問はこのコミュニティにより適しているため、これを再投稿します。

1.試したこと

AVCHDカメラで再録音されたいくつかの.MTS(AVCHD形式)ファイルがあります。その仕様は次のとおりです。

$ ffprobe 140612_Canon-00000.MTS 
ffprobe version 2.2.1 Copyright (c) 2007-2014 the FFmpeg developers
(snip)
Input #0, mpegts, from '140612_Canon-00000.MTS':
  Duration: 00:48:58.40, start: 0.800300, bitrate: 5563 kb/s
  Program 1 
    Stream #0:0[0x1011]: Video: h264 (High) (HDMV / 0x564D4448), 
      yuv420p, 1440x1080 [SAR 4:3 DAR 16:9], 
      29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, 
      stereo, fltp, 256 kb/s

フレームレート/タイムベースの部分に注意してください:29.97 fps、29.97 tbr、90k tbn、59.94 tbc

今、私はしたいのですが、再エンコードH264ビデオストリームせずに、.MP4ファイルにこのファイルを変換し、一方、AACへのオーディオストリームをトランスコード。そこで、次のコマンドを試しました。

ffmpeg -i 140612_Canon-00000.MTS -t 60 -y -vcodec copy -acodec libfaac -ab 128k 140612_Canon-00001.MTS.mp4

2.結果

出力ファイルの仕様は次のとおりです。

$ ffprobe 140612_Canon-00000.MTS.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '140612_Canon-00000.MTS.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf55.33.100

  Duration: 00:01:00.04, start: 0.021333, bitrate: 4590 kb/s

    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 
        1440x1080 [SAR 4:3 DAR 16:9], 4448 kb/s, 
        59.94 fps, 59.94 tbr, 90k tbn, 59.94 tbc (default)
    Metadata:
      handler_name    : VideoHandler

    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 
        48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

:フレームレート/タイムベースの部分を見て59.94 fpsの、59.94 TBR、90K TBN、59.94 TBC。ffmpegはビデオストリームをコピーしただけですが、フレームレートとタイムベースはvalueの2倍に変更されました

したがって、QuickTime PlayerまたはVLC Playerで出力ファイルを開いて再生すると、オーディオに問題はありませんが、ビデオストリームは正しく再生されません。ビデオは、フレームを前後に繰り返し揺らしながら再生されます。

3.質問

  1. H264ビデオストリームを正しく再エンコードせずに、ffmpegで.MTSファイル(AVCHD)を.mp4変換するにはどうすればよいですか?
  2. コンテナとそのスイッチを変換するときに元のフレームレート/タイムベース値(fps / tbr / tbn / tbc)保持するにはどうすればよいですか。ffmpeg-vcodec copy
  3. ビデオストリームを再エンコードせずに、ffmpegのコマンドラインオプションでフレームレート/タイムベース値(fps / tbr / tbn / tbc)設定するにはどうすればよいですか。

何か案は?


4. -r 29.97オプションの追加

Sparkles教授は私にアドバイスを与えました-r 29.97。私はそれを試しました:

ffmpeg -i 140612_Canon-00001.MTS -t 60 -r 29.97 -y -vcodec copy -acodec libfaac -ab 128k 140612_Canon-00001.MTS.mp4

ただし、出力ファイルにはまだ間違ったフレームレート/タイムベースがあります。

Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 
1440x1080 [SAR 4:3 DAR 16:9], 4448 kb/s, 
59.94 fps, 59.94 tbr, 11988 tbn, 59.94 tbc (default)

5. MP4Boxを使用したRemux

Sparkles教授のアドバイスによると、MP4Boxを使用してdemuxとremuxを試しました。

brew install mp4box

ffmpeg -i 140612_Canon-00000.MTS -t 60 -y \
  -vcodec copy -an 140612_Canon-00000.MTS.h264

ffmpeg -i 140612_Canon-00000.MTS -t 60 -y \
  -vn -acodec libfaac -ab 128k 140612_Canon-00000.MTS.aac

mp4box -add 140612_Canon-00000.MTS.h264:fps=29.97 \
  -add 140612_Canon-00000.MTS.aac \
  -new 140612_Canon-00000.MTS.mp4

出力は次のとおりです。

$ ffprobe 140612_Canon-00000.MTS.mp4

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '140612_Canon-00000.MTS.mp4':
(snip)
  Duration: 00:02:00.22, start: 0.000000, bitrate: 2293 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), 
          yuv420p, 1440x1080 [SAR 4:3 DAR 16:9], 2228 kb/s, 
          29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
    Metadata:
      creation_time   : 2014-07-14 00:38:23
      handler_name    : 140612_Canon-00000.MTS.h264:fps=29.97
       - Imported with GPAC 0.5.0-rev4065

    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, 
          stereo, fltp, 125 kb/s (default)

少し先に見えます。:フレームレート/タイムベースの部分を見て29.97 fpsで、29.97 TBR、30K TBN、59.94 TBC。(コンテナからのタイムベース値)を除きtbn、これらは元のストリームと一致します。

ただし、Quicktime PlayerまたはVLCで出力ファイルを再生すると、ビデオは半分の速度で再生されます。

元のファイルには90k tbn(90000ティック/秒)があり、MP4Boxからの新しい出力ファイルには元のファイルの30k tbn3分の1の値しかありませんが、出力ファイルは半分の速度で再生されます。

理由はわかりません。しかし、残りの問題は、tbn値を調整する方法だと思います。


5-b。出力ファイルに関するMediaInfoのレポート

5. MP4Boxを使用してRemuxによって生成された出力ファイルに対してMediaInfoツールも試しました。出力はこちら:https : //gist.github.com/kaorukobo/c5ab9eaa413dff6cd26a


6. avconvを試す

Volodya avconvはうまく機能したと報告しました。また、同じカメラで記録された短いサンプルムービーファイル(Canon-00006.MTS)を用意しました。さて、試してみましょう:

brew install avconv
avconv -i Canon-00006.MTS -c:a copy -c:v copy -y Canon-00006.MTS.mp4
ffprobe Canon-00006.MTS.mp4

出力ファイルのffprobe情報はこちら:https ://gist.github.com/kaorukobo/5b53244ade2632ff1211 およびそのフレームレート/タイムベース情報は次のとおりです:59.94 fps、59.94 tbr、90k tbn、59.94 tbc

Volodyaが報告したように出力ファイルはVLC Playerでうまく再生されました。ただし、Quicktime Player Xで開くと、ビデオは通常の速度で再生されましたが、フレームが後ろに繰り返し揺れ動きました。


7.「無料のAVCHD to MOV」アプリが機能する理由

私は私の以前のコメントで述べたのMOVへの無料AVCHDアプリの「再ラップMOVへ」機能は、それがないMP4なく、MOVを行っていても、うまくいきました。

ソフトウェアは独自のffmpeg(またはavconv)プログラムを内部的に呼び出し、どのオプションが渡されるかを見ました。以下に示すとおりです。

/Applications/Free AVCHD to Mov.app/Contents/Resources/bin/com.geranium-soft.convert \
  -i /path/to/140710_Canon-00003.MTS \
  -map 0:0 -map 0:1 -c:a libfaac -vol 256 -b:a 128k -c:v copy \
  -sn -movflags faststart -threads 0 -pix_fmt yuv420p -y \
  /path/to/140710_Canon-00003.mov

-t 60ffmpegプログラムに同じオプション(抜粋は同じ。出力コンテナタイプをMOVに設定し、スイッチも削除しました。)を渡して変換しました。しかし、結果はこれまでに報告されたものと同じでした。

とにかく、このすばらしいアプリは、「。mp4」および「ffmpegで」を除いて、「H264ビデオストリームを再エンコードせずに.MTSファイル(AVCHD)を.mp4に変換する方法」の問題を解決しました。しかし、私はまだそのアプリがうまくいくのに興味がありますが、ffmpegはそうではありません。


「正しく」とはどういう意味ですか?たぶんそれをタイトルから削除してください。お手伝いしたいのですが、ffmpegを使用したことはありません。Adobeツールのメディアエンコーダーを使用しています。
eLouai

@eLouaiわかりました、タイトルを修正しました。
カオルコボ

回答:


8

あなたの質問の本文で他のユーティリティについて議論し始めたことを見て、私はあなたがffmpegに固執するのではなく、仕事を成し遂げることに興味があると仮定します。

libavとMTSでの経験では、フレームレートに問題はありませんでした。ファイルは完全に削除されます。

ファイルの1つで次のことを試みました。

avconv -i 00174.MTS -c:a copy -c:v copy 00174.mp4

結果のMP4ファイルはVLCで正しく再生されました。

私のファイルはプログレッシブMTSで、インターレースはありませんが、必要に応じて、さらにチェックすることができます。

ファイルテストに関するレポート

トピックスターターは、MTSからMP4に削除されたファイルを提供できましたが、その人のマシンではQuickTime Player(バージョン不明)で再生しませんでした。ただし、その個人のVLCプレーヤーでプレイしました。

Mac OSコンピューターはありませんが、Ubuntuで試しました。UbuntuでVLC(2.0.8)およびGNOMEビデオ(以前はTotemと呼ばれていました)(3.8.2)でプレイしました。両方とも完璧にプレイします。

次に、Macを使用している友人にプレイを依頼しました。彼はMavericks(10.9.4)を使用しており、QuickTime Player 10.3(727.4)で問題なくプレイできました。

現時点では、特定のプレーヤーに問題があるか、コンピューターの構成設定に問題があるようです。また、おそらく最初に現在のバージョンを削除し、古い構成を完全に消去して、QTPの最新バージョンへの更新を試みることをお勧めします。

別の可能性

古いマシンを使用していたときに、一部のプレーヤーでビットレートの高いファイルが正しく再生されず、コンテナ固有でした。たとえば、VLCはMTSファイルの再生を拒否し、フレームを表示してから、次のフレームを1秒半だけ表示します。GNOME Videosで問題なく再生できました。しかし、それをMKVに戻すと、両方のプレイヤーはそれをかなり上手にプレイしました。これはおそらく似たような質問です。プレーヤーは、特定のコンテナー(この場合はMP4)を、十分なCPU時間を必要とする方法で読み取り、それ自体が窒息し始める可能性があります。ジャーキネス効果は、CPUの処理を完了するサブプロセスに起因する可能性があり、プレーヤーは非常に急速に遅れていたすべてのフレームをダンプします。その後、不良サブプロセスが再び作動し、サイクルが続きます。

この可能性において、最善のオプションは依然としてソフトウェアのアップグレードを試みることです。現在のマルチコアプロセッサでは、実際にハードウェアを取得せずにハードウェアをアップグレードする必要性をテストすることは困難ですが、QuickTime Playerの使用中にCPU負荷を調べてVLCと比較することはおそらく可能です。QTPを使用する1つのコアで100%が表示される場合、これはおそらくこれを示しています。


avconvが彼に対して別の仕事をする可能性はかなり低いです。avconvはffmpegのフォークであり、ffmpegはavconvプロジェクトからの多くのコミットをffmpegにマージしています。そのような主要なバグ修正はffmpegに存在する可能性があります。
PTS

@ProfessorSparklesここで機能したという事実は、そうでなければ信じるのに十分な根拠だと思います。カオルコボの言うことを待ちます。
v010dya 14

@Volodya情報をありがとう。私は質問にavconvを試してレポートを追加しました。
カオルコボ14

@kaorukobo「フレームを後ろ向きに繰り返し揺らしながら」とはどういう意味ですか?出力が揺れたり、何らかの方法で前後にジャンプしますか?
v010dya 14

@Volodyaあなたの表現は正しいと思います。百聞は一見に如かず。作成したCanon-00006.MTS.mp4をfiledropper.com/canon-00006mtsにアップロードしました。 気にしない場合は、VLCではなくQuickTime Player(Macをお持ちの場合)でそのファイルを再生してみてください。
カオルコボ14

5

このffmpegバグごとに

インターレースH.264パケットが分割され、MP4 STTSが発生する

インターレースH.264を含むmpeg-tsをmp4に再多重化すると、各ビデオフレームの両方のフィールドが別々のパケットに分割されます。Mediainfoなどのソフトウェアは、STTSを使用してフレームレートを決定します。25fpsではなく50fpsと表示されます

ここで報告されるフレームレートの不一致は、ffmpegが仕様に従ってインターレースMP4ストリームを多重化した結果であるようです。各フィールドは1つのパケットに分割されます。したがって

「MP4ファイルのサンプルカウントを使用してフレームレートを決定するソフトウェアは、単に間違っています。」コメント7

フィールドペアを1つのアクセスユニットにマージするとMPEG-4仕様に違反するため、パッチは適用されません。したがって、同じことを行うエンコーダーも同様です。

以下のような多重化された出力は、PotplayerおよびVLCで正常に再生されることに注意してください。

    ffmpeg version N-76741-g8eadabf Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 5.2.0 (GCC)

Input #0, mpegts, from '00007.MTS':
  Duration: 00:00:07.01, start: 1.033367, bitrate: 15935 kb/s
  Program 1 
    Stream #0:0[0x1011]: Video: h264 (High) (HDMV / 0x564D4448), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, 5.1(side), fltp, 448 kb/s
    Stream #0:2[0x1200]: Subtitle: hdmv_pgs_subtitle ([144][0][0][0] / 0x0090), 1920x1080
[mp4 @ 054cf020] Codec for stream 0 does not use global headers but container format requires global headers
Output #0, mp4, to '00007.MTS.mp4':
  Metadata:
    encoder         : Lavf57.16.100
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 29.97 fps, 29.97 tbr, 90k tbn, 90k tbc
    Stream #0:1: Audio: aac ([64][0][0][0] / 0x0040), 48000 Hz, 5.1(side), fltp, 128 kb/s
    Metadata:
      encoder         : Lavc57.15.100 aac
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (ac3 (native) -> aac (native))
Press [q] to stop, [?] for help
[mp4 @ 054cf020] Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly
[mp4 @ 054cf020] pts has no value
    Last message repeated 209 times
frame=  420 fps=0.0 q=-1.0 Lsize=   12478kB time=00:00:07.01 bitrate=14564.2kbits/s    
video:12458kB audio:6kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.111239%
[aac @ 052fd480] Qavg: 64863.176

4

を使用して、元のフレームレートを適用しようとする場合があり-r 29.97ます。FFmpegはおそらく何らかの理由でフレームレートを調整しようとしています。それ以外の場合、構文は正しいため、そのエラーは発生しません。

3番目の質問について。単に不可能です。フレームを個別にエンコードするコーデックを使用する場合はフレームを省略できますが、h264には当てはまりませんが、このようなコーデックでもビデオストリームを何らかの方法で変更できます。同じことがフレームレートの増加にも当てはまります。計算されたフレームを追加するか、いくつかのフレームを複製する必要があります。

編集:以下のコメントからの追加情報について。完全に新しいファイルを書き込まずにフォーマットヘッダーに書き込まれたデータを変更する必要がある場合は、おそらく16進エディターで変更する必要があります。FFmpegには、ストリームデータを含まないメタデータを変更するオプションのみがあります。ファイル内で変更を行う方法と場所は、コンテナ形式によって異なります。

別のオプションは、コンテナをデマックスし、オプションを指定してビデオとオーディオのストリームを新しいコンテナにリマックスすることです。どれだけ指定できるかは、コンテナの形式によって異なります。この場合、MP4Boxツールが役立つ場合があります。この場合、次の構文を使用して生のビデオストリームを新しいmp4に多重化するときにフレームレートを指定できます。

MP4Box -add input.h264:fps=29.97 -new output.mp4

ありがとう。-t 60スイッチ、しないフレームレートを指定するオプションであるが、持続時間処理($ ffmpeg -h|grep -- -t- > -t duration record or transcode "duration" seconds of audio/video
kaorukobo

ああ、それは別のエンコーダーでした、そのエラーでごめんなさい。
PTS

回答の編集を参照してください。
PTS

再度、感謝します。質問を編集して、アドバイスを試して結果を追加しました。残念ながら、問題はまだそこにありました。
kaorukobo14年

3番目の質問に対する回答については、「値」だけでなく、ビデオストリームのフレームレートを変更したい場合には問題ありません。ただし、私の場合は、"set framerate/timebase values"container / codec-streamのヘッダーに置かれた値を書き換えるだけです。どうして?対処すべきいくつかのケースがあります:いくつかのエンコーダー(例:Apple Compressorのh264トランスコーダー)が誤ったタイムベース値(tbc)をビデオストリームに注入するケース、およびffmpegが間違ったフレームレート/タイムベース値を注入するこの質問のようなケース元の動画ファイルのものとは異なります。
カオルコボ14

2

これは古い質問であることは知っていますが、フィードで再びポップアップ表示されるため、私にとっては新しいものです。(-:

言及されていないことの1つは、フィールドの順序です。これはインターレースファイルであるため、考慮事項です。OPは、「前後に揺れる」フレームに言及しますが、これは常に誤ったフィールド順序のフラグです。ビデオが「震える」以外は問題ない場合は、ffmpegで「トップフィールドファースト」を強制するために必要なものを追加してみてください。私は、ffmpegの詳細に十分な知識がなく、そのための正確なフラグを提供していません。


私はあなたの答えでいくつかのffmepgコマンドを実行してみてください。しかし、私のffmpegバージョン2.2.1には、フィールドの順序を処理するオプションがないようです。試しましたffmpeg -h|egrep 'field|first'が、何も表示されません。ffmpegの以前のバージョン(0.8.6)には、-topそれを処理できるオプションがありました。
カオルコボ

@kaorukoboインターネットはこれを提供しています:-vf "fieldorder = bff"または= tffここで、tbはそれぞれ上部と下部を指します。トップ= 1/0オプションが明らかにフィールドが書かれ、読まないされる順序を変更するために使用されます。繰り返しますが、私はffmpeg / avconvをたまにしか使用しないため、保証はありません。
ジム・マック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.