web-dev-qa-db-ja.com

m4vまたはmp4ビデオファイルを開いて修復するには?

昨日私は自分の携帯電話でシーンを撮影していましたが、突然アプリケーションがクラッシュし、私が生成したm4vを開こうとするとそれが破損していると言っています。

私は自分のPCにビデオファイル(約36MB)をダウンロードし、それを開いて修復しようとしています。あなたは私にそれをする方法を提案できますか?

FFMPEG情報

コメントで示唆されているように、私はこのコマンドでそのファイルについてFFMPEGが私に言っていることをチェックしようとします

ffmpeg.exe -i VID_20120425_144739.m4v -c:v copy -c:a copy out.mp4 2> log.txt

これが結果です。

ffmpeg version N-40126-ga4b58fd Copyright (c) 2000-2012 the FFmpeg developers
  built on Apr 26 2012 03:29:50 with gcc 4.6.3
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-runtime-cpudetect --enable-avisynth --enable-bzlib --enable-frei0r --enable-libass --enable-libcelt --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-libnut --enable-libopenjpeg --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libutvideo --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      51. 47.100 / 51. 47.100
  libavcodec     54. 15.100 / 54. 15.100
  libavformat    54.  3.100 / 54.  3.100
  libavdevice    53.  4.100 / 53.  4.100
  libavfilter     2. 72.100 /  2. 72.100
  libswscale      2.  1.100 /  2.  1.100
  libswresample   0. 11.100 /  0. 11.100
  libpostproc    52.  0.100 / 52.  0.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 003fc940] moov atom not found
VID_20120425_144739.m4v: Invalid data found when processing input

最新の2行は赤で表示されます。

55
Drake

Untrunc を使用して、壊れたmp4またはm4vファイルを修復することが可能です。

この方法では以下が必要です。

  • ではないbrokenの別のビデオファイル

  • linuxインストール(私はUbuntu 12.04を使用しました)とコマンドラインを使用する基本的な能力。

これは何をすべきかです:

  1. このコマンドでいくつかの必要なライブラリをインストールします。

    Sudo apt-get install libavformat-dev libavcodec-dev libavutil-dev

  2. GithubリポジトリからUntruncのソースコードをダウンロードしてください。

    wget https://github.com/ponchio/untrunc/archive/master.Zip

  3. ソースコードを解凍します。

    unzip master.Zip

  4. 解凍されたディレクトリに移動します。

    cd untrunc-master

  5. このコマンドを使用してソースコードをコンパイルします(すべて1行)。

    g++ -o untrunc file.cpp main.cpp track.cpp atom.cpp mp4.cpp -L/usr/local/lib -lavformat -lavcodec -lavutil

    (このステップを飛ばして用意されている実行ファイルを使ってみることもできますが、うまくいきませんでした)

  6. それからあなたは実際にビデオを修正することができます。壊れたビデオと実例ビデオの両方が必要です。

    理想的には、ビデオは同じカメラからのもので、同じ解像度を持つべきです(私のものですが、それがなくてもうまくいくかもしれません)。それが少なくとも壊れたものと同じくらい長いなら(できれば大体同じであるなら)、これは助けになるかもしれません。

    Untruncを解凍してコンパイルしたフォルダでこのコマンドを実行しますが、/ path/to/...ビットを2つのビデオファイルに置き換えます。

    ./untrunc /path/to/working-video.m4v /path/to/broken-video.m4v

    それからそれは砕き、うまく行けばbroken-video_fixed.m4vと呼ばれる再生可能なファイルを作り出すべきです

それでおしまいです。

これでVLC Media Playerはファイルを再生できるはずです。しかしながら、それは間違った長さの情報を報告しているかもしれません(Untruncはこれを推測/解決しようとしますが、いつも正しくするとは限りません)。これを修正するには、他のプログラムでビデオを再エンコードしてみてください。

[Untruncを試す提案に対するslhckのコメントに感謝します。]

[この問題を解決するために、最初にUntruncをコーディングしてくれたFederico Ponchioに感謝します。]

56
sparrowt

