<p>FFmpeg is a powerful framework for manipulating audiovisual files. Unfortunately, it also has a steep learning curve, especially for users unfamiliar with the command line. This app helps users through the bash command generation process so that more people can reap the benefits of the FFmpeg library. </p>
<p>This project is very much a work in progress. Each button displays a form to help fulfill a popular user request. To use, click on the button and fill out the form. After clicking the Generate button, a command line will appear in the box below. That line can be copied and pasted into a Terminal, with the assumption that the video file is located in the same directory that the user currently is in.</p>
<p>For FFmpeg basics, check out their <ahref="https://www.ffmpeg.org/">official website.</a></p>
<p>For bash and command line basics, try the <ahref="http://cli.learncodethehardway.org/book/">Command Line Crash Course</a></p>
<spandata-toggle="modal"data-target=".example"><buttontype="button"class="btn btn-default"data-toggle="tooltip"data-placement="bottom"title="Displays information about a media file">Sample example</button></span>
<p>This is all about info! This is all about info! This is all about info! This is all about info! This is all about info! This is all about info! This is all about info! This is all about info! This is all about info! This is all about info! This is all about info! This is all about info! This is all about info! This is all about info! </p>
<spandata-toggle="modal"data-target=".wav_to_mp3"><buttontype="button"class="btn btn-default"data-toggle="tooltip"data-placement="bottom"title="Converts WAV to MP3">WAV to MP3</button></span>
<spandata-toggle="modal"data-target=".batch_processing"><buttontype="button"class="btn btn-default"data-toggle="tooltip"data-placement="bottom"title="FFMPEG batch processing within a single folder">Batch processing</button></span>
<p>Re-wrap .MFX files in a specified directory to .mov files by using this code within a .sh file. The shell script (.sh file) and all MXF files must be contained in the same directory, and the script must be run from the directory itself (cd ~/Desktop/MXF_file_directory). Execute .sh file with the command <code>sh Rewrap-MXF.sh</code></p>
<ul>
<li>-acodec copy (copy audio codec)</li>
<li>-vcodec copy (copy video codec)</li>
</ul>
<p>Modify the ffmpeg script as needed to perform different transcodes :)</p>
<spandata-toggle="modal"data-target=".create_frame_md5s"><buttontype="button"class="btn btn-default"data-toggle="tooltip"data-placement="bottom"title="This will create an md5 checksum per frame">Create frame md5s</button></span>
<spandata-toggle="modal"data-target=".to_prores"><buttontype="button"class="btn btn-default"data-toggle="tooltip"data-placement="bottom"title="This will transcode to deinterlaced Apple ProRes LT">Transcode to ProRes</button></span>
<p>This command transcodes an input file (input.mov) into a deinterlaced Apple ProRes LT .mov file with 16-bit linear PCM encoded audio. The file is deinterlaced using the yadif (Yet Another De-Interlacing Filter) command.</p>
<ul>
<li>ffmpeg: Calls the program ffmpeg</li>
<li>-i: Tells ffmpeg to expect an input file</li>
<li>[inputfile]: Specifies the name and location of the file you want to transcode into ProRes</li>
<li>-vcodec prores: Tells ffmpeg to transcode the video stream into Apple ProRes</li>
<li>-profile:v 1: Declares profile of Apple ProRes you want to use. The profiles are explained below:</li>
<ul>
<li>0 : ProRes422 (Proxy)</li>
<li>1 : ProRes422 (LT)</li>
<li>2 : ProRes422 (Normal)</li>
<li>3 : ProRes422 (HQ)</li>
</ul>
<li>-acodec pcm_s16le: Tells ffmpeg to encode the audio stream in 16-bit Linear PCM</li>
<li>-vf yadif: Runs a deinterlacing video filter (yet another deinterlacing filter) on the new file</li>
<li>[output.mov]: Specifies the name, location, and extension of the new ProRes file</li>
<spandata-toggle="modal"data-target=".one_thumbnail"><buttontype="button"class="btn btn-default"data-toggle="tooltip"data-placement="bottom"title="Export one thumbnail per video file">One thumbnail</button></span>
<spandata-toggle="modal"data-target=".multi_thumbnail"><buttontype="button"class="btn btn-default"data-toggle="tooltip"data-placement="bottom"title="Export many thumbnails per video file">Many thumbnails</button></span>
<p>This will grab a thumbnail every minute and output sequential png files.</p>
<ul>
<li>ffmpeg: calls the program</li>
<li>-i for input</li>
<li>-ss 00:00:20: seeks video file to 20 seconds into the video</li>
<li>-f image2: Forces the file format. image2 is an image file demuxer</li>
<li>-vf fps=fps=1/60: -vf is an alias for -filter:v, which creates a filtergraph to use for the streams. The rest of the command identifies filtering by frames per second, and sets the frames per second at 1/60 (which is one per minute).</li>
<li>out%d.png: Names the output file. The %d is a regular expression that adds a number (d is for digit) and increments with each frame (out1.png, out2.png, out3.png…)</li>
<spandata-toggle="modal"data-target=".pull_specs"><buttontype="button"class="btn btn-default"data-toggle="tooltip"data-placement="bottom"title="Pull specs from video file">Pull specs</button></span>
<p>ffmpeg documentation on ffprobe (full list of flags, commands, <ahref="https://www.ffmpeg.org/ffprobe.html">https://www.ffmpeg.org/ffprobe.html</a>) </p>
<spandata-toggle="modal"data-target=".join_files"><buttontype="button"class="btn btn-default"data-toggle="tooltip"data-placement="bottom"title="Concatenate two or more files into a single file">Join files together</button></span>
<p>This command takes two or more files of the same filetype and joins them together to make a single file. All that the program needs is a list specifying the files that should be concatenated. However, it only works if the files to be combined have the exact same codec and technical specifications. </p>
<p>ffmpeg documentation on concatenating files (full list of flags, commands, <ahref="https://trac.ffmpeg.org/wiki/Concatenate">https://trac.ffmpeg.org/wiki/Concatenate</a>) </p>
<ul>
<li>ffmpeg: calls the program</li>
<li>-f: forces the input file format</li>
<li>concat: ffmpeg’s concatenate command</li>
<li>-i: tells ffmpeg to expect input files</li>
<li>mylist.txt: a text file indicating the list of files to be concatenated. Should be formatted as:</li>
<li>-c copy: specifies the encoder for the output file by telling the program to copy the codecs of the original files and use them for the output file</li>
<li>[output]: desired filename for the output file</li>
<spandata-toggle="modal"data-target=".excerpt_from_start"><buttontype="button"class="btn btn-default"data-toggle="tooltip"data-placement="bottom"title="Create an excerpt, starting from the beginning of the file">Excerpt from beginning</button></span>
<p>This command captures a certain portion of a video file, starting from the beginning and continuing for the amount of time (in seconds) specified in the script. This can be used to create a preview file, or to remove unwanted content from the end of the file. To be more specific, use timecode, such as 00:00:05. </p>
<ul>
<li>ffmpeg: Calls the program ffmpeg</li>
<li>-i: Tells ffmpeg to expect input files</li>
<li>[input file]: Specifies the location of the file you want to capture a clip from</li>
<li>-t 5: Tells ffmpeg to stop copying from the input file after a certain time, and specifies the number of seconds after which to stop copying. In this case, 5 seconds is specified</li>
<li>-c copy: Specifies the encoder for the output file by telling ffmpeg to copy the codecs of the original file and use them for the new output file</li>
<li>[output]: Specifies the filename and location for the new file</li>
</ul>
</div>
</div>
</div>
</div>
<!-- ends Excerpt from beginning -->
<!-- Excerpt from middle -->
<spandata-toggle="modal"data-target=".excerpt_from_middle"><buttontype="button"class="btn btn-default"data-toggle="tooltip"data-placement="bottom"title="Capture five seconds from the middle of a video file">Excerpt from middle</button></span>
<p>This command captures a certain portion of a video file, starting from a designated point in the file and taking an excerpt as long as the amount of time (in seconds) specified in the script. This can be used to create a preview or clip out a desired segment. To be more specific, use timecode, such as 00:00:05. </p>
<ul>
<li>ffmpeg: Calls the program ffmpeg</li>
<li>-i: Tells ffmpeg to expect input files</li>
<li>[input file]: Specifies the location of the file you want to capture a clip from</li>
<li>-ss 5: Tells ffmpeg what timecode in the file to look for to start copying, and specifies the number of seconds into the video that ffmpeg should start copying. To be more specific, you can use timecode such as 00:00:05</li>
<li>-t 5: Tells ffmpeg to stop copying from the input file after a certain time, and specifies the number of seconds after which to stop copying. In this case, 5 seconds is specified</li>
<li>-c copy: Specifies the encoder for the output file by telling ffmpeg to copy the codecs of the original file and use them for the new output file</li>
<li>[output]: Specifies the filename and location for the new file</li>
</ul>
</div>
</div>
</div>
</div>
<!-- ends Excerpt from middle -->
<!-- Excerpt to end -->
<spandata-toggle="modal"data-target=".excerpt_to_end"><buttontype="button"class="btn btn-default"data-toggle="tooltip"data-placement="bottom"title="Create a new video file with the first five seconds trimmed off the original">Excerpt to end</button></span>
<p>This command copies a video file starting from a specified time, removing the first few seconds from the output. This can be used to create an excerpt, or remove unwanted content from the beginning of a video file.</p>
<ul>
<li>ffmpeg: Calls the program ffmpeg</li>
<li>-i: Tells ffmpeg to expect input files</li>
<li>[input file]: Specifies the location of the file you want to capture a clip from</li>
<li>-ss 5: Tells ffmpeg what timecode in the file to look for to start copying, and specifies the number of seconds into the video that ffmpeg should start copying. To be more specific, you can use timecode such as 00:00:05</li>
<li>-t 5: Tells ffmpeg to stop copying from the input file after a certain time, and specifies the number of seconds after which to stop copying. In this case, 5 seconds is specified</li>
<li>-c copy: Specifies the encoder for the output file by telling ffmpeg to copy the codecs of the original file and use them for the new output file</li>
<li>[output]: Specifies the filename and location for the new file</li>
<spandata-toggle="modal"data-target=".split_audio_video"><buttontype="button"class="btn btn-default"data-toggle="tooltip"data-placement="bottom"title="Create separate audio and video tracks from an audiovisual file">Split audio and video tracks</button></span>
<p>This command splits the original input file into a video and audio stream. The -map command identifies which streams are mapped to which file. To ensure that you’re mapping the right streams to the right file, run ffprobe before writing the script to identify which stream is 0:0, which is 0:1, etc. </p>
<ul>
<li>ffmpeg: calls the program</li>
<li>-i: tells ffmpeg to expect input file</li>
<li>[input file]: the file you want to split</li>
<li>-map 0:0: tells ffmpeg to grab one of the streams, and identifies the first stream (stream 0:0) to map</li>
<li>[video output file]: desired filename for the video output file</li>
<li>-map 0:1: tells ffmpeg to grab one of the streams, and identifies the second stream (stream 0:1) to map</li>
<li>[audio output file]: desired filename for the audio output file</li>
<p>Made with ♥ at <ahref="http://wiki.curatecamp.org/index.php/Association_of_Moving_Image_Archivists_%26_Digital_Library_Federation_Hack_Day_2015">AMIA #AVhack15</a></p>