他の誰かがこれについてつまずいた場合、私はまたsparrowtが話していたアプリを試してみたが、それは私のために動作しませんでした(私が開発者リポジトリで作成したいくつかのバグレポートを参照)。多分これはそれがmp4ファイルではなくMOVファイルではなかったからです...

私の助けとなったのはこの投稿でした: http://muzso.hu/2012/11/14/how-to-fix-a-broken-mp4-mov-video-ffmpeg-reports -moov-atom-not-found

彼らは "HDビデオ修復ユーティリティ"( http://grauonline.de/cmsimple2_6/en/?Solu​​tions:HD_Video_Repair_Utility )というプログラムにリンクしています。宝物よりはるかに安いです( http://aeroquartet.com/movierepair/repair )。彼らは、何もコストがかからないそれ以前のバージョン(バージョン1.5)があると指摘しさえしました( http://nagasoft.cn/download/videorepair1.5.Zip )!

私はバージョン1.5を使ってファイルを修復しようとしました、そしてそれは部分的に働いてもらいました。 ffmpegで再エンコードした後(エラーがいくつかありました)、音声の一部がなくなったことに気付きました。ログには(喜んでVideo Repair Utilityにはいくつかあります)、与えられた時間の後でそれ以上のオーディオの言及はありませんでした。そのままそれを取ります...

8
SimonSimCity

@sparrowtあなたの現在の指示は私の最近のUbuntu 16.10インストールではうまくいきませんでした。 untruncをコンパイル中に次のエラーが発生しました。

track.cpp: In member function ‘int Codec::getLength(unsigned char*, int)’:
track.cpp:204:40: error: ‘avcodec_alloc_frame’ was not declared in this scope
   AVFrame *frame = avcodec_alloc_frame();

untrunc リポジトリで説明したように、Ubuntuリポジトリのバージョンを使用するのではなく、libavを個別にダウンロードする必要があるかもしれません。次のコードは私のために働きました:

Sudo apt-get install unzip yasm g++ zlib1g-dev libbz2-dev
cd /tmp/
wget https://github.com/ponchio/untrunc/archive/master.Zip
unzip master.Zip
cd untrunc-master
wget http://libav.org/releases/libav-12.2.tar.xz
tar xvf libav-12.2.tar.xz
cd libav-12.2
./configure
make
cd ..
g++ -o untrunc file.cpp main.cpp track.cpp atom.cpp mp4.cpp -I./libav-12.2 -L./libav-12.2/libavformat -lavformat -L./libav-12.2/libavcodec -lavcodec -L./libav-12.2/libavresample -lavresample -L./libav-12.2/libavutil -lavutil -lpthread -lz -lbz2
./untrunc /path/to/working-video.mp4 /path/to/broken-video.mp4

これにより、broken-video_fixed.mp4という名前のファイルが作成されました。このスレッドを開始していただきありがとうございます。

7
freeseek

最近のUbuntuディストリビューションをお持ちの場合は、dockerをインストールして次のコマンドを実行できます。

docker run -v `pwd`:/vol -it synctree/untrunc /vol/GOOD-reference-file.MP4 /vol/BAD-corrupt-file.mdt

より詳しい説明については他のコメントを読んでください。

これは私にとって最速でした!

4
abourget

Untruncがあなたのファイル内のコーデックをサポートしていない場合は、16進エディタで修正することができます。

  1. 同じフォーマットの別のファイルを入手してください、私はもっと大きいものを手に入れましたが、おそらくどんな長さでもうまくいくでしょう
  2. 両方のファイルを16進エディタで開く
  3. ヘッダーなしで、 "ok"ファイルのmdatセクションを "broken"ファイルのmdatセクションに置き換えます(つまり、 'mdat'の後のバイトのみをコピーします)。
  4. そうでなければ、 'mdat'の前の4バイトがmdatセクションのサイズを指定し、現在の値は古いサイズ( "ok"ファイルのmdatセクションのサイズ)になり、新しいサイズに置き換えます( "壊れた"ファイルmdatセクションサイズ)

私はそれを行うための簡単なプログラムをコーディングしてしまいました。 https://github.com/golimarrrr/fix-3gp

プログラムと手動で16進エディタを使用すると、同じ固定ファイルが作成されるはずです。

2
golimar